Проверить и исправить подключение Spark-сессий в новом ядре каждого ноутбука #1

Closed
opened 2026-09-15 14:11:13 +03:00 by ddmitry · 2 comments
Owner

Проблема

При анализе курса после отзыва студента обнаружено расхождение в настройке Spark-сессии:

  • src/spark/cluster_smoke.py:create_spark_session явно задаёт .master("spark://spark-master:7077"); этот helper используется в модуле 1.
  • В notebooks/02_lakehouse_mental_model.ipynb комментарий утверждает, что master берётся из spark-defaults.conf.
  • В spark/spark-defaults.conf параметр spark.master отсутствует.
  • В ноутбуках 2–8 используется SparkSession.builder.appName(...).getOrCreate() без явного master.

Подтверждено расхождение исходников. Режим выполнения ноутбуков 2–8 в новом ядре пока не проверен; не считать их работу в local-режиме установленным фактом.

Цель

Каждый ноутбук курса создаёт сессию с ожидаемым подключением к Spark-кластеру в новом ядре, без зависимости от ранее созданного SparkContext. Код и учебные пояснения согласованы.

Работа

  1. Прочитать AGENTS.md, документы в docs/agents/ и актуальные конфигурации стенда.
  2. В новом ядре/отдельном процессе для каждого из восьми ноутбуков выполнить его фактический код инициализации. Зафиксировать appName, master и результат простого вычисления; при ошибке сохранить её текст. Не заменять инициализацию ноутбука общим helper при проверке.
  3. Установить источник master и остальных необходимых настроек; проверить повторное выполнение ячейки создания сессии и запуск после перезапуска ядра.
  4. Выбрать минимальный согласованный способ подключения и исправить подтверждённые дефекты, включая неверные комментарии и связанные упоминания в планах модулей.
  5. Проверить доступ к Iceberg/MinIO на отдельной небольшой тестовой таблице, удалить только созданные для проверки артефакты.
  6. При изменении runtime-настроек или запуска синхронизировать README.md, START_HERE.md, docs/stack_reference.md и затронутые примеры по AGENTS.md.

Сохранить данные студента и результаты предыдущих модулей. Новое ядро не означает пустой storage/catalog. Не использовать сброс volumes и не запускать разрушительные учебные операции только ради проверки подключения.

Критерии приёмки

  • Зафиксирован результат исходной проверки всех восьми способов инициализации в независимых ядрах/процессах.
  • После исправления каждый ноутбук получает master spark://spark-master:7077; простое распределённое вычисление успешно.
  • Проверены повторное выполнение инициализации и запуск после перезапуска ядра; ожидаемое поведение объяснено.
  • Проверены чтение/запись тестовой Iceberg-таблицы через используемую конфигурацию; учебные таблицы сохранены.
  • Комментарии, справочная документация и затронутые планы правильно указывают источник настроек.
  • Выполнены git diff --check, а при изменении стенда — docker compose config и релевантные smoke-проверки; ограничения проверки явно записаны.
  • В итоговом комментарии описаны причина, выбранный способ подключения и результаты проверки; обновлён соответствующий пункт plans/course-roadmap.md, если документ уже опубликован.

Связь с развитием курса

Первая работа ближайшего обновления. Её результат нужен для следующей учебной практики базовой настройки SparkSession. Общий план готовится в plans/course-roadmap.md; эта задача содержит достаточную постановку для самостоятельной работы.

Глубокий тюнинг и новый учебный блок не входят в эту задачу.

