diff --git a/Makefile b/Makefile index 5424d7a..bf7f3ec 100644 --- a/Makefile +++ b/Makefile @@ -22,9 +22,10 @@ stop: docker compose -f docker-compose.yml stop down: - docker compose -f docker-compose.yml down -v + docker compose -f docker-compose.yml down -clean: down +clean: + docker compose -f docker-compose.yml down -v airflow-init: docker compose -f docker-compose.yml run --rm airflow-init diff --git a/README.md b/README.md index 833df01..6e30c6f 100644 --- a/README.md +++ b/README.md @@ -82,11 +82,12 @@ CSV-файлы после выполнения DAG остаются в дире Если после изменений что‑то «сломалось»: ```bash -make down # Остановить и стереть данные в контейнерах +make down # Остановить и удалить контейнеры/сети (volumes сохраняются) make up ``` -Это помогает, когда Greenplum не стартует из‑за «грязной» остановки и внутренних файлов. +Если проблема связана с «грязной» остановкой и данными в томах (например, Greenplum не стартует), +используйте полный reset: `make clean && make up` (данные в Docker-томах будут потеряны). --- @@ -240,6 +241,9 @@ make bookings-psql # Подключиться к демобазе bookings # Проверка данных make logs # Следить за логами Airflow +# Логи задач Airflow сохраняются в Docker-томе `airflow_logs` +# и переживают `docker compose down`/`up` (удаляются при `docker compose down -v` / `make clean`). + # Контроль генерации bookings docker compose -f docker-compose.yml exec bookings-db bash -lc 'PGPASSWORD="$POSTGRES_PASSWORD" psql -U "$POSTGRES_USER" -d demo -c "SELECT busy();"' # busy() = t — генерация ещё идёт; f — завершена. При необходимости можно вызвать CALL abort(); и запустить генерацию заново. @@ -409,12 +413,12 @@ load_bookings_to_stg = PostgresOperator( | Проблема | Решение | |----------|---------| | Airflow UI не открывается | Дождитесь сообщения `Listening at: http://0.0.0.0:8080` в логах (`make logs`) | -| После `docker compose stop/start` Airflow UI не отвечает, а `airflow-webserver` в `Exited (1)` | Это обычно stale PID-файл Gunicorn (`/opt/airflow/airflow-webserver.pid`). Пересоздайте webserver: `docker compose up -d --force-recreate airflow-webserver` (или просто `make up`). | +| `database "demo" does not exist` в bookings‑DAG | Вы сделали полный reset с удалением томов (`docker compose down -v` / `make clean`), поэтому демобаза bookings не установлена. Запустите `make bookings-init` и повторите DAG. | | Ошибка подключения к Greenplum | Убедитесь, что контейнер `greenplum` стал статусом `healthy` (проверьте `docker compose ps`) | | Не открывается порт 8080/5433/5434/5435 | Проверьте, что эти порты не заняты локальными сервисами; при необходимости остановите их или измените порты в `.env`/`docker-compose.yml` | | Нет файла в `./data` после запуска DAG | Проверьте логи задачи `generate_csv`, убедитесь, что `CSV_DIR` смонтирован в docker-compose | | Команда `make` не найдена | Используйте полные команды `docker compose` или установите make | -| Greenplum не стартует/падает при старте | Выполните `make down`, затем `make up` (очищает тома и поднимает заново, включая авто‑инициализацию Airflow) | +| Greenplum не стартует/падает при старте | Попробуйте `make down && make up`. Если не помогло — полный reset: `make clean && make up` (удалит тома). | | `protocol "pxf" does not exist` | Перезапустите `greenplum` и повторите `bookings_stg_ddl`/`make ddl-gp` — расширение `pxf` создаётся автоматически при старте контейнера. | | PXF не отвечает (Connection refused к порту 5888) | Проверьте `pxf cluster status` в контейнере `greenplum` и перезапустите сервис `greenplum`. | | PXF не подхватывает изменения конфигов | Пересоберите образ (`make build`) и перезапустите `greenplum`. Для принудительной перезаписи файлов задайте `PXF_SEED_OVERWRITE=1`. | diff --git a/TESTING.md b/TESTING.md index 8e90252..46cef5e 100644 --- a/TESTING.md +++ b/TESTING.md @@ -37,7 +37,8 @@ - Проверить, что все 5 задач Success и логи содержат `Проверка пройдена`. - DAG `bookings_to_gp_stage` (полная проверка цепочки bookings → Greenplum STG): - - предварительно выполнить один раз: `make bookings-init` (инициализация демо‑БД bookings) и `make ddl-gp` (создаёт `stg.bookings_ext` и `stg.bookings` в Greenplum); + - предварительно выполнить один раз: `make bookings-init` (установка демобазы `demo` в контейнере `bookings-db`) и `make ddl-gp` (создаёт `stg.bookings_ext` и `stg.bookings` в Greenplum); + - важно: DAG `bookings_stg_ddl` **не** создаёт базу `demo` в `bookings-db`; если вы делали `docker compose down -v` / `make clean`, `make bookings-init` обязателен; - включить DAG `bookings_to_gp_stage` и запустить `Trigger DAG`; - убедиться, что все задачи (`generate_bookings_day`, `load_bookings_to_stg`, `check_row_counts`, `finish_summary`) завершились со статусом Success; - при желании проверить данные: в `bookings-db` появился новый день, а в Greenplum в `stg.bookings` — строки с актуальным `batch_id` (см. пример запросов в разделе 5). diff --git a/docker-compose.yml b/docker-compose.yml index 8f0f2b3..f04e15b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,6 +10,7 @@ x-airflow-common-volumes: &airflow-volumes - ./airflow/dags:/opt/airflow/dags - ./sql:/sql:ro - airflow_data:/opt/airflow/data + - airflow_logs:/opt/airflow/logs x-airflow-common-depends: &airflow-depends pgmeta: @@ -108,6 +109,7 @@ services: - ./airflow/dags:/opt/airflow/dags - ./sql:/sql:ro - airflow_data:/opt/airflow/data + - airflow_logs:/opt/airflow/logs - ./airflow/requirements.txt:/opt/airflow/requirements.txt healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] @@ -132,6 +134,7 @@ services: - ./airflow/dags:/opt/airflow/dags - ./sql:/sql:ro - airflow_data:/opt/airflow/data + - airflow_logs:/opt/airflow/logs - ./airflow/requirements.txt:/opt/airflow/requirements.txt depends_on: <<: *airflow-depends @@ -150,10 +153,11 @@ services: - ./airflow/dags:/opt/airflow/dags - ./sql:/sql:ro - airflow_data:/opt/airflow/data + - airflow_logs:/opt/airflow/logs command: > bash -lc " set -e; - mkdir -p /opt/airflow/data && chown -R airflow:root /opt/airflow/data; + mkdir -p /opt/airflow/data /opt/airflow/logs && chown -R airflow:root /opt/airflow/data /opt/airflow/logs; # Дожидаемся готовности БД ретрая миграции for i in {1..30}; do su -s /bin/bash airflow -c \"PATH='/home/airflow/.local/bin:$${PATH}' airflow db migrate\" && break || echo 'waiting for pgmeta' && sleep 3; @@ -170,3 +174,4 @@ volumes: bookings_data: greenplum_data: airflow_data: + airflow_logs: