MacOS下Docker部署Airflow失败:扩容内存仍无法正常运行
Airflow 2.4.2 Docker部署Webserver健康检查失败解决(MacOS 12.6.2,8GB内存)
环境与问题
- 系统:MacOS 12.6.2(8GB物理内存)
- Airflow镜像:
apache/airflow:2.4.2 - .env配置:
AIRFLOW_IMAGE_NAME=apache/airflow:2.4.2 AIRFLOW_UID=50000
执行docker-compose up -d后,webserver容器始终无法进入健康状态,日志循环输出worker超时:
2023-01-12 03:26:30 [2023-01-12 11:26:30 +0000] [79] [CRITICAL] WORKER TIMEOUT (pid:215) 2023-01-12 03:26:31 [2023-01-12 11:26:31 +0000] [79] [CRITICAL] WORKER TIMEOUT (pid:216)
已尝试调整Docker内存(4-8GB)、CPU、Swap及磁盘限额,问题依旧;注释redis、airflow-worker、airflow-triggerer组件后容器可正常运行,但业务依赖这些组件。
资源受限下的解决方法
1. 延长Webserver Worker超时时间
默认gunicorn worker超时为30秒,内存不足时Webserver启动慢,容易触发超时。修改docker-compose.yaml中airflow-webserver服务的配置:
services: airflow-webserver: environment: - GUNICORN_CMD_ARGS="--timeout 120" healthcheck: test: ["CMD", "curl", "--fail", "http://localhost:8080/health"] interval: 30s timeout: 30s retries: 5 start_period: 300s # 给足启动缓冲时间
2. 削减组件资源占用
- 减少Worker并发数:默认Celery Worker并发数为2,改成1可降低内存消耗,在airflow-worker服务中添加:
airflow-worker: environment: - AIRFLOW__CELERY__WORKER_CONCURRENCY=1
- 关闭不必要功能:在.env中添加配置,禁用示例DAG、降低日志级别:
AIRFLOW__CORE__LOAD_EXAMPLES=False AIRFLOW__LOGGING__LOGGING_LEVEL=WARN
3. 给单个容器设置资源限额
避免某一容器抢占过多资源导致其他组件崩溃,在docker-compose.yaml中给各服务添加资源限制:
services: airflow-webserver: deploy: resources: limits: memory: 2G reservations: memory: 1G airflow-worker: deploy: resources: limits: memory: 2G reservations: memory: 1G redis: deploy: resources: limits: memory: 512M reservations: memory: 256M
4. 切换轻量级Executor
如果Celery+Redis组合资源占用过高,可先切换到LocalExecutor(无需Redis,资源占用更低),在.env中设置:
AIRFLOW__CORE__EXECUTOR=LocalExecutor
待Webserver稳定后,再根据业务需求评估是否换回CeleryExecutor;测试场景下也可使用SequentialExecutor(单进程,资源占用最低):
AIRFLOW__CORE__EXECUTOR=SequentialExecutor
内容的提问来源于stack exchange,提问作者Austin Wolff
相关产品推荐
相关产品推荐

