簡體   English   中英

如何使用 docker-compose 在分布式 airflow 架構上配置 celery worker?

[英]How to configure celery worker on distributed airflow architecture using docker-compose?

我正在設置一個分布式 Airflow 集群,其中除了 celery 工作人員之外的所有其他內容都在一台主機上運行,並在多台主機上完成處理。 The airflow2.0 setup is configured using the yaml file given at the Airflow documentation https://airflow.apache.org/docs/apache-airflow/stable/docker-compose.yaml . 在我最初的測試中,當我在同一台主機上運行所有東西時,我的架構可以很好地工作。 問題是,如何在遠程主機上啟動 celery 工作人員?

到目前為止,我嘗試創建上述 docker-compose 的精簡版本,其中我只在工作主機上啟動 celery 工作程序,僅此而已。 但是我遇到了一些與數據庫連接有關的問題。 在精簡版本中,我更改了 URL 以便它們指向運行 db 和 redis 的主機。

dag、日志、插件和 postgresql db 位於所有主機可見的共享驅動器上。

我應該如何進行配置? 任何想法要檢查什么? 連接等? Celery工人docker-compose配置:

---
version: '3'
x-airflow-common:
  &airflow-common
  image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.1.0}
  environment:
    &airflow-common-env
    AIRFLOW_UID: 50000
    AIRFLOW_GID: 50000
    AIRFLOW__CORE__EXECUTOR: CeleryExecutor
    AIRFLOW__CORE__SQL_ALCHEMY_CONN: 
postgresql+psycopg2://airflow:airflow@airflowhost.example.com:8080/airflow
    AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql://airflow:airflow@airflow@airflowhost.example.com:8080/airflow
    AIRFLOW__CELERY__BROKER_URL: redis://:@airflow@airflowhost.example.com:6380/0
    AIRFLOW__CORE__FERNET_KEY: ''
    AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'true'
    AIRFLOW__CORE__LOAD_EXAMPLES: 'true'
    AIRFLOW__API__AUTH_BACKEND: 'airflow.api.auth.backend.basic_auth'
    REDIS_PORT: 6380
   volumes:
    - /airflow/dev/dags:/opt/airflow/dags
    - /airflow/dev/logs:/opt/airflow/logs
    - /airflow/dev/plugins:/opt/airflow/plugins
   user: "${AIRFLOW_UID:-50000}:${AIRFLOW_GID:-50000}"
services:
  airflow-remote-worker:
    <<: *airflow-common
    command: celery worker
    healthcheck:
      test:
        - "CMD-SHELL"
        - 'celery --app airflow.executors.celery_executor.app inspect ping -d "celery@$${HOSTNAME}"'
      interval: 10s
      timeout: 10s
      retries: 5
    restart: always

編輯 1:我仍然對日志文件有一些困難。 看來共享日志目錄並不能解決丟失日志文件的問題。 我像建議的那樣在 main 上添加了 extra_host 定義,並在工作機器上打開了端口 8793。 工作任務失敗並顯示日志:

*** Log file does not exist: 
/opt/airflow/logs/tutorial/print_date/2021-07- 
01T13:57:11.087882+00:00/1.log
*** Fetching from: http://:8793/log/tutorial/print_date/2021-07-01T13:57:11.087882+00:00/1.log
*** Failed to fetch log file from worker. Unsupported URL protocol ''

這些設置遠非“終極設置”,而是在核心節點和工作程序中使用來自 Airflow 的 docker-compose 對我有用的一些設置:

主節點:

  • 必須可以從運行Webserver的主節點訪問工作節點。 我發現這個CeleryExecutor架構非常有助於解決問題。

    在嘗試讀取日志時,如果在本地找不到它們,它將嘗試從遠程工作者那里檢索它們。 因此,您的主節點可能不知道您的工作人員的主機名,因此您要么更改主機名的解析方式( hostname_callable設置,默認為socket.getfqdn ),要么只是簡單地向Webserver添加名稱解析功能。 這可以通過在x-airflow-common extra_hosts x-airflow-common定義中添加extra_hosts配置鍵來完成:

---
version: "3"
x-airflow-common: &airflow-common
  image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.1.0}
  environment: &airflow-common-env
    ...# env vars
  extra_hosts:
    - "worker-01-hostname:worker-01-ip-address" # "worker-01-hostname:192.168.0.11"
    - "worker-02-hostname:worker-02-ip-address"

*請注意,在您擁有共享驅動器的特定情況下,我認為日志將在本地找到。

  • 定義並行性DAG 並發性調度程序解析過程 可以通過使用 env vars 來完成:
x-airflow-common: &airflow-common
  image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.1.0}
  environment: &airflow-common-env
    AIRFLOW__CORE__PARALLELISM: 64
    AIRFLOW__CORE__DAG_CONCURRENCY: 32
    AIRFLOW__SCHEDULER__PARSING_PROCESSES: 4

當然,要設置的值取決於您的具體情況和可用資源。 這篇文章對這個主題有一個很好的概述。 DAG 設置也可以在DAG定義中被覆蓋。

工作節點:

  • 定義 worker CELERY__WORKER_CONCURRENCY ,默認可以是機器上可用的 CPU 數量( docs )。

  • 定義如何訪問主節點中運行的服務。 設置 IP 或主機名並注意主節點中匹配的暴露端口:

