【问题标题】:Airflow KubernetesExecutor, logs do not show up in UI until after executor pods completeAirflow KubernetesExecutor,在执行程序 pod 完成之前,日志不会显示在 UI 中
【发布时间】:2021-01-28 00:59:59
【问题描述】:

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

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

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

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

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

这是我正在设置的配置变量,请注意这些环境变量是在我的 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

我的日志配置看起来像问题here中的配置

我认为这可能是一个 python 缓冲问题,所以添加了PYTHONUNBUFFERED=1,但这并没有帮助。无论我使用PythonOperator 还是BashOperator,都会发生这种情况

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

【问题讨论】:

    标签: logging kubernetes airflow kubernetesexecutor


    【解决方案1】:

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

    • 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 ?问是因为,在我在每个地方(调度程序、网络、pod_template)连接 EFS 之前,我只能访问不包括任务名称和任务时间的执行程序日志
    • 有 EFS 日志文件夹属于气流(对我来说 uid 50000,因为可能需要从不同的地方准备这个),组 root,模式 755
    • 没有设置 AIRFLOW__LOGGING__LOGGING_CONFIG_CLASS。在引入自定义日志记录配置之前,尝试让事情尽可能正常运行

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

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

    【讨论】:

      【解决方案2】:

      在这种情况下,气流为working as documented

      日志仅在任务完成后出现在您的 DFS 中。

      【讨论】:

      • 我知道日志只会在任务完成后显示在 S3 中,我的意思是在任务完成之后日志才会显示在共享 PVC/Airflow UI 中,除非我从 executor pod 中引发了一次刷新。
      • 想知道 ^ 这种行为是否也是预期的?
      猜你喜欢
      • 2018-09-16
      • 2019-12-10
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 2014-09-15
      • 1970-01-01
      相关资源
      最近更新 更多