Files
mini-lakehouse-lab/plans/issue-2-spark-session-validation.md
T

96 lines
9.1 KiB
Markdown
Raw 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.
# Проверка практики 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 → программа → ноутбук.
После редакторской правки по ревью повторно проверены ссылки, нумерация разделов
и синтаксис Python. Все исполняемые ячейки, их порядок и контрольное решение
совпадают с проверенной версией. Стенд повторно не запускался.