首页 > 解决方案 > Airflow KubernetesExecutor,在执行程序 pod 完成之前,日志不会显示在 UI 中

问题描述

我已经开始使用 KubernetesExecutor,并且我已经设置了一个带有 AWS EFS 的 PV/PVC 来为我的 dag 存储日志。我也在使用 s3 远程日志记录。

dag 完成后,所有日志记录都运行良好。但是,我希望能够看到我的作业的日志,因为它们正在运行长时间运行的作业。

当我执行到我的调度程序 pod 时,当执行程序 pod 正在运行时,由于共享 EFS,我能够看到.log当前正在运行的作业的文件。但是,当我cat查看日志文件时,只要执行程序仍在运行,我就看不到日志。但是,一旦执行程序完成,我可以cat在文件和气流 UI 中看到完整的日志。

另一方面,奇怪的是,当我在执行程序 pod 运行时执行它,并且我cat在共享 EFS 中的日志文件完全相同时,我能够在作业中看到正确的日志,当我立即cat从调度程序或检查 UI,我还可以看到直到那时的日志。

因此,似乎当我cat在执行程序 pod 中时,它会导致日志以某种方式被刷新,以便它在任何地方都可用。为什么日志没有定期刷新?

这是我正在设置的配置变量,请注意这些环境变量是在我的 webserver/scheduler 和 executor pod 中设置的:

# ----------------------
# For Main Airflow Pod (Webserver & Scheduler)
# ----------------------
export PYTHONPATH=$HOME
export AIRFLOW_HOME=$HOME
export PYTHONUNBUFFERED=1

# Core configs
export AIRFLOW__CORE__LOAD_EXAMPLES=False
export AIRFLOW__CORE__SQL_ALCHEMY_CONN=${AIRFLOW__CORE__SQL_ALCHEMY_CONN:-postgresql://$DB_USER:$DB_PASSWORD@$DB_HOST:5432/$DB_NAME}
export AIRFLOW__CORE__FERNET_KEY=$FERNET_KEY
export AIRFLOW__CORE__DAGS_FOLDER=$AIRFLOW_HOME/git/dags/$PROVIDER-$ENV/

# Logging configs
export AIRFLOW__LOGGING__BASE_LOG_FOLDER=$AIRFLOW_HOME/logs/
export AIRFLOW__LOGGING__REMOTE_LOGGING=True
export AIRFLOW__LOGGING__REMOTE_LOG_CONN_ID=aws_default
export AIRFLOW__LOGGING__REMOTE_BASE_LOG_FOLDER=s3://path-to-bucket/airflow_logs
export AIRFLOW__LOGGING__TASK_LOG_READER=s3.task
export AIRFLOW__LOGGING__LOGGING_CONFIG_CLASS=config.logging_config.LOGGING_CONFIG

# Webserver configs
export AIRFLOW__WEBSERVER__COOKIE_SAMESITE=None

我的日志配置看起来像这里的问题

我认为这可能是添加的 python 缓冲问题PYTHONUNBUFFERED=1,但这并没有帮助。无论我使用PythonOperatororBashOperator

是不是 K8sExecutors 日志在运行时不可用?仅在那之后?或者是否有一些我必须缺少的配置?

标签: loggingkubernetesairflowkubernetesexecutor

解决方案


我遇到了同样的问题,这些都是对我有帮助的东西——值得你检查一下

  • PYTHONUNBUFFERED=1还不够,还需要实时查看日志。请保留
  • 在 web、调度程序和 pod_template(执行程序)中安装 EFS。
  • 您在任务完成后完成日志文件的经验让我想知道您用于日志的 PVC 是否具有 ReadWriteMany 访问模式
  • 您在不同 pod 中的路径是否相同?它们是否包括完整的任务格式,例如efs/logs/dag_that_executes_via_KubernetesPodOperator/task1/2021-09-21T19\:00\:21.894859+00\:00/1.log?问是因为,在我在每个地方(调度程序、Web、pod_template)连接 EFS 之前,我只能访问不包括任务名称和任务时间的执行程序日志
  • 让 EFS 日志文件夹属于气流(对我来说是 uid 50000,因为可能必须从不同的地方准备它),组根,模式 755
  • 没有设置 AIRFLOW__LOGGING__LOGGING_CONFIG_CLASS。在引入自定义日志配置之前,尝试让事情尽可能正常运行

如果您设置了远程日志记录,我知道在任务完成后,UI 中的第一行会说Reading remote log from,但是当任务运行时第一行对您说什么?reading remote或提及本地日志文件的使用?

  • 如果它说的是远程,这意味着您没有在每个地方都连接 EFS。
  • 如果它说的是本地,我会检查你的 EFS 设置(readwritemany)和目录所有权和模式

推荐阅读