- Зачем: - нужен следующий практический шаг после модулей 1-2: доставить raw-данные в MinIO и впервые прочитать их через Spark. - Что: - добавлен ноутбук модуля 3 с raw ingest, first read, проверкой схемы, null-анализом и поиском аномалий. - обновлены START_HERE, stack reference и docker-compose для data bundle в ./data и mount в /opt/data. - добавлены правила игнорирования data bundle, .gitkeep для пустой директории и обновлён статус плана модуля. - Проверка: - docker compose config. - выполнение notebooks/03_raw_ingest_and_first_read.ipynb на локальном data bundle.
6.1 KiB
Технический reference стенда
Этот документ описывает сам стенд как runtime-среду: сервисы, порты, доступ, основные команды и smoke-тесты.
Если нужен первый student onboarding, используй START_HERE.md. Если нужна программа курса, используй course_program.md.
Состав сервисов
| Сервис | Контейнер | Порт на хосте | Назначение |
|---|---|---|---|
| Spark master | spark-master |
7077, 8080 |
мастер Spark и его UI |
| Spark worker 1 | spark-worker-1 |
8081 |
первый worker Spark |
| Spark worker 2 | spark-worker-2 |
8082 |
второй worker Spark |
| Trino | trino |
8090 |
SQL engine и Web UI |
| MinIO API | minio |
9000 |
S3-compatible endpoint |
| MinIO Console | minio |
9001 |
веб-консоль бакетов и объектов |
| PostgreSQL | postgres-iceberg |
5432 |
JDBC-каталог Iceberg |
| JupyterLab | jupyter |
8888 |
практические ноутбуки |
Основные команды
Все команды выполняются из корня репозитория.
Сборка и запуск
docker compose build
docker compose up -d
docker compose ps
Логи
docker compose logs -f spark-master
docker compose logs -f trino
docker compose logs -f minio
docker compose logs -f jupyter
Остановка и reset
docker compose down
docker compose down -v
down -v удаляет volumes и возвращает стенд в чистое состояние.
Доступ к сервисам
Spark
- Master UI:
http://localhost:8080 - Worker UI:
http://localhost:8081иhttp://localhost:8082 - Spark master endpoint внутри сети compose:
spark://spark-master:7077
Пример запуска smoke-скрипта:
docker compose exec spark-master \
/opt/spark/bin/spark-submit /opt/src/spark/cluster_smoke.py
Trino
- Web UI:
http://localhost:8090
CLI внутри контейнера:
docker compose exec -it trino trino --catalog lakehouse
Примеры первых команд:
SHOW CATALOGS;
SHOW SCHEMAS FROM lakehouse;
SHOW TABLES FROM lakehouse.default;
MinIO
- S3 endpoint:
http://localhost:9000 - Console:
http://localhost:9001 - логин:
minioadmin - пароль:
minioadmin
Бакет lakehouse обычно создаётся автоматически контейнером minio-init.
PostgreSQL
Подключение с хоста:
psql -h localhost -p 5432 -U iceberg -d iceberg
Служебные таблицы JDBC-каталога создаёт iceberg-catalog-init.
Если нужен повторный запуск инициализации:
docker compose run --rm iceberg-catalog-init
JupyterLab
- адрес:
http://localhost:8888 ./notebooksсмонтирован как/opt/work./srcсмонтирован read-only как/opt/src./dataсмонтирован read-only как/opt/dataPYTHONPATH=/opt/src
Первый ноутбук курса: notebooks/01_environment_and_smoke_test.ipynb.
Для Модуля 3 локально скачанный data bundle должен лежать на хосте в ./data/nyc_taxi и будет доступен внутри Jupyter по пути /opt/data/nyc_taxi.
Как связаны Spark, Trino, PostgreSQL и MinIO
Sparkиспользует каталогlakehouseчерезJdbcCatalog.Trinoиспользует тот же каталогlakehouseчерезiceberg.jdbc-catalog.- метаданные таблиц лежат в
PostgreSQL; - данные и metadata-файлы Iceberg лежат в
MinIOв бакетеlakehouse.
Именно поэтому таблица, созданная в Spark, может читаться в Trino без копирования данных.
Где лежат ключевые конфиги
| Файл | Что задаёт |
|---|---|
docker-compose.yml |
состав сервисов, порты, volumes, init-контейнеры |
spark/spark-defaults.conf |
Spark catalog lakehouse, s3a, Iceberg extensions |
trino/catalog/lakehouse.properties |
каталог Trino lakehouse, JDBC и S3-доступ |
spark/Dockerfile |
образ Spark с Iceberg, S3A и Python-зависимостями |
jupyter/Dockerfile |
образ JupyterLab на базе Spark |
Smoke-тесты
1. Проверка, что Spark-кластер жив
docker compose exec spark-master \
/opt/spark/bin/spark-submit /opt/src/spark/cluster_smoke.py
2. Проверка Spark -> Trino через общий каталог
docker compose cp src/spark/iceberg_smoke.py spark-master:/tmp/
docker compose cp src/trino/iceberg_smoke.sql trino:/tmp/
docker compose exec spark-master /opt/spark/bin/spark-submit /tmp/iceberg_smoke.py
docker compose exec trino trino --file /tmp/iceberg_smoke.sql
Ожидаемый результат:
- в Spark создаётся
lakehouse.default.spark_trino_smoke; - в Trino видна та же таблица;
- выборка возвращает строку
1, from_spark.
Опциональная очистка:
docker compose exec spark-master \
/opt/spark/bin/spark-sql -e "DROP TABLE IF EXISTS lakehouse.default.spark_trino_smoke"
Когда какой документ использовать
README.md— чтобы понять, что это за репозиторий и куда идти дальше.START_HERE.md— чтобы впервые поднять стенд и пройти Модуль 1.stack_reference.md— чтобы быстро вспомнить порты, команды, точки доступа и smoke-тесты.course_program.md— чтобы понять учебную траекторию дальше первого модуля.