Files
mini-lakehouse-lab/docs/course_program.md

315 lines
25 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Программа учебного курса: Lakehouse без магии
Здесь собраны порядок модулей, ссылки на ноутбуки и результаты, по которым можно
проверить свою работу. Рамки курса и learning outcomes описаны в [course_prd.md](./course_prd.md).
## Маршрут по модулям
Перед первым уроком подготовь стенд по [START_HERE](../START_HERE.md).
Дальше проходи ноутбуки по порядку: файлы и таблицы из ранних модулей нужны в
следующих. Пауза между занятиями описана в [памятке учащегося](./study_workflow.md).
| Модуль и ноутбук | Что понадобится | Результат перед переходом дальше |
| --- | --- | --- |
| [1. Вход в стенд](../notebooks/01_environment_and_smoke_test.ipynb) | Работающий стенд | Smoke test вернул `499999500000`; ты можешь показать два worker-а и объяснить роли сервисов |
| [2. Модель Lakehouse](../notebooks/02_lakehouse_mental_model.ipynb) | Модуль 1 | Ты нашел файлы демо-таблицы в MinIO и запись каталога в PostgreSQL; выполнил очистку демо по ноутбуку |
| [3. Исходные данные](../notebooks/03_raw_ingest_and_first_read.ipynb) | [Четыре файла Taxi](../START_HERE.md#подготовка-учебного-датасета-перед-модулем-3) на хосте | Файлы загружены в raw-зону MinIO, Spark читает их; проверены схема и основные метрики |
| [4. Bronze и Iceberg](../notebooks/04_bronze_with_iceberg.ipynb) | Raw-файлы из Модуля 3 | Созданы bronze-таблица поездок и таблица зон из самостоятельного задания; видны их данные и metadata-файлы |
| [5. Silver](../notebooks/05_silver_layer.ipynb) | Обе bronze-таблицы | Создана silver-таблица, проверены правила очистки и качество результата |
| [6. Spark и Trino](../notebooks/06_spark_and_trino_on_same_table.ipynb) | Silver из Модуля 5; DBeaver по желанию | Одна таблица читается обоими движками; ты можешь объяснить, какие компоненты у них общие |
| [7. Изменения таблиц](../notebooks/07_safe_table_changes.ipynb) | Результаты предыдущих модулей | На демо-таблице проверены изменение схемы, чтение прошлого состояния и rollback; silver сохранена |
| [8. Обслуживание и финальная практика](../notebooks/08_maintenance_and_final_lab.ipynb) | Raw, bronze и silver | Проверено обслуживание таблиц; самостоятельно пройден поток от исходных файлов до чтения и проверок результата |
В каждом ноутбуке сначала прочитай объяснение, затем выполни демонстрацию и
самостоятельное задание. Checkpoint в конце урока — вопросы и проверки для
самопроверки. Сохраненный вывод помогает вернуться к результату, но не заменяет
собственный запуск и объяснение.
## 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. Состав учебных материалов
Курс не должен состоять только из ноутбуков. Ноутбуки являются ядром практики, но вход в курс, запуск стенда и правила работы должны быть вынесены в обычную документацию, доступную до открытия IDE.
### 3.1. Стартовая документация до первого ноутбука
Этот слой нужен, потому что студент ещё не имеет доступа к ноутбукам, пока не поднят стенд.
**Минимальный обязательный набор:**
* `START_HERE.md` или аналогичный стартовый документ с маршрутом прохождения курса;
* инструкция по prerequisites: `Docker`, `Docker Compose`, свободные порты, базовые команды;
* пошаговый гайд по запуску стенда: `build`, `up`, проверка сервисов, открытие UI;
* краткое объяснение, как запускать Jupyter-ноутбуки в браузерном VS Code, где лежат ноутбуки и как читать структуру урока;
* troubleshooting по типовым проблемам старта;
* [памятка учащегося](./study_workflow.md): продолжение занятия, сохранение данных,
перезапуск ядра и диагностика;
* отдельная инструкция по сбросу учебных данных для повторного прохождения практик.
**Что должен закрывать этот слой:**
* студент понимает, что нужно установить и проверить до начала курса;
* студент может поднять стенд без ментора;
* студент знает, как попасть в браузерный VS Code, `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`. Умение подключиться к Spark, загрузить 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`
**Зачем нужен:** студент должен уметь самостоятельно поднять локальный стенд и понять, куда смотреть, если что-то не работает.
**Содержание:**
* скачивание готовых образов, сборка окружения и запуск по `START_HERE.md`;
* проверка сервисов и веб-интерфейсов;
* базовый smoke test для Spark;
* первый обзор того, где в стенде `MinIO`, `PostgreSQL`, `Spark`, `Trino` и IDE.
**Практика студента:**
* запустить стенд;
* проверить статусы контейнеров и основные 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`
**Зачем нужен:** пройти путь от подключения к Spark до первого чтения и проверки исходных файлов Taxi.
**Ориентир по времени:** около 2 часов, из них 20–30 минут на подготовку Spark-сессии.
**Содержание:**
* подключение к Spark-кластеру: сессия, контекст, driver и executors; настройки из файла, параметров запуска и кода;
* повторное использование сессии, остановка и перезапуск ядра; изменение настроек во время работы;
* подготовленный data bundle и загрузка исходных файлов в raw-зону MinIO;
* чтение через Spark, проверка схемы и типов;
* базовые метрики, аномалии и причины сохранять raw без изменений.
**Практика студента:**
* заполнить шаблон сессии с подготовленным каталогом Iceberg; проверить подключение на собственной временной таблице и удалить ее;
* изменить и восстановить часовой пояс, сравнить повторный вызов builder-а с новым запуском приложения;
* проверить состав data bundle и загрузить несколько месяцев Taxi в MinIO;
* прочитать поездки и справочник зон, проверить схему и посчитать метрики;
* найти проблемные значения и объяснить, почему их сохраняют в raw.
**Checkpoint:** студент создает сессию для кластера, объясняет источники настроек и место выполнения заданий, умеет повторить подключение в новом ядре. Загружает учебный набор в raw-зону, читает его через Spark, проверяет схему и объясняет, зачем сохранять исходные данные.
### Модуль 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. Подключается к Spark-кластеру, загружает raw-данные и проверяет их после чтения.
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. правила сброса стенда и повторного прохождения практик.