## Проблема При анализе курса после отзыва студента обнаружено расхождение в настройке Spark-сессии: - `src/spark/cluster_smoke.py:create_spark_session` явно задаёт `.master("spark://spark-master:7077")`; этот helper используется в модуле 1. - В `notebooks/02_lakehouse_mental_model.ipynb` комментарий утверждает, что master берётся из `spark-defaults.conf`. - В `spark/spark-defaults.conf` параметр `spark.master` отсутствует. - В ноутбуках 2–8 используется `SparkSession.builder.appName(...).getOrCreate()` без явного master. Подтверждено расхождение исходников. Режим выполнения ноутбуков 2–8 в новом ядре пока не проверен; не считать их работу в local-режиме установленным фактом. ## Цель Каждый ноутбук курса создаёт сессию с ожидаемым подключением к Spark-кластеру в новом ядре, без зависимости от ранее созданного SparkContext. Код и учебные пояснения согласованы. ## Работа 1. Прочитать AGENTS.md, документы в docs/agents/ и актуальные конфигурации стенда. 2. В новом ядре/отдельном процессе для каждого из восьми ноутбуков выполнить его фактический код инициализации. Зафиксировать appName, master и результат простого вычисления; при ошибке сохранить её текст. Не заменять инициализацию ноутбука общим helper при проверке. 3. Установить источник master и остальных необходимых настроек; проверить повторное выполнение ячейки создания сессии и запуск после перезапуска ядра. 4. Выбрать минимальный согласованный способ подключения и исправить подтверждённые дефекты, включая неверные комментарии и связанные упоминания в планах модулей. 5. Проверить доступ к Iceberg/MinIO на отдельной небольшой тестовой таблице, удалить только созданные для проверки артефакты. 6. При изменении runtime-настроек или запуска синхронизировать README.md, START_HERE.md, docs/stack_reference.md и затронутые примеры по AGENTS.md. Сохранить данные студента и результаты предыдущих модулей. Новое ядро не означает пустой storage/catalog. Не использовать сброс volumes и не запускать разрушительные учебные операции только ради проверки подключения. ## Критерии приёмки - [x] Зафиксирован результат исходной проверки всех восьми способов инициализации в независимых ядрах/процессах. - [x] После исправления каждый ноутбук получает master `spark://spark-master:7077`; простое распределённое вычисление успешно. - [x] Проверены повторное выполнение инициализации и запуск после перезапуска ядра; ожидаемое поведение объяснено. - [x] Проверены чтение/запись тестовой Iceberg-таблицы через используемую конфигурацию; учебные таблицы сохранены. - [x] Комментарии, справочная документация и затронутые планы правильно указывают источник настроек. - [x] Выполнены `git diff --check`, а при изменении стенда — `docker compose config` и релевантные smoke-проверки; ограничения проверки явно записаны. - [x] В итоговом комментарии описаны причина, выбранный способ подключения и результаты проверки; обновлён соответствующий пункт `plans/course-roadmap.md`, если документ уже опубликован. ## Связь с развитием курса Первая работа ближайшего обновления. Её результат нужен для следующей учебной практики базовой настройки SparkSession. Общий план готовится в `plans/course-roadmap.md`; эта задача содержит достаточную постановку для самостоятельной работы. Глубокий тюнинг и новый учебный блок не входят в эту задачу.
ddmitry added the ready-for-agent label 2026-09-15 14:11:13 +03:00
ddmitry self-assigned this 2026-09-15 14:55:29 +03:00
Author
Owner

Исправление подготовлено в MR #3: #3. Код и редактура приняты автором курса. Ниже результаты проверок из этой рабочей сессии.

Причина и исправление

В spark-defaults.conf отсутствовал spark.master. Jupyter читал этот файл: параметры Iceberg extensions и каталога lakehouse были доступны. MASTER, PYSPARK_SUBMIT_ARGS и SPARK_CONF_DIR не были заданы. Модуль 1 явно задавал кластерный master в helper, а обычный builder в модулях 2–8 выбирал local[*].

Теперь общий файл задает spark.master spark://spark-master:7077. Helper модуля 1 использует его, как остальные ноутбуки; run_cluster_smoke требует точный адрес кластера. README, START_HERE, справочник, комментарий ноутбука 2 и затронутые планы согласованы. Roadmap обновлен в MR.

Восемь независимых запусков

Каждый запуск выполнялся отдельным Python/JVM-процессом в контейнере Jupyter. Исходная проверка повторяла вызовы создания сессии из ноутбуков: собственный helper модуля 1 и builder с фактическим appName в модулях 2–8. Финальная проверка извлекала фактические импорты и код до присваивания spark непосредственно из каждого .ipynb; общим helper инициализация не заменялась.

