Целью данной проекта является реализация сервиса для удобного управления процессом ETL, которое включает в себя запуск, остановку и обновление настроек ETL-скрипта. К настройкам относится любая метаинформация: название таблицы, какие поля доставать, какие события обрабатывать и другие настройки. Исходя из задачи была разработана панель управления ETL-процессами на фреймворке Django в связке с Celery для распределенного и асинхронного выполнения ETL-задач. Задачи делятся по способу переноса данных: одноразовая выгрузка или постоянная синхронизация. Обработка и анализ данных осуществляется с помощью библиотеки Pandas. В качестве тестирования и демонстрации результата используются заполненная база данных SQLite и два сторонних микросервиса: административная панель c реляционной базой данных PostgreSQL и API c нереляционным хранилищем документов ElasticSearch.
A
— Admin Panel для загрузки и редактирования фильмов.B
— Async API для полнотекстового поиска фильмов.C
— ETL Panel для управления ETL-процессами.1
— прокси-сервер Nginx, который обрабатывает HTTP-запросы к Django и Celery Flower.2
— фреймворк Django как основа проекта.3
— база данных PostgreSQL для хранения метаинформации ETL-процессов.4
— очередь задач Celery, которые выполняют ETL-скрипты в асинхронном фоновом режиме.5
— брокер сообщений Redis для Celery, чтобы отслеживать наличие новых задач.6
— шедулер Celery Beat для планирования задач, которые должны выполняться воркером Celery.7
— веб-инструмент Celery Flower для мониторинга Celery в режиме реального времени.
Клонировать репозиторий и перейти внутри него в директорию /infra
:
git clone https://github.com/8ubble8uddy/django-etl-panel.git
cd django-etl-panel/infra/
Создать файл .env и добавить настройки для проекта:
nano .env
# PostgreSQL ETL_DATABASE
POSTGRES_ETL_DB=etl_database
POSTGRES_ETL_USER=postgres
POSTGRES_ETL_PASSWORD=postgres
POSTGRES_ETL_HOST=postgres_etl
POSTGRES_ETL_PORT=5432
# PostgreSQL MOVIES_DATABASE
POSTGRES_MOVIES_DB=movies_database
POSTGRES_MOVIES_USER=app
POSTGRES_MOVIES_PASSWORD=123qwe
POSTGRES_MOVIES_HOST=postgres_movies
POSTGRES_MOVIES_PORT=5432
# Elasticsearch
ELASTIC_HOST=elastic
ELASTIC_PORT=9200
# Redis
REDIS_HOST=redis
REDIS_PORT=6379
# Django ETL Panel
DJANGO_ETL_ALLOWED_HOSTS=localhost,127.0.0.1,[::1],etl_panel
DJANGO_ETL_SECRET_KEY=django-insecure-)%ceik*k#kl+x1tc!_=*n64=88gev=m(j!@c8r-e63q3e^58mo
# Django Admin Panel
DJANGO_ADMIN_SUPERUSER_USERNAME=admin
[email protected]
DJANGO_ADMIN_SUPERUSER_PASSWORD=1234
DJANGO_ADMIN_ALLOWED_HOSTS=localhost,127.0.0.1,[::1],admin_panel
DJANGO_ADMIN_SECRET_KEY=django-insecure-_o)z83b+i@jfjzbof_jn9#%dw*5q2yy3r6zzq-3azof#(vkf!#
# FastAPI Async API
FASTAPI_DEBUG=True
Развернуть и запустить проект в контейнерах:
docker-compose up -d
Перейти по ссылке http://127.0.0.1/etl и ввести логин (admin) и пароль(1234):
По секции Processes получаем список ETL-процессов:
Выбираем процесс начиная снизу, меняем поле Status на Active
и сохраняем:
Процессы с PostgreSQL в Elasticsearch выполняют синхронизацию данных:
Проверить результат загрузки данных из SQLite в PostgreSQL можно по ссылке http://127.0.0.1/admin (логин: admin, пароль: 1234):
И результат синхронизации из PostgreSQL в Elasticsearch по ссылке http://127.0.0.1/api/v1/films: