Airbnb Airflow使用所有系统资源

jdo*_*dot 31 amazon-ec2 docker airflow

我们已经为我们的ETL设置了Airbnb/Apache Airflow LocalExecutor,并且当我们开始构建更复杂的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使事情变得复杂,我可以删除它,但它使更改的部署变得非常简单,如果可能的话我宁愿不删除它.

use*_*886 25

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

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

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

1.调度程序文件处理

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

2.修复气流1.10调度程序错误

气流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():
Run Code Online (Sandbox Code Playgroud)

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

3. RBAC webserver高CPU负载

如果升级为使用新的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
Run Code Online (Sandbox Code Playgroud)

通过所有这些调整,我的气流在空闲时间内只占CPU的几个百分点,在数字海洋标准液滴上使用1 vcpu和2gb内存.

  • 该补丁对我有用。您可能想要编辑您的答案,以准确解释如何为不熟悉的人(例如我自己)应用补丁。我试着简单地运行你给出的补丁命令,但它失败了。发现我必须将差异保存在一个名为“af_1.10_high_cpu.patch”的文件中。我的气流路径也与给定的不同。只是一个建议。再次感谢您的帮助。 (2认同)

小智 16

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


neh*_*ain 0

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

我建议您在同一个 docker 容器上运行 Web 服务器和调度程序进程,这将减少在 ec2 t2.medium 上运行两个容器所需的资源。Airflow 工作人员需要资源来下载数据并在内存中读取数据,但网络服务器和调度程序是非常轻量级的进程。确保当您运行 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]
Run Code Online (Sandbox Code Playgroud)