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下降):
我认为理论上我可以减少枪支工人的数量(它默认为4),但我不确定所有的/usr/bin/dockerd
过程是什么.如果Docker使事情变得复杂,我可以删除它,但它使更改的部署变得非常简单,如果可能的话我宁愿不删除它.
use*_*886 25
我还尝试了一切可以降低CPU使用率的事情,Matthew Housley关于MIN_FILE_PROCESS_INTERVAL的建议就是诀窍.
至少直到气流1.10出现......然后CPU使用再次通过屋顶.
因此,我需要做的就是让气流在标准的数字海洋液滴上运行良好,并使用2gb的RAM和1个vcpu:
防止气流一直重新加载dags并设置:
AIRFLOW__SCHEDULER__MIN_FILE_PROCESS_INTERVAL=60
气流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;
如果升级为使用新的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内存.
小智 16
我刚遇到这样的问题.在t2.xlarge实例中,Airflow大约消耗了一个完整的vCPU,其中绝大部分来自调度程序容器.检查调度程序日志,我可以看到它每秒处理我的单个DAG不止一次,即使它每天只运行一次.我发现MIN_FILE_PROCESS_INTERVAL被设置为默认值0,因此调度程序在DAG上循环.我将进程间隔更改为65秒,而Airflow现在在t2.medium实例中使用的vCPU不到10%.
对于初学者,您可以使用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)
归档时间: |
|
查看次数: |
7012 次 |
最近记录: |