x-airflow-common: &airflow-common
  image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.1.0}
  environment: &airflow-common-env
  AIRFLOW__CORE__EXECUTOR: CeleryExecutor
  AIRFLOW__CELERY__WORKER_CONCURRENCY: 8
  AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@main_node_ip_or_hostname:5432/airflow # 5432 is default postgres port
  AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql://airflow:airflow@main_node_ip_or_hostname:5432/airflow
  AIRFLOW__CELERY__BROKER_URL: redis://:@main_node_ip_or_hostname:6379/0
  environment: &airflow-common-env
    AIRFLOW__CORE__FERNET_KEY: ${FERNET_KEY}
    AIRFLOW__WEBSERVER__SECRET_KEY: ${SECRET_KEY}

  env_file:
    - .env

.env 文件: FERNET_KEY=jvYUaxxxxxxxxxxxxx=

  • 集群中的每個節點(主節點和工作節點)都應用相同的設置至關重要

  • 為工作服務定義一個主機名,以避免自動生成匹配容器 ID。

  • 公開端口 8793,這是用於從 worker ( docs ) 獲取日志的默認端口:

services:
  airflow-worker:
    <<: *airflow-common
    hostname: ${HOSTNAME}
    ports:
      - 8793:8793
    command: celery worker
    restart: always
  • 確保每個工作節點主機都以相同的時間配置運行,幾分鍾的差異可能會導致嚴重的執行錯誤,這些錯誤可能不太容易找到。 考慮在主機操作系統上啟用 NTP 服務。

如果您有繁重的工作負載和高並發,您可能需要調整 Postgres 設置,例如max_connectionsshared_buffers 這同樣適用於主機操作系統網絡設置,例如ip_local_port_rangesomaxconn

在我在初始集群設置過程中遇到的任何問題中, Flower和工作程序執行日志始終提供有用的詳細信息和錯誤消息,包括任務級日志和 Docker-Compose 服務日志,即: docker-compose logs --tail=10000 airflow-worker > worker_logs.log

希望對你有用!

以下注意事項建立在公認的答案之上,因為我認為它們可能與任何新的 Airflow Celery 設置相關:

  • 啟用遠程日志記錄通常在分布式設置中派上用場,作為集中日志的一種方式。 Airflow 原生支持遠程日志記錄,參見例如thisthis
  • 定義worker_autoscale而不是concurrency將允許在工作負載增加/減少時動態啟動/停止新進程
  • 在工作人員的環境中將環境變量DUMB_INIT_SETSID設置為0允許熱關機(請參閱文檔
  • 將卷添加到 Docker Compose 中指向 Airflow 的base_log_folder的工作人員允許在本地安全地保存工作人員日志。 例子:
# docker-compose.yml

services:
  airflow-worker:
     ...
      volumes:
        - worker_logs:/airflow/logs
     ...
  ...
volumes:
  worker_logs:

我無法解決我的問題。你能幫幫我嗎。我用 docker 開發了我的 airflow 和 celery。 你能給我發一份 MainNode docker-compose.yml 和 Woker docker-compose.yml,非常感謝!!!

*** Log file does not exist: /opt/airflow/logs/dag_id=example_bash_operator/run_id=scheduled__2022-09-23T00:00:00+00:00/task_id=runme_1/attempt=1.log
*** Fetching from: http://eosbak01.zzz.ac.cn:8793/log/dag_id=example_bash_operator/run_id=scheduled__2022-09-23T00:00:00+00:00/task_id=runme_1/attempt=1.log
*** !!!! Please make sure that all your Airflow components (e.g. schedulers, webservers and workers) have the same 'secret_key' configured in 'webserver' section and time is synchronized on all your machines (for example with ntpd) !!!!!
****** See more at https://airflow.apache.org/docs/apache-airflow/stable/configurations-ref.html#secret-key
****** Failed to fetch log file from worker. Client error '403 FORBIDDEN' for url 'http://eosbak01.zzz.ac.cn:8793/log/dag_id=example_bash_operator/run_id=scheduled__2022-09-23T00:00:00+00:00/task_id=runme_1/attempt=1.log'
For more information check: https://httpstatuses.com/403

工作節點

[airflow@eosbak01 deploy]$ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED              STATUS                        PORTS      NAMES
2ef39a54de97   apache/airflow:2.3.4   "/usr/bin/dumb-init …"   About a minute ago   Up About a minute (healthy)   8080/tcp   deploy_airflow-worker_

主節點

[airflow@eosbak02 deploy]$ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS                    PORTS                                                  NAMES
1e6a7e50831d   apache/airflow:2.3.4   "/usr/bin/dumb-init …"   26 minutes ago   Up 26 minutes (healthy)   0.0.0.0:5555->5555/tcp, :::5555->5555/tcp, 8080/tcp    deploy_flower_1
9afb5985b9f3   apache/airflow:2.3.4   "/usr/bin/dumb-init …"   27 minutes ago   Up 27 minutes (healthy)   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              deploy_airflow-webserver_1
80132177ae3d   apache/airflow:2.3.4   "/usr/bin/dumb-init …"   27 minutes ago   Up 27 minutes (healthy)   8080/tcp                                               deploy_airflow-triggerer_1
6ea5a0ed7dec   apache/airflow:2.3.4   "/usr/bin/dumb-init …"   27 minutes ago   Up 27 minutes (healthy)   8080/tcp                                               deploy_airflow-scheduler_1
2787acb189ad   mysql:8.0.27           "docker-entrypoint.s…"   29 minutes ago   Up 29 minutes (healthy)   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   deploy_mysql_1
057af26f6070   redis:latest           "docker-entrypoint.s…"   29 minutes ago   Up 29 minutes (healthy)   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp              deploy_redis_1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM