我第一次使用Apache-Airflow。我已经使Web服务器,SequentialExecutor和LocalExecutor正常工作,但是在将CeleryExecutor与Rabbitmq-server结合使用时遇到了问题。我目前有两个AWS EC2实例。
总结:我的工作人员无法连接到调度程序节点上的Rabbitmq服务器。每当我在工作程序实例上运行airflow worker
时,它都会给出:
- ** ---------- [config]
- ** ---------- .> app: airflow.executors.celery_executor:0x7f53a8dce400
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results: disabled://
- *** --- * --- .> concurrency: 16 (prefork)
-- ******* ----
--- ***** ----- [queues]
-------------- .> default exchange=default(direct) key=default
[2019-02-15 02:26:23,742: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
我遵循了所有可以在网上找到的指示。两个实例具有相同的airflow.cfg
文件,
[core]
executor = CeleryExecutor
[celery]
broker_url = pyamqp://username:password@hostname:port/virtual_host
和result_backend指向气流正在起作用的RDS上的同一MySQL数据库。
据我所知,无论如何,辅助节点始终尝试连接到本地Rabbitmq服务器,而完全忽略了我的airflow.cfg
文件中的broker_url。
我一直在研究源代码,并在celery/app/base.py
中注意到,如果我错误地注销了它在创建连接时在_get_config()
中获得的配置,则实际上在其中有两个值字典返回了。
BROKER_URL = None
broker_url = pyamqp://username:password@hostname:port/virtual_host
,所有连接逻辑似乎都指向BROKER_URL
键。
我尝试在BROKER_URL
中设置CELERY_BROKER_URL
和airflow.cfg
,但是似乎不区分大小写,并且忽略后者。为了查看是否可行,我修改了_get_config()
方法并入侵了:
s['BROKER_URL'] = s['broker_url']
return s
而且,正如我所期望的,一切都开始起作用。
我做错什么了吗?我确实宁愿不使用此技巧,但我不明白为什么它会忽略配置值。
谢谢!