# Программа учебного курса: Lakehouse без магии Этот документ заменяет предыдущий черновой план и выравнивает программу с PRD из [course_prd.md](./course_prd.md). ## 1. Рамка курса **Формат:** стартовая документация + 8 практических уроков в `Jupyter Notebooks` + вспомогательные справочные материалы. **Оценка длительности:** `~12-15 часов` вдумчивой работы. **Ориентир на модуль:** в среднем `~1.5 часа`, но финальная практика может занять дольше. **Сквозной учебный кейс:** `NYC TLC Yellow Taxi Trip Records` + `Taxi Zone Lookup`. **Методика каждого урока:** `объяснение -> демонстрация -> самостоятельное повторение -> checkpoint`. **Главная цель курса:** дать студенту безопасную рабочую модель Lakehouse на локальном стенде `Spark + Trino + Iceberg + MinIO + PostgreSQL`, а не обзор всех возможных фич. ## 2. Принципы декомпозиции программы 1. Сначала студент должен научиться поднимать и диагностировать стенд, и только потом строить пайплайн. 2. Архитектурная модель `storage + catalog + compute` проходит через весь курс, а не выносится в одну "теоретическую" лекцию. 3. Весь курс строится вокруг одного датасета и одного потока `raw -> bronze -> silver`. 4. В первой версии курса основной табличный формат только один: `Iceberg`. 5. Практики про безопасность важнее "вау-фич": аккуратный `overwrite`, понимание снапшотов, воспроизводимость шагов, базовое обслуживание таблиц. 6. Темы вне PRD v1 не включаются в основной трек и остаются в backlog. ## 3. Состав учебных материалов Курс не должен состоять только из ноутбуков. Ноутбуки являются ядром практики, но вход в курс, запуск стенда и правила работы должны быть вынесены в обычную документацию, доступную до старта `Jupyter`. ### 3.1. Стартовая документация до первого ноутбука Этот слой нужен, потому что студент ещё не имеет доступа к ноутбукам, пока не поднят стенд. **Минимальный обязательный набор:** * `START_HERE.md` или аналогичный стартовый документ с маршрутом прохождения курса; * инструкция по prerequisites: `Docker`, `Docker Compose`, свободные порты, базовые команды; * пошаговый гайд по запуску стенда: `build`, `up`, проверка сервисов, открытие UI; * краткое объяснение, как пользоваться `Jupyter`, где лежат ноутбуки и как читать структуру урока; * troubleshooting по типовым проблемам старта; * инструкция по reset/restart стенда для повторного прохождения практик. **Что должен закрывать этот слой:** * студент понимает, что нужно установить и проверить до начала курса; * студент может поднять стенд без ментора; * студент знает, как попасть в `Jupyter`, `MinIO`, `Trino UI`; * студент понимает, как устроен формат уроков и что от него ожидается. ### 3.2. Практическое ядро курса Это 8 ноутбуков, в которых живут демонстрации, самостоятельные задания и checkpoints. ### 3.3. Вспомогательные материалы Кроме ноутбуков и стартового onboarding-слоя, курсу потребуются: * вспомогательные скрипты в `src/spark` и `src/trino`; * инструкции по загрузке или подготовке учебных датасетов; * краткий [glossary](./glossary.md) по терминам `storage`, `catalog`, `compute`, `table format`, `namespace`, `metadata`, `manifest`, `snapshot`, `time travel`, `schema evolution`, `compaction`, `vacuum`; * [шпаргалка](./stack_reference.md#краткая-шпаргалка) по типовым командам, адресам сервисов, ключевым путям и точкам входа (секция в `stack_reference.md`); * опционально, [заметки для ментора](./mentor_notes.md) для ведения курса с ментором. ## 4. Трассировка Learning Outcomes на модули | Learning Outcome | Основные модули | Где проверяется | | --- | --- | --- | | `LO1`. Понимание различий между `storage`, `catalog`, `compute` | 1, 2, 6 | checkpoints модулей 2 и 6 | | `LO2`. Умение поднять и диагностировать стенд | 1 | checkpoint модуля 1 | | `LO3`. Умение загрузить raw-данные и проверить схему | 3 | checkpoint модуля 3 | | `LO4`. Умение создать и заполнить `Iceberg`-таблицу | 4 | checkpoint модуля 4 | | `LO5`. Умение собрать поток `raw -> bronze -> silver` | 4, 5, 8 | checkpoints модулей 5 и 8 | | `LO6`. Умение читать одну таблицу из `Spark` и `Trino` | 6, 8 | checkpoint модуля 6 и финальная практика | | `LO7`. Умение выполнять безопасные операции с таблицей | 7, 8 | checkpoints модулей 7 и 8 | ## 5. Верхнеуровневая структура практической части ### Модуль 1. Вход в стенд и базовая диагностика **Рабочее название ноутбука:** `01_environment_and_smoke_test.ipynb` **Зачем нужен:** студент должен уметь самостоятельно поднять локальный стенд и понять, куда смотреть, если что-то не работает. **Содержание:** * запуск `docker compose build` и `docker compose up -d`; * проверка сервисов и веб-интерфейсов; * базовый smoke test для Spark; * первый обзор того, где в стенде `MinIO`, `PostgreSQL`, `Spark`, `Trino`, `Jupyter`. **Практика студента:** * запустить стенд; * проверить статусы контейнеров и основные UI; * выполнить простой smoke test и прочитать его результат. **Checkpoint:** студент подтверждает, что стенд поднят, понимает назначение сервисов и умеет сделать первичную диагностику через `docker compose ps`, логи и UI. ### Модуль 2. Ментальная модель Lakehouse: storage, catalog, compute **Рабочее название ноутбука:** `02_lakehouse_mental_model.ipynb` **Зачем нужен:** убрать магическое восприятие Lakehouse и связать новую модель с привычным миром `PostgreSQL/Greenplum`. **Содержание:** * демонстрационный проход по цепочке `Spark -> catalog -> MinIO` на маленькой demo-таблице; * что такое таблица в Lakehouse в практическом смысле; * где лежат данные, где лежат метаданные, кто выполняет вычисления; * разница между "одной базой данных" и набором согласованных компонентов; * короткие параллели с классическим DWH. **Практика студента:** * выполнить готовую демонстрационную запись через `Spark` в небольшую demo-таблицу; * найти соответствующие артефакты в `MinIO` и запись о таблице в каталоге через подготовленные диагностические шаги; * сопоставить наблюдения с ролями `storage / catalog / compute`. **Checkpoint:** студент своими словами объясняет роли `MinIO`, `PostgreSQL`, `Spark` и `Trino`, не путает физическое хранение с логической таблицей и может показать, где в стенде видны данные, метаданные и вычислитель. ### Модуль 3. Raw-данные и первое чтение в Spark **Рабочее название ноутбука:** `03_raw_ingest_and_first_read.ipynb` **Зачем нужен:** показать, как raw-данные попадают в стенд и как с ними безопасно начать работать. **Содержание:** * работа с заранее подготовленным локальным data bundle из onboarding-документации; * явная загрузка исходных `PARQUET`-файлов в raw-зону; * чтение raw-данных через Spark; * проверка схемы, типов и базового качества данных; * обсуждение того, почему raw лучше не "чинить на месте" и почему датасет не должен скачиваться "из интернета из ноутбука". **Практика студента:** * проверить состав локально полученного набора `NYC Taxi`; * загрузить его в raw-зону `MinIO`; * прочитать несколько месяцев `NYC Taxi`; * проверить схему и посчитать базовые метрики; * найти простые аномалии или проблемные значения. **Checkpoint:** студент умеет загрузить учебный набор в raw-зону, прочитать raw-данные, проверить схему и объяснить, почему raw-слой нужен как воспроизводимая точка входа. ### Модуль 4. Первая рабочая Iceberg-таблица и слой bronze **Рабочее название ноутбука:** `04_bronze_with_iceberg.ipynb` **Зачем нужен:** перейти от набора файлов к управляемой таблице и построить первый слой обработки. **Содержание:** * создание namespace и Iceberg-таблицы через Spark; * запись raw-данных в `bronze`; * осмотр структуры Iceberg на прикладном уровне: data files, metadata, snapshots; * связь `raw -> bronze` с привычным `stg/ods`-мышлением. **Практика студента:** * создать первую Iceberg-таблицу; * загрузить в неё данные из raw; * проверить результат через чтение таблицы и осмотр артефактов хранения. **Checkpoint:** студент умеет создать и заполнить Iceberg-таблицу и понимает, что таблица в Lakehouse не сводится к одному каталогу с файлами. ### Модуль 5. Слой silver и воспроизводимые трансформации **Рабочее название ноутбука:** `05_silver_layer.ipynb` **Зачем нужен:** научить строить простой, понятный и воспроизводимый pipeline `raw -> bronze -> silver`. **Содержание:** * базовые трансформации и очистка данных; * явная фиксация правил преобразования; * разделение ответственности между слоями; * проверки качества на уровне строк, схемы и агрегатов. **Практика студента:** * собрать `silver` из `bronze`; * нормализовать часть полей; * добавить простые проверки результата. **Checkpoint:** студент может воспроизводимо построить `silver` и объяснить, чем `bronze` отличается от `silver`. ### Модуль 6. Одна таблица, два движка: Spark и Trino **Рабочее название ноутбука:** `06_spark_and_trino_on_same_table.ipynb` **Зачем нужен:** закрепить идею разделения вычислительных движков и показать, что данные не нужно копировать между системами. **Содержание:** * чтение одной и той же Iceberg-таблицы из Spark и Trino; * роль общего каталога; * простые SQL-проверки в Trino; * ограничение темы: курс не уходит в глубокое сравнение движков. **Практика студента:** * записать таблицу через Spark; * прочитать ту же таблицу через Trino; * сверить результаты и ответить, почему это работает. **Checkpoint:** студент понимает, почему `Spark` может писать, а `Trino` читать ту же таблицу без копирования данных. ### Модуль 7. Безопасная работа с таблицами: schema evolution и time travel **Рабочее название ноутбука:** `07_safe_table_changes.ipynb` **Зачем нужен:** научить не ломать таблицы вслепую и пользоваться базовыми защитными механизмами. **Содержание:** * добавление и изменение схемы на базовом уровне; * влияние schema evolution на downstream-чтение; * snapshots и time travel; * разбор типовых ошибок новичка: неаккуратный `overwrite`, слепая перезапись, неявные изменения типов. **Практика студента:** * добавить новую колонку или безопасно изменить схему; * посмотреть историю snapshot-ов; * прочитать предыдущее состояние таблицы после намеренно "неудачного" изменения. **Checkpoint:** студент умеет делать базовые изменения схемы, смотреть историю таблицы и использовать time travel как страховку. ### Модуль 8. Базовое обслуживание таблиц и финальная практика **Рабочее название ноутбука:** `08_maintenance_and_final_lab.ipynb` **Зачем нужен:** завершить курс рабочим циклом поддержки таблицы и собрать все изученное в одну практику. **Содержание:** * проблема мелких файлов; * базовый `compaction`; * базовый `vacuum` / cleanup старых версий; * короткая параллель с обслуживанием `Greenplum AppendOnly`-таблиц; * финальный мини-сценарий: `raw -> bronze -> silver -> проверка через Trino -> безопасное изменение -> обслуживание`. **Практика студента:** * выполнить compaction на учебной таблице; * очистить старые версии в контролируемом сценарии; * пройти финальный end-to-end checkpoint. **Checkpoint:** студент выполняет полный учебный сценарий и может объяснить, зачем нужны compaction и cleanup в прикладной работе. ## 6. Что получает студент по итогам курса После прохождения программы студент: 1. Поднимает локальный стенд и диагностирует типовые проблемы на старте. 2. Понимает различие между `storage`, `catalog` и `compute`. 3. Умеет загрузить raw-данные и прочитать их в Spark. 4. Умеет создать и заполнить Iceberg-таблицу. 5. Умеет построить простой поток `raw -> bronze -> silver`. 6. Умеет читать одну и ту же таблицу из `Spark` и `Trino`. 7. Умеет выполнять базовые безопасные операции: schema evolution, snapshots/time travel, compaction, vacuum. ## 7. Что не входит в первую версию курса Следующие темы сознательно исключены из основного плана и могут стать отдельным расширением: * `gold`-слой и полноценные бизнес-витрины; * партиционирование и `partition pruning` как отдельная обязательная тема v1; * performance tuning и физический дизайн таблиц как самостоятельный модуль; * `MERGE`, row-level deletes, update-heavy сценарии; * streaming, `Kafka`, `CDC`, `Airflow`, `NiFi`; * deep dive во внутренности `Iceberg` на уровне спецификации; * production security, governance, multi-user setup, Kubernetes и облака. Существующие demo-артефакты по партиционированию в репозитории считаются legacy-материалами и не входят в обязательный трек первой версии курса. ## 8. Следующий уровень детализации После утверждения этой структуры следующий документ должен описывать не "темы вообще", а каркас учебных артефактов: 1. состав стартовой документации и порядок чтения до первого запуска, включая получение data bundle; 2. список ноутбуков и их точные learning objectives; 3. обязательные демонстрации, самостоятельные задания и checkpoints по каждому уроку; 4. набор вспомогательных `src/spark` и `src/trino`-скриптов, включая загрузку датасета и диагностические шаги для модуля 2; 5. правила сброса стенда и повторного прохождения практик.