![](/img/trans.png)
[英]How to add new user to docker image when running distributed airflow architecture using docker-compose
[英]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"
*請注意,在您擁有共享驅動器的特定情況下,我認為日志將在本地找到。
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
如果您有繁重的工作負載和高並發,您可能需要調整 Postgres 設置,例如max_connections
和shared_buffers
。 這同樣適用於主機操作系統網絡設置,例如ip_local_port_range
或somaxconn
。
在我在初始集群設置過程中遇到的任何問題中, Flower
和工作程序執行日志始終提供有用的詳細信息和錯誤消息,包括任務級日志和 Docker-Compose 服務日志,即: docker-compose logs --tail=10000 airflow-worker > worker_logs.log
。
希望對你有用!
以下注意事項建立在公認的答案之上,因為我認為它們可能與任何新的 Airflow Celery 設置相關:
worker_autoscale
而不是concurrency
將允許在工作負載增加/減少時動態啟動/停止新進程DUMB_INIT_SETSID
設置為0
允許熱關機(請參閱文檔)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.