Во всех случаях сумма чисел от 0 до 99 на четырех партициях равнялась 4950. Различался master:

Модуль appName До исправления После исправления
1 module-01-environment-and-smoke-test spark://spark-master:7077 spark://spark-master:7077
2 Module-02-Mental-Model local[*] spark://spark-master:7077
3 module-03-raw-ingest-and-first-read local[*] spark://spark-master:7077
4 module-04-bronze-with-iceberg local[*] spark://spark-master:7077
5 module-05-silver-layer local[*] spark://spark-master:7077
6 module-06-spark-and-trino local[*] spark://spark-master:7077
7 module-07-safe-table-changes local[*] spark://spark-master:7077
8 module-08-maintenance-and-lab local[*] spark://spark-master:7077

После удаления явного master из helper, но до исправления конфига, регрессионный smoke упал с RuntimeError: Smoke test must run against spark://spark-master:7077, got local[*].. После исправления тот же smoke прошел: 1 000 000 строк, 8 партиций, сумма 499999500000, defaultParallelism=4, Spark 3.5.1.

Повторный getOrCreate() проверен в одном процессе: same_session_object=true, same_spark_context=true, master кластерный, сумма 0…9 равна 45. Повторная ячейка использует существующую сессию; новые стартовые настройки требуют нового ядра. Новый запуск проверен независимыми процессами, без унаследованного SparkContext.

Iceberg и сохранность данных

Создана отдельная таблица lakehouse.default.issue_1_session_validation_800bbb65529d с уникальным расположением s3a://lakehouse/warehouse/issue-1-session-validation-800bbb65529d/. Spark-кластер записал и прочитал строки (1, 'cluster'), (2, 'minio'); в MinIO появилось 6 объектов.

DROP TABLE ... PURGE удалил запись каталога и часть объектов. Пакетное удаление остатков через boto3 завершилось MissingContentMD5; два оставшихся объекта удалены отдельными delete_object только из тестового префикса. Финальные проверки показали 0 записей тестовой таблицы в каталоге и 0 объектов тестового префикса.

Учебные таблицы и результаты предыдущих модулей не изменялись. Volumes не сбрасывались. После проверки поднятый для нее стенд остановлен через docker compose down без -v.

Проверки и ограничения

Прошли git diff --check, docker compose config --quiet, разбор JSON всех ноутбуков и компиляция Python. После редакторского коммита отдельно подтверждена неизменность исполняемого кода и runtime-настроек.

Полное выполнение ноутбуков, учебные операции изменения таблиц, Trino smoke на фиксированной учебной таблице и взаимодействие с UI не запускались. Перезапуск ядра кнопкой в Jupyter/VS Code не проверялся: проверка независимости от состояния ядра выполнена отдельными процессами в том же контейнере. Повторный getOrCreate() отдельно проверен на builder модуля 2, а не во всех восьми ноутбуках. Эти проверки подтверждают создание сессий и доступ к Iceberg/MinIO, но не полное прохождение курса.

