feat(course): add SparkSession setup practice to module 3
This commit is contained in:
1 parent
00942c255f
commit
7c5e976405
10 files changed
+523
-22
No files matched your search
@@ -0,0 +1,91 @@
|
||||
# Проверка практики SparkSession в модуле 3
|
||||
|
||||
Дата: 2026-09-15.
|
||||
Задача: https://git.dementev.space/ddmitry/mini-lakehouse-lab/issues/2.
|
||||
База: `00942c2`, результат закрытой [#1](https://git.dementev.space/ddmitry/mini-lakehouse-lab/issues/1) прочитан вместе с комментариями.
|
||||
|
||||
## Что проверялось
|
||||
|
||||
Фактические ячейки `notebooks/03_raw_ingest_and_first_read.ipynb` выполнялись
|
||||
через `jupyter_client.KernelManager` в контейнере `jupyter`, Spark 3.5.1.
|
||||
Менеджер запускал настоящее IPython-ядро и перезапускал его через
|
||||
`restart_kernel(now=True)`. Проверка не подменяла создание сессии общим helper-ом.
|
||||
|
||||
Порядок воспроизведения:
|
||||
|
||||
1. Поднять стенд и получить стандартный bundle по `START_HERE.md`.
|
||||
2. В новом ядре выполнить демонстрацию, вывод настроек, опыт с часовым поясом,
|
||||
повторный builder и остановку сессии.
|
||||
3. Заполнить три пропуска шаблона, выполнить его дважды и сравнить контекст
|
||||
и applicationId. Выполнить опубликованное контрольное решение
|
||||
(при проверке извлекалось из блока `session-solution`).
|
||||
4. Выполнить проверку master/appName и дважды создать, прочитать и удалить
|
||||
временную таблицу.
|
||||
5. Перезапустить ядро. Убедиться, что переменные `spark` и `CLUSTER_MASTER`
|
||||
отсутствуют; выполнить контрольное решение, проверку подключения и таблицы.
|
||||
6. Продолжить исходный raw-ingest до `spark.stop()`, заполнив самостоятельные
|
||||
упражнения с lookup, top-5 локаций и ещё одной аномалией.
|
||||
7. Отдельно проверить заполненный шаблон в новом ядре и повторную загрузку
|
||||
уже существующих raw-файлов.
|
||||
|
||||
## Результаты
|
||||
|
||||
| Проверка | Результат |
|
||||
| --- | --- |
|
||||
| Демонстрационная сессия | Master `spark://spark-master:7077`, appName `module-03-session-demo`, сумма 0…9 = 45 |
|
||||
| Настройки каталога | `SparkCatalog`, `JdbcCatalog`, URI PostgreSQL и warehouse соответствуют общему файлу; Hadoop endpoint `http://minio:9000`, path-style `true` |
|
||||
| Изменяемая настройка | `spark.sql.session.timeZone` допускает изменение; Unix-время 0 отображается как `1970-01-01 00:00:00` в UTC и `1970-01-01 03:00:00` в Москве |
|
||||
| Восстановление | В `finally` восстановлено исходное `Etc/UTC`, проверено через assert |
|
||||
| Повторный builder с другим appName | Тот же объект сессии и контекста, фактическое имя остаётся `module-03-session-demo` |
|
||||
| Создание после stop | Новое имя `module-03-raw-ingest-and-first-read`, master кластерный |
|
||||
| Повторение шаблона и контрольного решения | Контекст и applicationId не меняются |
|
||||
| Заполненный шаблон в отдельном новом ядре | Master и appName верны, распределённая сумма 0…9 = 45 |
|
||||
| Перезапуск ядра | Переменные исчезли, сессия создана заново; ID изменился с `app-20260915125347-0001` на `app-20260915125511-0002` |
|
||||
| Iceberg до и после перезапуска | Три независимые таблицы с уникальными именами; каждый раз прочитаны `[0, 1]`, после PURGE таблица отсутствует в каталоге |
|
||||
| Raw-ingest | Январь: 2 964 624 строки; январь–март: 9 554 778 строк, 19 колонок |
|
||||
| Профилирование | Схема, null-доли, describe и четыре проверки аномалий выполнены без ошибок |
|
||||
| Самостоятельное задание raw | Lookup: 265 строк; подсчёт зон по Borough и top-5 pickup с названиями зон выполнены; найдено 180 поездок с отрицательной длительностью |
|
||||
| Повторная загрузка raw в отдельном ядре | Все четыре файла пропущены с `skipped_same_size`; снимки всех объектов и каталога до/после совпали |
|
||||
|
||||
Код исходного raw-ingest после ячейки подготовки не изменён, что проверено
|
||||
сравнением ячеек с базовым коммитом. Из подготовки убрано только создание сессии:
|
||||
она теперь приходит из новой практики.
|
||||
|
||||
## Время и ограничения
|
||||
|
||||
- Машинный прогон блока настройки: **179,27 с**. Сюда вошли дополнительные
|
||||
повторы шаблона и таблицы, а также настоящий перезапуск ядра.
|
||||
- Исходная часть модуля, включая заполненные самостоятельные упражнения:
|
||||
**70,41 с**. Полный основной прогон: **250,02 с** (около 4 минут 10 секунд).
|
||||
- Запуск контейнеров и скачивание bundle в замер не входят. Это время выполнения
|
||||
кода; чтение объяснений, самостоятельное заполнение и ответы студента не измерялись.
|
||||
- Ориентир новой практики **20–30 минут**, модуля целиком **около 2 часов**.
|
||||
Общую оценку **12–15 часов** оставили предварительной; машинного замера
|
||||
недостаточно для её уточнения. Нужен самостоятельный проход студента.
|
||||
- Кнопки Jupyter/VS Code, отображение раскрывающегося решения и UI сервисов
|
||||
не проверялись. Перезапуск выполнен менеджером ядра через API, а не кнопкой.
|
||||
- Остальные семь ноутбуков и Trino smoke не выполнялись: runtime-конфигурация
|
||||
не менялась, проверялся модуль 3.
|
||||
|
||||
## Сохранность данных
|
||||
|
||||
До основного прогона в каталоге было **0 таблиц**, в bucket — **4 объекта**.
|
||||
После прогона исходные объекты сохранили ETag и размер, состав каталога
|
||||
не изменился. Это проверка на имевшемся состоянии стенда, а не на копии
|
||||
заполненного студентом курса.
|
||||
|
||||
Добавлены четыре исходных файла Taxi в `raw/nyc_taxi/`, как предусмотрено уроком;
|
||||
они оставлены для модуля 4. Локальный bundle сохранён в игнорируемом `data/`.
|
||||
Файлы данных и метаданных трёх временных таблиц удалены через PURGE.
|
||||
Hadoop S3A оставил шесть нулевых маркеров `data/` и `metadata/`;
|
||||
при завершении проверки удалены только эти шесть зафиксированных объектов.
|
||||
В трёх префиксах практики осталось 0 объектов. Volumes не сбрасывались.
|
||||
Поднятый для проверки стенд остановлен через `docker compose down` без `-v`.
|
||||
|
||||
## Статические проверки
|
||||
|
||||
- `git diff --check`;
|
||||
- `docker compose config --quiet`;
|
||||
- проверка ноутбука через `nbformat.validate` и синтаксиса Python-ячеек через AST;
|
||||
- относительные ссылки изменённых документов и ноутбука;
|
||||
- сохранение восьми модулей и маршрута README → START_HERE → программа → ноутбук.
|
||||
Reference in new issue
Block a user