1. 基础信息
airflow 版本:2.5.3
2. 问题现象
airflow web-server 界面,看到某些任务的具体运行日志,只有少量日志,如下图所示:
具体日志内容如下:
na-fudao-data-airflow-test-2-21.alibji.zybang.com
*** Log file does not exist: /data/homework/workflow/airflow/logs/dag_id=warehouse_bzr_dws_run_1min/run_id=scheduled__2024-08-30T09:52:00+00:00/task_id=dws_trade_order_bzr.middle_expand/attempt=1.log
*** Fetching from: http://na-fudao-data-airflow-test-2-21.alibji.zybang.com:8793/log/dag_id=warehouse_bzr_dws_run_1min/run_id=scheduled__2024-08-30T09:52:00+00:00/task_id=dws_trade_order_bzr.middle_expand/attempt=1.log
*** Failed to fetch log file from worker. [Errno 111] Connection refused
日志内容解释:
- 第一行:表示该任务被分配到哪个 worker 节点上运行了,显示的是节点的主机名称 hostname
- 第二行:表示从 web-server 机器上查找本地日志文件,然后找不到。这是正常的,一般来说,如果是搭建的集群形式的 airflow,web-server 和 worker 是分节点部署的,web-server 节点上没有 worker 运行,所以 web-server 节点上是没有本地日志文件的。
- 第三行:表示通过访问 http 的方式,从 worker 节点上拉取日志,后面是具体的访问地址。注意域名后面的端口号
8793
,这个端口号是 worker 节点上提供给 web-server 进程,用于远程拉取日志文件使用的。 - 第四行:表示 web-server 通过 http 方式,从 worker 节点上获取日志文件失败了,原因是连接被拒绝。
3. 问题分析
日志内容解释中第 4 点提到,web-server 通过 http 方式,从 worker 节点上获取日志,连接被拒绝。然后我们可以登录日志中提到的节点上,查看对应的端口号是否有进程在运行。使用 root
用户登录对应节点,然后运行下面的命令(使用搭建 airflow 的用户也可以):
netstat -aptn | grep 8793
然后发现没有任何信息输出,说明该节点上对应的端口号的用于提供元策划给你日志访问的服务进程不存在。
4. 解决方案
问题分析中已经提到了,在对应的 worker 节点上,发现 8793 这个端口,并没有对应的服务在运行,因此我们只需要把这个服务启动即可。
不过 airflow 并没有单独的这个服务的进程启动方式,它是 worker 服务中的一部分,所以我们只需要重启一下 worker 服务即可,重启命令可参考下面的命令代码:
/data/homework/anaconda3/envs/airflow/bin/airflow celery worker --daemon --pid /data/homework/workflow/airflow/process/worker/airflow-worker.pid --stdout /data/homework/workflow/airflow/process/worker/airflow-worker.out --stderr /data/homework/workflow/airflow/process/worker/airflow-worker.err --log-file /data/homework/workflow/airflow/process/worker/airflow-worker.log
注意前面的路径,这是你当初搭建 airflow 时,启动的 python 虚拟环境地址。
启动之后,再次观察该机器上 8793 端口的服务情况,运行如下命令:
netstat -aptn | grep 8793
发现输出如下:
表示该节点上的 8793 端口有对应的服务在运行。
再次观察 airflow 界面任务日志,发现正常输出了