При анализе курса после отзыва студента обнаружено расхождение в настройке 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. Код и учебные пояснения согласованы.
Работа
Прочитать AGENTS.md, документы в docs/agents/ и актуальные конфигурации стенда.
В новом ядре/отдельном процессе для каждого из восьми ноутбуков выполнить его фактический код инициализации. Зафиксировать appName, master и результат простого вычисления; при ошибке сохранить её текст. Не заменять инициализацию ноутбука общим helper при проверке.
Установить источник master и остальных необходимых настроек; проверить повторное выполнение ячейки создания сессии и запуск после перезапуска ядра.
Выбрать минимальный согласованный способ подключения и исправить подтверждённые дефекты, включая неверные комментарии и связанные упоминания в планах модулей.
Проверить доступ к Iceberg/MinIO на отдельной небольшой тестовой таблице, удалить только созданные для проверки артефакты.
При изменении 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`; эта задача содержит достаточную постановку для самостоятельной работы.
Глубокий тюнинг и новый учебный блок не входят в эту задачу.
Исправление подготовлено в 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, но не полное прохождение курса.
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 обновлен. Задача принята автором курса и закрывается.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Проблема
При анализе курса после отзыва студента обнаружено расхождение в настройке 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отсутствует.SparkSession.builder.appName(...).getOrCreate()без явного master.Подтверждено расхождение исходников. Режим выполнения ноутбуков 2–8 в новом ядре пока не проверен; не считать их работу в local-режиме установленным фактом.
Цель
Каждый ноутбук курса создаёт сессию с ожидаемым подключением к Spark-кластеру в новом ядре, без зависимости от ранее созданного SparkContext. Код и учебные пояснения согласованы.
Работа
Сохранить данные студента и результаты предыдущих модулей. Новое ядро не означает пустой storage/catalog. Не использовать сброс volumes и не запускать разрушительные учебные операции только ради проверки подключения.
Критерии приёмки
spark://spark-master:7077; простое распределённое вычисление успешно.git diff --check, а при изменении стенда —docker compose configи релевантные smoke-проверки; ограничения проверки явно записаны.plans/course-roadmap.md, если документ уже опубликован.Связь с развитием курса
Первая работа ближайшего обновления. Её результат нужен для следующей учебной практики базовой настройки SparkSession. Общий план готовится в
plans/course-roadmap.md; эта задача содержит достаточную постановку для самостоятельной работы.Глубокий тюнинг и новый учебный блок не входят в эту задачу.
Исправление подготовлено в 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:
module-01-environment-and-smoke-testspark://spark-master:7077spark://spark-master:7077Module-02-Mental-Modellocal[*]spark://spark-master:7077module-03-raw-ingest-and-first-readlocal[*]spark://spark-master:7077module-04-bronze-with-iceberglocal[*]spark://spark-master:7077module-05-silver-layerlocal[*]spark://spark-master:7077module-06-spark-and-trinolocal[*]spark://spark-master:7077module-07-safe-table-changeslocal[*]spark://spark-master:7077module-08-maintenance-and-lablocal[*]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 влит в main, merge-коммит
00942c255f. Результаты и ограничения проверок: #1 (comment). Roadmap обновлен. Задача принята автором курса и закрывается.