气流-无法从工作线程获取日志文件。 404客户端错误:找不到网址

时间:2019-04-09 08:53:32

标签: airflow airflow-scheduler

我正在用Celery Executor运行Airflowv1.9。我有5位气流工人在5台不同的机器上运行。气流调度程序也在这些机器之一中运行。我已经在这5台计算机上复制了相同的airflow.cfg文件。 我每天在不同的队列(例如DEV,QA等)(每个工作程序都使用一个单独的队列名称运行)中设置了正常的工作流程。

在一个工作进程中调度DAG时(以前没有为此工作进程/机器设置其他DAG),我看到了第一个任务中的错误,因此下游任务失败了:

*** Log file isn't local.
*** Fetching here: http://<worker hostname>:8793/log/PDI_Incr_20190407_v2/checkBCWatermarkDt/2019-04-07T17:00:00/1.log
*** Failed to fetch log file from worker. 404 Client Error: NOT FOUND for url: http://<worker hostname>:8793/log/PDI_Incr_20190407_v2/checkBCWatermarkDt/2019-04-07T17:00:00/1.log

我已配置MySQL以存储DAG元数据。当我检查task_instance表时,我看到针对该任务填充了正确的主机名。

我还检查了日志位置,发现正在创建日志。

airflow.cfg代码段:

base_log_folder = /var/log/airflow
base_url = http://<scheduler ip>:8082
worker_log_server_port = 8793
api_client = airflow.api.client.local_client
endpoint_url = http://localhost:8080

我在这里想念什么?为了解决此问题,我还需要检查哪些配置?

1 个答案:

答案 0 :(得分:1)

好像没有正确解析工作者的主机名。 添加文件hostname_resolver.py

import os
import socket
import requests
def resolve():
    """
    Resolves Airflow external hostname for accessing logs on a worker
    """
    if 'AWS_REGION' in os.environ:
        # Return EC2 instance hostname:
        return requests.get(
            'http://169.254.169.254/latest/meta-data/local-ipv4').text
    # Use DNS request for finding out what's our external IP:
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(('1.1.1.1', 53))
    external_ip = s.getsockname()[0]
    s.close()
    return external_ip

并导出:AIRFLOW__CORE__HOSTNAME_CALLABLE=airflow.hostname_resolver:resolve