- Зачем: - нужно выровнять учебную программу с PRD и явно отделить стартовый onboarding от практики в ноутбуках. - Что: - обновлены название курса и файл программы, а структура материалов пересобрана вокруг стартовой документации, 8 практических модулей и вспомогательных артефактов. - добавлены трассировка Learning Outcomes, hands-on упражнение для модуля 2 и уточнения по доставке учебного data bundle. - зафиксированы acceptance criteria, минимальный scope glossary и статус partitioning как legacy-темы вне обязательного трека v1. - Проверка: - просмотрен git diff HEAD~1 -- docs/course_prd.md docs/course_program.md. - проверен git diff --cached --stat перед amend.
288 lines
20 KiB
Markdown
288 lines
20 KiB
Markdown
# Программа учебного курса: 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 по терминам `storage`, `catalog`, `compute`, `table format`, `namespace`, `metadata`, `manifest`, `snapshot`, `time travel`, `schema evolution`, `compaction`, `vacuum`;
|
||
* cheat sheet по типовым командам, адресам сервисов, ключевым путям и точкам входа;
|
||
* опционально, отдельные mentor notes для ведения курса с ментором.
|
||
|
||
## 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. правила сброса стенда и повторного прохождения практик.
|