Кому можем быть полезна эта статья?
В вашей компании вообще нету эирфлоу или аналога.
У вас есть эирфлоу но тестирование дага можете проводить только на проде, нету стейджа ( деф контура). А если на прод еще и апрув нужен то это вообще
сказка.Вы еще не работает в компании, а на интервью уже спрашивают опыт (для джунов).
Узнали себя? Тогда погнали!
Сперва устанавливаем доцкер, делается это одной строкой brew install docker
детально можно прочитать в предыдущей статье.
И переходим собственно к созданию образа эирфлоу. Работать я буду в PyCharm.
Создаем новый проект, назовем его airflow.
В нем создаем файл с именем
docker-compose.yml
И прокидываем в него:
version: '3.8'
services:
airflow-webserver:
build: .
command: webserver
image: apache/airflow:2.6.0
environment:
- PYTHONPATH=/opt/airflow
- AIRFLOW__CORE__EXECUTOR=LocalExecutor
- AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@airflow-postgres:5432/airflow
- AIRFLOW__WEBSERVER__SECRET_KEY=your_secret_key
- AIRFLOW__WEBSERVER__WORKERS=4
- AIRFLOW__WEBSERVER__WEB_SERVER_PORT=8080
ports:
- "8080:8080"
volumes:
- /<Абсолютный путь к проекту>/dags:/opt/airflow/dags
- /<Абсолютный путь к проекту>/logs:/opt/airflow/logs
- /<Абсолютный путь к проекту>/plugins:/opt/airflow/plugins
- /<Абсолютный путь к проекту>/connections:/opt/airflow/connections
depends_on:
- airflow-scheduler
- airflow-postgres
airflow-scheduler:
build: .
command: scheduler
image: apache/airflow:2.6.0
environment:
- PYTHONPATH=/opt/airflow
- AIRFLOW__CORE__EXECUTOR=LocalExecutor
- AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@airflow-postgres:5432/airflow
volumes:
- /<Абсолютный путь к проекту>/dags:/opt/airflow/dags
- /<Абсолютный путь к проекту>/logs:/opt/airflow/logs
- /<Абсолютный путь к проекту>/plugins:/opt/airflow/plugins
- /<Абсолютный путь к проекту>/connections:/opt/airflow/connections # Добавлено
depends_on:
- airflow-postgres
airflow-init:
build: .
command: >
bash -c "
airflow db init &&
airflow users create --username admin --firstname Admin --lastname User --role Admin --email admin@example.com --password admin
"
image: apache/airflow:2.6.0
environment:
- PYTHONPATH=/opt/airflow
- AIRFLOW__CORE__EXECUTOR=LocalExecutor
- AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@airflow-postgres:5432/airflow
volumes:
- /<Абсолютный путь к проекту>/dags:/opt/airflow/dags
- /<Абсолютный путь к проекту>/logs:/opt/airflow/logs
- /<Абсолютный путь к проекту>/plugins:/opt/airflow/plugins
- /<Абсолютный путь к проекту>/connections:/opt/airflow/connections # Добавлено
depends_on:
- airflow-scheduler
- airflow-postgres
airflow-postgres:
image: postgres:13
environment:
POSTGRES_USER: airflow
POSTGRES_PASSWORD: airflow
POSTGRES_DB: airflow
ports:
- "5434:5432" # Или измените на "5434"
Да страшно, но таков пусть самурая.
И нужно еще кое-что локализовать.
Берем абсолютный путь к проекту который мы создали и вставляем всюду вместо<Абсолютный путь к проекту>
в файле выше.
К примеру у меня путь выглядит вот так:/Users/i.ivanov/PycharmProjects/airflow
и тогда в volumes мы вставляем:- /Users/i.ivanov/PycharmProjects/airflow/dags:/opt/airflow/dags
Создаем
Dockerfile
с содержимым:
FROM apache/airflow:2.6.0
USER root
#USER root # Переход на пользователя root для установки
# Установка необходимых пакетов для компиляции
RUN apt-get update && \
apt-get install -y gcc g++ python3-dev && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Возвращаемся к пользователю airflow
#USER airflow
USER airflow
# Копируем файл requirements.txt в контейнер
COPY requirements.txt .
# Устанавливаем зависимости
RUN pip install --no-cache-dir -r requirements.txt
Знаю вам это не нравится, но уверяю осталось немного)
Создаемrequirements.txt
и записываем в него:
pandas==1.3.5
sqlalchemy==1.4.49
clickhouse-sqlalchemy==0.2.0
Этот файл вам будет полезен если в ваших дагах не будет хватать либ.
Можете добавить по аналогу ( после добавления нужно будет рестартнуть эирфлоу ).
При добавлении надо следить чтобы не было конфликта версий, но можете на авось добавить, если что конфликт все равно вылезет при билде.
-
И теперь правда все!
Переходим в докер и через терминал поднимаем приложение:docker-compose -f /<Абсолютный путь к проекту>/docker-compose.yml up --build
Дальше как обычно молимся смотрим на логи чтобы не было ошибок.
Если вы поднялись и все хорошо то веб версия доступна по адресу http://localhost:8080/home
Логин/пароль: admin/admin.
На выходе вы получите настоящий airflow с полным админом.
В проекте будет тестовый даг который читает из кх и пишет в него же таблицу.
Нужно только в хуке вставить свои креды /airflow/connections .
По аналогии можно прокинуть хук к другой бд.
Удобно сделать хуки максимально похожими на те которые у вас в компании ( именно с точки зрения как они выглядят и используются в даге, а не само их определение ).
Импорт дага из репозитория не требует отдельной команды, это происходит автоматически почти мгновенно.
Если вы нуждаетесь в развертывании в облаке, то у ЯО есть готовое решение)
Комментарии (5)
j_larkin
14.01.2025 20:16Лучше спрятать этот текст в черновики и хорошенько поработать над стилистикой. Убрать сленг, подтянуть знания докера (например, не нужно прописывать пользователя root, там по умолчанию все от рута), перечитать этот текст ещё раз, и если очень сильно захочется, то публиковать после редактуры.
Короче говоря, есть некоторое количество замечаний. Но если их написать, то коммент будет длиннее поста. Так что воздержусь, извините.
fujinon
14.01.2025 20:16(например, не нужно прописывать пользователя root, там по умолчанию все от рута)
Справедливости ради, в базовом образе может быть прописан другой пользователь)
Именно в этом образе 54-й слой:
USER 50000
j_larkin
14.01.2025 20:16Соглашусь, но на это, в таком случае, нужно специально обратить внимание в статье. В данном случае, выглядит так, как будто автор знает как менять пользователя в контейнере, но не до конца понимает как контейнер работает.
ednersky
14.01.2025 20:16Полагаю, статья заминусована за "доцкер" и "эирфлоу".
Мне же для того, чтобы дочитать статью не хватило предложения в котором бы объяснялось бы что такое этот эирфлоу и зачем он мне нужен.
в самом начале статьи я увидел себя:
Кому можем быть полезна эта статья? В вашей компании вообще нету эирфлоу или аналога.
Да! У меня его вообще нету!
Но эта статья не помогла мне понять: что это такое, и нужен ли он мне.
А в целом, видно, что автор пытался написать доку в вопросе "в котором разобрался" - поделиться опытом хотел, но, увы, тему не раскрыл и потому, вероятно, заминусовали. Эх...
пойду что ли погуглю, что это за эирфлоу...
pfr46
Дальше мне не захотелось читать.