Исправление подготовлено в MR #3: https://git.dementev.space/ddmitry/mini-lakehouse-lab/pulls/3. Код и редактура приняты автором курса. Ниже результаты проверок из этой рабочей сессии. ## Причина и исправление В `spark-defaults.conf` отсутствовал `spark.master`. Jupyter читал этот файл: параметры Iceberg extensions и каталога `lakehouse` были доступны. `MASTER`, `PYSPARK_SUBMIT_ARGS` и `SPARK_CONF_DIR` не были заданы. Модуль 1 явно задавал кластерный master в helper, а обычный builder в модулях 2–8 выбирал `local[*]`. Теперь общий файл задает `spark.master spark://spark-master:7077`. Helper модуля 1 использует его, как остальные ноутбуки; `run_cluster_smoke` требует точный адрес кластера. README, START_HERE, справочник, комментарий ноутбука 2 и затронутые планы согласованы. Roadmap обновлен в MR. ## Восемь независимых запусков Каждый запуск выполнялся отдельным Python/JVM-процессом в контейнере Jupyter. Исходная проверка повторяла вызовы создания сессии из ноутбуков: собственный helper модуля 1 и builder с фактическим appName в модулях 2–8. Финальная проверка извлекала фактические импорты и код до присваивания `spark` непосредственно из каждого `.ipynb`; общим helper инициализация не заменялась. Во всех случаях сумма чисел от 0 до 99 на четырех партициях равнялась 4950. Различался master: | Модуль | appName | До исправления | После исправления | | --- | --- | --- | --- | | 1 | `module-01-environment-and-smoke-test` | `spark://spark-master:7077` | `spark://spark-master:7077` | | 2 | `Module-02-Mental-Model` | `local[*]` | `spark://spark-master:7077` | | 3 | `module-03-raw-ingest-and-first-read` | `local[*]` | `spark://spark-master:7077` | | 4 | `module-04-bronze-with-iceberg` | `local[*]` | `spark://spark-master:7077` | | 5 | `module-05-silver-layer` | `local[*]` | `spark://spark-master:7077` | | 6 | `module-06-spark-and-trino` | `local[*]` | `spark://spark-master:7077` | | 7 | `module-07-safe-table-changes` | `local[*]` | `spark://spark-master:7077` | | 8 | `module-08-maintenance-and-lab` | `local[*]` | `spark://spark-master:7077` | После удаления явного master из helper, но до исправления конфига, регрессионный smoke упал с `RuntimeError: Smoke test must run against spark://spark-master:7077, got local[*].`. После исправления тот же smoke прошел: 1 000 000 строк, 8 партиций, сумма 499999500000, defaultParallelism=4, Spark 3.5.1. Повторный `getOrCreate()` проверен в одном процессе: `same_session_object=true`, `same_spark_context=true`, master кластерный, сумма 0…9 равна 45. Повторная ячейка использует существующую сессию; новые стартовые настройки требуют нового ядра. Новый запуск проверен независимыми процессами, без унаследованного SparkContext. ## Iceberg и сохранность данных Создана отдельная таблица `lakehouse.default.issue_1_session_validation_800bbb65529d` с уникальным расположением `s3a://lakehouse/warehouse/issue-1-session-validation-800bbb65529d/`. Spark-кластер записал и прочитал строки `(1, 'cluster')`, `(2, 'minio')`; в MinIO появилось 6 объектов. `DROP TABLE ... PURGE` удалил запись каталога и часть объектов. Пакетное удаление остатков через boto3 завершилось `MissingContentMD5`; два оставшихся объекта удалены отдельными `delete_object` только из тестового префикса. Финальные проверки показали 0 записей тестовой таблицы в каталоге и 0 объектов тестового префикса. Учебные таблицы и результаты предыдущих модулей не изменялись. Volumes не сбрасывались. После проверки поднятый для нее стенд остановлен через `docker compose down` без `-v`. ## Проверки и ограничения Прошли `git diff --check`, `docker compose config --quiet`, разбор JSON всех ноутбуков и компиляция Python. После редакторского коммита отдельно подтверждена неизменность исполняемого кода и runtime-настроек. Полное выполнение ноутбуков, учебные операции изменения таблиц, Trino smoke на фиксированной учебной таблице и взаимодействие с UI не запускались. Перезапуск ядра кнопкой в Jupyter/VS Code не проверялся: проверка независимости от состояния ядра выполнена отдельными процессами в том же контейнере. Повторный `getOrCreate()` отдельно проверен на builder модуля 2, а не во всех восьми ноутбуках. Эти проверки подтверждают создание сессий и доступ к Iceberg/MinIO, но не полное прохождение курса.
Author
Owner

MR #3 влит в main, merge-коммит 00942c255f. Результаты и ограничения проверок: #1 (comment). Roadmap обновлен. Задача принята автором курса и закрывается.

MR #3 влит в main, merge-коммит 00942c255f567fd12027958c6defd1ffce5f0575. Результаты и ограничения проверок: https://git.dementev.space/ddmitry/mini-lakehouse-lab/issues/1#issuecomment-2963. Roadmap обновлен. Задача принята автором курса и закрывается.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ddmitry/mini-lakehouse-lab#1