在 Docker 上运行时,提供气流日志文件不存在错误



调度程序和Web服务器在不同的容器上运行,当我运行DAG并检查Web服务器上的日志时,它向我显示了这个特定的错误。

*** Log file does not exist: /usr/local/airflow/logs/indexing/index_articles/2019-12-31T00:00:00+00:00/1.log
*** Fetching from: http://465e0f4a4332:8793/log/indexing/index_articles/2019-12-31T00:00:00+00:00/1.log
*** Failed to fetch log file from worker. HTTPConnectionPool(host='465e0f4a4332', port=8793): Max retries exceeded with url: /log/indexing/index_articles/2019-12-31T00:00:00+00:00/1.log (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f0a143700d0>: Failed to establish a new connection: [Errno 111] Connection refused'))

我设置了气流变量,如其他类似问题中所述,我在 cfg 文件上更改的唯一变量就是这些。

AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres:5432/airflow
AIRFLOW__CORE__LOAD_EXAMPLES=False
AIRFLOW__CORE__BASE_URL = http://{hostname}:8080

我手动检查并且日志文件正在正确生成,我假设唯一的问题是无法通过 Web 服务器容器公开访问 url。我不确定我在哪里搞砸了它,我正在本地运行和测试它。

问题是因为 docker 容器不共享文件系统。这由响应的第一行指示。

然后,Airflow 回退到尝试通过 HTTP 获取日志文件,如响应的第二行所指示的那样。其他答案尝试通过覆盖HOSTNAME_CALLABLE函数来解决此问题,但是除非主机通过HTTP公开日志文件,否则这将不起作用。

解决方案是通过挂载共享卷来解决第一个问题。

在 docker-compose.yml 文件中,添加一个名为logs-volume的新卷。

volumes:
logs-volume:

然后,同样在 docker-compose.yml 文件中,为每个服务将此卷挂载到所需的日志目录,在/usr/local/airflow/logs/的情况下:

services: 
worker:
volumes:
- logs-volume:/usr/local/airflow/logs
webserver:
volumes:
- logs-volume:/usr/local/airflow/logs

工作人员的主机名未正确解析。 添加文件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

我在使用Airflow中的 docker-compose 时遇到了同样的问题CeleryExecutor.我的问题与运行airflow webserver命令的容器无法访问在其他机器上运行的celery worker节点有关。

我通过在工作节点中公开预期的端口并在运行 Web 服务器的主节点中添加 DNS 条目来解决这个问题。

芹菜工人 docker 撰写文件:

...
services:
airflow-worker:
<<: *airflow-common
hostname: worker_my_hostname
ports:
- 8793:8793
command: celery worker
restart: always

主节点 docker-compose 文件部分:

---
version: "3"
x-airflow-common: &airflow-common
extra_hosts:
- "worker_my_hostname:10.10.59.200"
...

包含原始失败消息的日志:

Failed to fetch log file from worker. HTTPConnectionPool(host='worker_my_hostname', port=8793): Max retries exceeded with url: /log/dag_id/task_id/2021-05-14T20:24:49.433789+00:00/1.log (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f91cb1b7ac8>: Failed to establish a new connection: [Errno 111] Connection refused',))

解决方案:在"气流.cfg"文件中设置标志"AIRFLOW__CORE__REMOTE_LOGGING=True">

最新更新