气流尝试使用工人 ID 而不是 URL 访问芹菜工人
airflow tries to access celery workers using the worker ID instead of URL
我有 Airflow 运行 CeleryExecutor
和 2 个工人。当我的 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 却给出了工人的名字。我该如何解决这个问题?
最简单的解决方案是使用包含主机名的默认名称,或者显式设置其中包含有效主机名的节点名称(例如:celery1@hostname.domain.tld)。
如果您使用默认设置,那么机器 运行 气流工作者错误地将主机名设置为 70953abf1c10
。您应该通过 运行 解决此问题,例如:hostname -B hostname.domain.tld
DejanLekic 的解决方案让我走上了正确的轨道,但它并不十分明显,所以我添加了这个答案来澄清。
在我的例子中,我是 运行 Docker 容器上的气流。默认情况下,Docker 个容器使用名为 bridge
的桥接网络。这是一个不会自动解析主机名的特殊网络。我在 Docker 中创建了一个名为 airflow-net
的新桥接网络,并将我所有的 Airflow 容器都加入了这个网络(不需要保留默认值 bridge
)。然后一切正常。
默认情况下,Docker 将主机名设置为容器的十六进制 ID。在我的例子中,容器 ID 以 70953abf1c10
开头,主机名也是 70953abf1c10
。有一个 Docker 参数用于指定主机名,但事实证明它不是必需的。在我将容器连接到新的桥接网络后,70953abf1c10
开始解析到该容器。
我有 Airflow 运行 CeleryExecutor
和 2 个工人。当我的 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 却给出了工人的名字。我该如何解决这个问题?
最简单的解决方案是使用包含主机名的默认名称,或者显式设置其中包含有效主机名的节点名称(例如:celery1@hostname.domain.tld)。
如果您使用默认设置,那么机器 运行 气流工作者错误地将主机名设置为 70953abf1c10
。您应该通过 运行 解决此问题,例如:hostname -B hostname.domain.tld
DejanLekic 的解决方案让我走上了正确的轨道,但它并不十分明显,所以我添加了这个答案来澄清。
在我的例子中,我是 运行 Docker 容器上的气流。默认情况下,Docker 个容器使用名为 bridge
的桥接网络。这是一个不会自动解析主机名的特殊网络。我在 Docker 中创建了一个名为 airflow-net
的新桥接网络,并将我所有的 Airflow 容器都加入了这个网络(不需要保留默认值 bridge
)。然后一切正常。
默认情况下,Docker 将主机名设置为容器的十六进制 ID。在我的例子中,容器 ID 以 70953abf1c10
开头,主机名也是 70953abf1c10
。有一个 Docker 参数用于指定主机名,但事实证明它不是必需的。在我将容器连接到新的桥接网络后,70953abf1c10
开始解析到该容器。