Airflow 尝试使用 Worker ID 而不是 URL 来访问 celery Worker

Don*_*lon 5 celery airflow

我有 AirflowCeleryExecutor和 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'))
Run Code Online (Sandbox Code Playgroud)

http://70953abf1c10:8793/显然不是worker的正确IP。然而,celery@70953abf1c10 这是芹菜中这名工人的名字。看起来 Airflow 正在尝试从 Celery 学习工作人员的 URL,但 Celery 却给出了工作人员的名字。我该如何解决这个问题?

Don*_*lon 3

DejanLekic 的解决方案让我走上了正轨,但并不完全明显,所以我添加这个答案来澄清。

就我而言,我在 Docker 容器上运行 Airflow。默认情况下,Docker 容器使用名为 的桥接网络bridge。这是一个特殊的网络,不会自动解析主机名。我在 Docker 中创建了一个名为的新桥接网络,airflow-net并将所有 Airflow 容器加入到此网络中(bridge不需要保留默认值)。然后一切就正常了。

默认情况下,Docker 将主机名设置为容器的十六进制 ID。就我而言,容器 ID 开头为70953abf1c10,主机名也是70953abf1c10。Docker 有一个参数用于指定主机名,但事实证明没有必要。将容器连接到新的桥接网络后,70953abf1c10开始解析该容器。