feat(course): add SparkSession setup practice to module 3

This commit is contained in:
ddadmin committed 2026-09-15 09:01:41 -04:00
1 parent 00942c255f
commit 7c5e976405
10 files changed
+523 -22

No files matched your search

+4
View File
@@ -55,6 +55,7 @@
5. Умеет реализовать простой поток `raw -> bronze -> silver` с базовыми трансформациями и сохранением воспроизводимости шагов.
6. Умеет читать одну и ту же таблицу из `Spark` и `Trino` и понимает, почему это возможно без копирования данных.
7. Умеет выполнить базовые безопасные операции с таблицей: изменение схемы, просмотр snapshot-ов, чтение предыдущего состояния, базовый `compaction` и `vacuum`.
8. Умеет создать `SparkSession` для кластера с подготовленным каталогом, проверить фактические настройки и объяснить, какие из них можно изменить в работающей сессии, а для каких нужен новый запуск.
Трассировка этих outcomes на модули и checkpoints фиксируется в [course_program.md](./course_program.md).
@@ -91,6 +92,7 @@
* работа с raw-данными;
* построение слоев `bronze` и `silver`;
* чтение и запись через `Spark`;
* обязательная практика базовой настройки `SparkSession` в начале модуля 3: источники конфигурации, подключение к кластеру, проверка Iceberg/MinIO и жизненный цикл сессии;
* чтение через `Trino`;
* базовое schema evolution;
* snapshot/time travel на прикладном уровне;
@@ -147,6 +149,7 @@
Это целевые ориентиры курса, но не blocking acceptance criteria для материалов.
1. Студент проходит курс за `~12-15 часов` вдумчивой работы.
Практика настройки сессии в модуле 3 рассчитана на 20–30 минут внутри этого диапазона. Это предварительная оценка: машинный прогон не измеряет время самостоятельной работы студента.
2. Студент после курса способен безопасно выполнить базовые операции в Lakehouse-стенде без постоянной внешней помощи.
3. Студент может внятно объяснить ключевые архитектурные принципы Lakehouse на уровне junior/middle interview readiness.
@@ -155,6 +158,7 @@
1. В составе курса есть стартовая документация до первого ноутбука, включая prerequisites, запуск стенда, вход в `Jupyter` и получение учебного data bundle.
2. Студент проходит обязательные `checkpoints` по урокам.
3. Студент самостоятельно выполняет набор практик на одном датасете, включая:
* создание Spark-сессии по шаблону и проверку подключения на отдельной маленькой Iceberg-таблице;
* загрузку raw-данных;
* построение `bronze`;
* построение `silver`;
+16 -2
View File
@@ -10,6 +10,8 @@
**Ориентир на модуль:** в среднем `~1.5 часа`, но финальная практика может занять дольше.
В модуле 3 дополнительно предусмотрены 20–30 минут на настройку Spark-сессии; ориентир на весь модуль — около 2 часов. Общие `~12-15 часов` пока остаются предварительной оценкой: её нужно уточнить после самостоятельного прохождения студентом.
**Сквозной учебный кейс:** `NYC TLC Yellow Taxi Trip Records` + `Taxi Zone Lookup`.
**Методика каждого урока:** `объяснение -> демонстрация -> самостоятельное повторение -> checkpoint`.
@@ -74,6 +76,7 @@
| `LO5`. Умение собрать поток `raw -> bronze -> silver` | 4, 5, 8 | checkpoints модулей 5 и 8 |
| `LO6`. Умение читать одну таблицу из `Spark` и `Trino` | 6, 8 | checkpoint модуля 6 и финальная практика |
| `LO7`. Умение выполнять безопасные операции с таблицей | 7, 8 | checkpoints модулей 7 и 8 |
| `LO8`. Умение настроить Spark-сессию и проверить подключение | 3 | checkpoint практики настройки в начале модуля 3 |
## 5. Верхнеуровневая структура практической части
@@ -124,10 +127,15 @@
**Рабочее название ноутбука:** `03_raw_ingest_and_first_read.ipynb`
**Зачем нужен:** показать, как raw-данные попадают в стенд и как с ними безопасно начать работать.
**Зачем нужен:** научить создавать Spark-сессию для нашего кластера, затем загружать и читать raw-данные.
**Содержание:**
* обязательная практика «Как настроен Spark в нашем стенде» после ментальной модели модуля 2, до raw-ingest (20–30 минут);
* роли `SparkSession`, `SparkContext`, driver и executors; `master`, `appName`, `getOrCreate`, отличие `local` от кластера;
* настройки из `spark-defaults.conf`, параметров запуска и кода; подготовленный каталог Iceberg и доступ к MinIO;
* проверка фактического master и выбранных несекретных настроек; повторная ячейка, остановка сессии и перезапуск ядра;
* изменение часового пояса с восстановлением исходного значения и смена имени приложения при новом запуске; без подбора памяти, executors, shuffle или GC;
* работа с заранее подготовленным локальным data bundle из onboarding-документации;
* явная загрузка исходных `PARQUET`-файлов в raw-зону;
* чтение raw-данных через Spark;
@@ -136,13 +144,18 @@
**Практика студента:**
* выполнить демонстрацию настройки сессии, затем заполнить шаблон с адресом кластера и именем приложения, используя подготовленный каталог;
* проверить подключение на собственной маленькой Iceberg-таблице, прочитать две строки и удалить только эту таблицу; данные модуля 2 не нужны;
* объяснить происхождение настроек и повторить создание сессии после перезапуска ядра;
* проверить состав локально полученного набора `NYC Taxi`;
* загрузить его в raw-зону `MinIO`;
* прочитать несколько месяцев `NYC Taxi`;
* проверить схему и посчитать базовые метрики;
* найти простые аномалии или проблемные значения.
**Checkpoint:** студент умеет загрузить учебный набор в raw-зону, прочитать raw-данные, проверить схему и объяснить, почему raw-слой нужен как воспроизводимая точка входа.
**Checkpoint настройки:** master равен `spark://spark-master:7077`, имя приложения совпадает с заданным, из собственной Iceberg-таблицы прочитаны строки `0` и `1`, временная таблица удалена. Часовой пояс восстановлен. Студент объясняет, что задал в коде, что взял из стенда, где выполняются вычисления и какие ячейки повторит после перезапуска ядра.
**Checkpoint raw-ingest:** студент умеет загрузить учебный набор в raw-зону, прочитать raw-данные, проверить схему и объяснить, почему raw-слой нужен как воспроизводимая точка входа.
### Модуль 4. Первая рабочая Iceberg-таблица и слой bronze
@@ -261,6 +274,7 @@
5. Умеет построить простой поток `raw -> bronze -> silver`.
6. Умеет читать одну и ту же таблицу из `Spark` и `Trino`.
7. Умеет выполнять базовые безопасные операции: schema evolution, snapshots/time travel, compaction, vacuum.
8. Создаёт Spark-сессию для кластера, проверяет настройки и понимает, когда нужен новый запуск.
## 7. Что не входит в первую версию курса
+16
View File
@@ -44,6 +44,22 @@
**Параллель с DWH:** в классическом DWH вычислитель один, поэтому проблема не возникает.
**Где в курсе:** Модуль 6.
## Spark-сессия и выполнение
### SparkSession
Точка входа в DataFrame и Spark SQL: объект `spark` в ноутбуке. Builder задаёт параметры, а `getOrCreate()` создаёт сессию или возвращает уже работающую.
### SparkContext
Связывает Spark-приложение с вычислительными ресурсами. Через `spark.sparkContext` можно проверить фактические `master`, `appName` и `applicationId`. Повторный builder не заменяет работающий контекст.
### Driver и executors
Driver управляет приложением: выполняет код ноутбука, строит план и отправляет задания. Executors выполняют задания и читают данные. В нашем стенде driver работает в `jupyter`, executors запускаются на Spark worker-ах. Master выделяет приложению ресурсы worker-ов.
**Где в курсе:** [практика настройки в модуле 3](../notebooks/03_raw_ingest_and_first_read.ipynb).
## Структура Iceberg-таблицы
### Namespace
+21
View File
@@ -64,6 +64,27 @@ docker compose down -v
или настройки в файле, перезапусти ядро ноутбука и снова выполни ячейки
с импортами и созданием сессии.
Практика с объяснением, шаблоном и проверкой подключения находится в начале
[модуля 3](../notebooks/03_raw_ingest_and_first_read.ipynb).
В ней `spark.sparkContext.master` и `.appName` показывают фактический кластер
и имя приложения. Для SQL-настроек используется `spark.conf.get(...)`;
вывод ограничен конкретными несекретными ключами.
В Spark 3.5.1 `spark.sql.session.timeZone` можно менять через
`spark.conf.set(...)` во время работы, сохранив и восстановив исходное значение.
Повторный builder с другим `appName` использует прежний контекст и не меняет
его фактическое имя. После `spark.stop()` новый контекст получает новое имя;
при смене master или общего файла конфигурации перезапусти ядро.
`stop()` оставляет переменные Python, перезапуск ядра удаляет их.
Оба действия сохраняют таблицы в каталоге и файлы MinIO.
Параметры обычного нового приложения имеют приоритет: код → параметры
`spark-submit` → `spark-defaults.conf`. Настройки запуска driver-а нужно
передавать до его старта. Вне стенда также потребуются зависимости и конфигурация
Iceberg/S3A/JDBC из [`spark/Dockerfile`](../spark/Dockerfile) и общего файла.
Подробности: [конфигурация Spark 3.5.1](https://github.com/apache/spark/blob/v3.5.1/docs/configuration.md)
и [поведение SparkSession в этой версии](https://github.com/apache/spark/blob/v3.5.1/python/pyspark/sql/session.py).
Пример запуска smoke-скрипта:
```bash