logging - 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
,但这并没有帮助。无论我使用PythonOperator
orBashOperator
是不是 K8sExecutors 日志在运行时不可用?仅在那之后?或者是否有一些我必须缺少的配置?
解决方案
我遇到了同样的问题,这些都是对我有帮助的东西——值得你检查一下
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)和目录所有权和模式
推荐阅读
- javascript - 如何在angular5项目中使用dll
- tensorflow-lite - TF-lite 模型测试失败并出现运行时错误
- javascript - 拖放功能在触摸设备中不起作用?
- php - 基于其他输入值的表单输入实时计算
- html - Background-color:rgba() - Safari 透明度 css 错误
- networking - 为什么 echo ping 没有到达目的地?
- symfony - Symfony 4:如何通过管理员用户将用户添加到数据库?
- asp.net-core - ASP.NET Core 中的 gRPC 日志记录
- angular - 非法使用过滤器打字稿
- flutter - 单击时无法将数据传递到新屏幕