我有CeleryExecutor
和2个工作人员在运行Airflow。当我的DAG运行时,这些任务会在运行它们的工作程序的文件系统上生成一个日志。但是,当我进入Web UI并单击任务日志时,我得到:
*** Log file does not exist: /usr/local/airflow/logs/test_dag/task2/2019-11-01T18:12:16.309655+00:00/1.log
*** Fetching from: http://70953abf1c10:8793/log/test_dag/task2/2019-11-01T18:12:16.309655+00:00/1.log
*** Failed to fetch log file from worker. HTTPConnectionPool(host='70953abf1c10', port=8793): Max retries exceeded with url: /log/test_dag/task2/2019-11-01T18:12:16.309655+00:00/1.log (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f329c3a2650>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))
http://70953abf1c10:8793/
显然不是工作人员的正确IP。但是,celery@70953abf1c10
是Celery中此工作人员的名字。似乎Airflow试图从Celery那里学习工作者的URL,但是Celery却给了工作者的名字。我该怎么解决?
答案 0 :(得分:1)
最简单的解决方案是使用包含主机名的默认名称,或者显式设置其中具有有效主机名的节点名称(例如:celery1@hostname.domain.tld)。
如果使用默认设置,则运行气流工作程序的计算机将主机名错误地设置为70953abf1c10
。您应该通过运行以下命令来解决此问题:hostname -B hostname.domain.tld
答案 1 :(得分:1)
DejaLekic的解决方案使我走上了正确的轨道,但这并不完全清楚,因此我添加了此答案以进行澄清。
就我而言,我在Docker容器上运行Airflow。默认情况下,Docker容器使用称为bridge
的桥接网络。这是一个特殊的网络,不会自动解析主机名。我在Docker中创建了一个名为airflow-net
的新桥接网络,并让我所有的Airflow容器都加入了该容器(不需要保留默认的bridge
)。然后一切都正常了。
默认情况下,Docker将主机名设置为容器的十六进制ID。在我的情况下,容器ID以70953abf1c10
开头,主机名也是70953abf1c10
。有一个用于指定主机名的Docker参数,但事实证明它不是必需的。将容器连接到新的桥接网络后,70953abf1c10
开始解析该容器。