Files
ddadmin 6d1b6e9f61 feat(course): добавлен модуль 3 про raw ingest и чтение в Spark
- Зачем:
  - нужен следующий практический шаг после модулей 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.
2026-03-07 18:51:45 +03:00

211 lines
5.6 KiB
YAML
Executable File

# version: "3.9"
services:
postgres:
image: postgres:16
container_name: postgres-iceberg
environment:
POSTGRES_DB: iceberg # БД под Iceberg catalog
POSTGRES_USER: iceberg
POSTGRES_PASSWORD: iceberg
ports:
- "5432:5432" # опционально, чтобы заходить с хоста через DBeaver/psql
networks:
- spark-net
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U iceberg -d iceberg || exit 1"]
interval: 10s
timeout: 5s
retries: 5
iceberg-catalog-init:
image: postgres:16
container_name: iceberg-catalog-init
depends_on:
- postgres
networks:
- spark-net
environment:
- PGPASSWORD=iceberg
entrypoint: |
/bin/sh -c "set -e
echo 'Waiting for Postgres (iceberg catalog)...'
until pg_isready -h postgres-iceberg -U iceberg -d iceberg; do
sleep 1
done
cat <<'SQL' | psql -h postgres-iceberg -U iceberg -d iceberg
CREATE TABLE IF NOT EXISTS iceberg_tables (
catalog_name VARCHAR(255) NOT NULL,
table_namespace VARCHAR(255) NOT NULL,
table_name VARCHAR(255) NOT NULL,
metadata_location VARCHAR(1000),
previous_metadata_location VARCHAR(1000),
iceberg_type VARCHAR(5),
PRIMARY KEY (catalog_name, table_namespace, table_name)
);
CREATE TABLE IF NOT EXISTS iceberg_namespace_properties (
catalog_name VARCHAR(255) NOT NULL,
namespace VARCHAR(255) NOT NULL,
property_key VARCHAR(255),
property_value VARCHAR(1000),
PRIMARY KEY (catalog_name, namespace, property_key)
);
SQL
echo 'Iceberg JDBC catalog tables are ready'
"
spark-master:
build:
context: ./spark
image: de-spark-iceberg:3.5.1
container_name: spark-master
hostname: spark-master
depends_on:
- postgres
networks:
- spark-net
environment:
- SPARK_NO_DAEMONIZE=true
- AWS_ACCESS_KEY_ID=minioadmin
- AWS_SECRET_ACCESS_KEY=minioadmin
command: ["/opt/spark/sbin/start-master.sh"]
ports:
- "7077:7077" # Spark master
- "8080:8080" # Web UI мастера
volumes:
- ./spark/spark-defaults.conf:/opt/spark/conf/spark-defaults.conf:ro
spark-worker-1:
image: de-spark-iceberg:3.5.1
# build:
# context: ./spark
container_name: spark-worker-1
hostname: spark-worker-1
networks:
- spark-net
environment:
- SPARK_NO_DAEMONIZE=true
- SPARK_WORKER_CORES=2
- SPARK_WORKER_MEMORY=2g
- AWS_ACCESS_KEY_ID=minioadmin
- AWS_SECRET_ACCESS_KEY=minioadmin
command: ["/opt/spark/sbin/start-worker.sh", "spark://spark-master:7077"]
depends_on:
- spark-master
ports:
- "8081:8081" # Web UI первого воркера
volumes:
- ./spark/spark-defaults.conf:/opt/spark/conf/spark-defaults.conf:ro
spark-worker-2:
image: de-spark-iceberg:3.5.1
# build:
# context: ./spark
container_name: spark-worker-2
hostname: spark-worker-2
networks:
- spark-net
environment:
- SPARK_NO_DAEMONIZE=true
- SPARK_WORKER_CORES=2
- SPARK_WORKER_MEMORY=2g
- AWS_ACCESS_KEY_ID=minioadmin
- AWS_SECRET_ACCESS_KEY=minioadmin
command: ["/opt/spark/sbin/start-worker.sh", "spark://spark-master:7077"]
depends_on:
- spark-master
ports:
- "8082:8081" # Web UI второго воркера (host 8082)
volumes:
- ./spark/spark-defaults.conf:/opt/spark/conf/spark-defaults.conf:ro
minio:
image: minio/minio:RELEASE.2024-10-02T17-50-41Z
container_name: minio
hostname: minio
networks:
- spark-net
command: server /data --console-address ":9001"
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin
ports:
- "9000:9000"
- "9001:9001"
volumes:
- minio-data:/data
minio-init:
image: minio/mc:RELEASE.2024-06-24T19-40-33Z-cpuv1
container_name: minio-init
hostname: minio-init
networks:
- spark-net
depends_on:
- minio
entrypoint: >
/bin/sh -c "
echo 'Waiting for MinIO...';
until mc alias set minio http://minio:9000 minioadmin minioadmin 2>/dev/null; do
sleep 1;
done;
echo 'MinIO is up, creating bucket...';
mc mb -p minio/lakehouse || true;
echo 'Bucket lakehouse is ready';
exit 0;
"
jupyter:
build:
context: ./jupyter
args:
NB_UID: ${NB_UID:-1000}
NB_GID: ${NB_GID:-100}
# image: jupyter-spark-iceberg:3.5.1
container_name: jupyter
hostname: jupyter
depends_on:
- spark-master
- minio
networks:
- spark-net
environment:
- AWS_ACCESS_KEY_ID=minioadmin
- AWS_SECRET_ACCESS_KEY=minioadmin
- PYTHONPATH=/opt/src
ports:
- "8888:8888"
volumes:
- ./spark/spark-defaults.conf:/opt/spark/conf/spark-defaults.conf:ro
- ./notebooks:/opt/work
- ./src:/opt/src:ro
- ./data:/opt/data:ro
trino:
image: trinodb/trino:478
container_name: trino
hostname: trino
networks:
- spark-net
depends_on:
- minio
- postgres
- iceberg-catalog-init
environment:
- AWS_ACCESS_KEY_ID=minioadmin
- AWS_SECRET_ACCESS_KEY=minioadmin
- AWS_REGION=us-east-1
ports:
- "8090:8080" # Web UI Trino
volumes:
- ./trino/catalog:/etc/trino/catalog:ro
networks:
spark-net:
volumes:
postgres-data:
minio-data: