Кому можем быть полезна эта статья?

  • В вашей компании вообще нету эирфлоу или аналога.

  • У вас есть эирфлоу но тестирование дага можете проводить только на проде, нету стейджа ( деф контура). А если на прод еще и апрув нужен то это вообще сказка.

  • Вы еще не работает в компании, а на интервью уже спрашивают опыт (для джунов).

Узнали себя? Тогда погнали!

Сперва устанавливаем доцкер, делается это одной строкой 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)


  1. pfr46
    14.01.2025 20:16

    У вас есть эирфлоу но тестирование дага можете проводить только на проде, нету стейджа ( деф контура). А если на прод еще и апрув...

    Дальше мне не захотелось читать.


  1. j_larkin
    14.01.2025 20:16

    Лучше спрятать этот текст в черновики и хорошенько поработать над стилистикой. Убрать сленг, подтянуть знания докера (например, не нужно прописывать пользователя root, там по умолчанию все от рута), перечитать этот текст ещё раз, и если очень сильно захочется, то публиковать после редактуры.

    Короче говоря, есть некоторое количество замечаний. Но если их написать, то коммент будет длиннее поста. Так что воздержусь, извините.


    1. fujinon
      14.01.2025 20:16

      (например, не нужно прописывать пользователя root, там по умолчанию все от рута)

      Справедливости ради, в базовом образе может быть прописан другой пользователь)

      Именно в этом образе 54-й слой: USER 50000


      1. j_larkin
        14.01.2025 20:16

        Соглашусь, но на это, в таком случае, нужно специально обратить внимание в статье. В данном случае, выглядит так, как будто автор знает как менять пользователя в контейнере, но не до конца понимает как контейнер работает.


  1. ednersky
    14.01.2025 20:16

    Полагаю, статья заминусована за "доцкер" и "эирфлоу".

    Мне же для того, чтобы дочитать статью не хватило предложения в котором бы объяснялось бы что такое этот эирфлоу и зачем он мне нужен.

    в самом начале статьи я увидел себя:

    Кому можем быть полезна эта статья? В вашей компании вообще нету эирфлоу или аналога.

    Да! У меня его вообще нету!

    Но эта статья не помогла мне понять: что это такое, и нужен ли он мне.

    А в целом, видно, что автор пытался написать доку в вопросе "в котором разобрался" - поделиться опытом хотел, но, увы, тему не раскрыл и потому, вероятно, заминусовали. Эх...

    пойду что ли погуглю, что это за эирфлоу...