Airbnb Airflow使用所有系统资源

问题描述 投票:27回答:4

我们使用LocalExecutor为我们的ETL设置了Airbnb / Apache Airflow,当我们开始构建更复杂的DAG时,我们注意到Airflow已经开始使用大量的系统资源。这对我们来说是令人惊讶的,因为我们主要使用Airflow来协调在其他服务器上发生的任务,因此Airflow DAG花费大部分时间等待它们完成 - 在本地没有实际执行。

最大的问题是Airflow似乎在任何时候都占用了100%的CPU(在AWS t2.medium上),并使用超过2GB的内存和默认的airflow.cfg设置。

如果相关,我们使用docker-compose运行容器两次运行Airflow;曾经作为scheduler,曾经作为webserver

我们在这做错了什么?这是正常的吗?

编辑:这是htop的输出,由%Memory使用排序(因为这似乎是现在的主要问题,我得到了CPU):Htop Htop2

我认为理论上我可以减少枪支工人的数量(它默认为4),但我不确定所有的/usr/bin/dockerd工艺是什么。如果Docker使事情变得复杂,我可以删除它,但它使更改的部署变得非常简单,如果可能的话我宁愿不删除它。

docker amazon-ec2 airflow
4个回答
23
投票

我还尝试了一切可以降低CPU使用率的事情,Matthew Housley关于MIN_FILE_PROCESS_INTERVAL的建议就是诀窍。

至少直到气流1.10出现......然后CPU使用再次通过屋顶。

因此,我需要做的就是让气流在标准的数字海洋液滴上运行良好,并使用2gb的RAM和1个vcpu:

1. Scheduler File Processing

防止气流一直重新加载dags并设置:AIRFLOW__SCHEDULER__MIN_FILE_PROCESS_INTERVAL=60

2. Fix airflow 1.10 scheduler bug

气流1.10中的AIRFLOW-2895错误导致高CPU负载,因为调度程序不间断地循环。

它已经固定在master中,并且有望被包含在airflow 1.10.1中,但它可能需要数周或数月才能发布。与此同时,这个补丁解决了这个问题:

--- jobs.py.orig    2018-09-08 15:55:03.448834310 +0000
+++ jobs.py     2018-09-08 15:57:02.847751035 +0000
@@ -564,6 +564,7 @@

         self.num_runs = num_runs
         self.run_duration = run_duration
+        self._processor_poll_interval = 1.0

         self.do_pickle = do_pickle
         super(SchedulerJob, self).__init__(*args, **kwargs)
@@ -1724,6 +1725,8 @@
             loop_end_time = time.time()
             self.log.debug("Ran scheduling loop in %.2f seconds",
                            loop_end_time - loop_start_time)
+            self.log.debug("Sleeping for %.2f seconds", self._processor_poll_interval)
+            time.sleep(self._processor_poll_interval)

             # Exit early for a test mode
             if processor_manager.max_runs_reached():

patch -d /usr/local/lib/python3.6/site-packages/airflow/ < af_1.10_high_cpu.patch;涂抹它

3. RBAC webserver high CPU load

如果升级为使用新的RBAC Web服务器UI,您可能还会注意到Web服务器持续使用大量CPU。

由于某种原因,RBAC接口在启动时使用了大量CPU。如果您在低功率服务器上运行,则可能导致Web服务器启动速度非常慢并且CPU使用率会永久性高。

我已将此错误记录为AIRFLOW-3037。要解决它,您可以调整配置:

AIRFLOW__WEBSERVER__WORKERS=2 # 2 * NUM_CPU_CORES + 1
AIRFLOW__WEBSERVER__WORKER_REFRESH_INTERVAL=1800 # Restart workers every 30min instead of 30seconds
AIRFLOW__WEBSERVER__WEB_SERVER_WORKER_TIMEOUT=300 #Kill workers if they don't start within 5min instead of 2min

通过所有这些调整,我的气流在空闲时间内仅使用少量CPU,数字海洋标准液滴,1 vcpu和2gb内存。


16
投票

我刚遇到这样的问题。在t2.xlarge实例中,Airflow大约消耗了一个完整的vCPU,其中绝大部分来自调度程序容器。检查调度程序日志,我可以看到它每秒处理我的单个DAG超过一次,即使它每天只运行一次。我发现MIN_FILE_PROCESS_INTERVAL被设置为默认值0,因此调度程序正在循环遍历DAG。我将进程间隔更改为65秒,而Airflow现在在t2.medium实例中使用的vCPU不到10%。


2
投票

尝试在airflow.cfg中更改以下配置

# after how much time a new DAGs should be picked up from the filesystem
min_file_process_interval = 0

# How many seconds to wait between file-parsing loops to prevent the logs from being spammed.
min_file_parsing_loop_time = 1

0
投票

对于初学者,您可以使用htop来监视和调试CPU使用情况。

我建议您在同一个docker容器上运行webserver和scheduler进程,这将减少在ec2 t2.medium上运行两个容器所需的资源。 Airflow worker需要资源来下载数据并在内存中读取数据,但webserver和scheduler是非常轻量级的流程。确保在运行Web服务器时,您正在使用cli控制在实例上运行的工作器数。

airflow webserver [-h] [-p PORT] [-w WORKERS]
                         [-k {sync,eventlet,gevent,tornado}]
                         [-t WORKER_TIMEOUT] [-hn HOSTNAME] [--pid [PID]] [-D]
                         [--stdout STDOUT] [--stderr STDERR]
                         [-A ACCESS_LOGFILE] [-E ERROR_LOGFILE] [-l LOG_FILE]
                         [-d]
© www.soinside.com 2019 - 2024. All rights reserved.