airflow-scheduler - 大量任务时,气流调度程序不调度(或缓慢)
问题描述
我正在使用 Google Cloud Composer(版本:composer-1.10.2-airflow-1.10.6)上的气流。
我意识到当有很多任务要处理时,调度程序不会调度任务(参见下面的甘特图)
(不要注意颜色,红色任务是“createTable Operators”,如果表已经存在则失败,因此它们必须在 DAG 的下一部分(重要的部分)运行之前失败 5 次)
任务之间有几个小时的差距!(例如上午 10 点到下午 15 点之间的 5 小时,但什么也没发生)
通常它适用于大约 40 个 DAG,每个 DAG 大约有 100-200 个任务(有时更多)。但最近我添加了 2 个有很多任务的 DAG(每个约 5000 个),调度程序非常慢或不调度任务。在屏幕截图中,我在下午 15 点暂停了 2 个有很多任务的 DAG,调度程序又回来了,工作正常。
你有什么解决办法吗?
Airflow 旨在成为处理“无限”数量任务的工具。
以下是有关我的环境的一些信息:
- 版本:composer-1.10.2-airflow-1.10.6
- 集群大小:6(12vCPU,96GB 内存)
以下是有关气流配置的一些信息:
╔════════════════════════════════╦═══════╗
║ Airflow parameter ║ value ║
╠════════════════════════════════╬═══════╣
║ -(celery)- ║ ║
║ worker_concurrency ║ 32 ║
║ -(webserver)- ║ ║
║ default_dag_run_display_number ║ 2 ║
║ workers ║ 2 ║
║ worker_refresh_interval ║ 60 ║
║ -(core)- ║ ║
║ max_active_runs_per_dag ║ 1 ║
║ dagbag_import_timeout ║ 600 ║
║ parallelism ║ 200 ║
║ min_file_process_interval ║ 60 ║
║ -(scheduler)- ║ ║
║ processor_poll_interval ║ 5 ║
║ max_threads ║ 2 ║
╚════════════════════════════════╩═══════╝
谢谢您的帮助
编辑:
我的 26 个 DAG 是由单个 .py 文件通过解析一个巨大的 JSON 变量来创建的,以创建所有 DAG 和任务。
可能问题出在这里,因为今天 Airflow 正在调度来自其他 DAG 的任务,而不是我描述的 26 个(尤其是 2 个大 DAG)。更准确地说,Airflow 有时会调度我的 26 个 DAG 的任务,但它更容易和更频繁地调度其他 DAG 的任务。
解决方案
高任务间延迟通常表明存在与调度程序相关的瓶颈(而不是与工作人员相关的瓶颈)。即使一遍又一遍地运行相同的 DAG,Composer 环境仍然可能会遇到这样的性能瓶颈,因为每次工作的分布可能不同,或者后台运行的进程可能不同。
首先,我建议增加调度程序可用的线程数 ( scheduler.max_threads
),然后确保您的调度程序不会消耗它所在节点的所有 CPU。您可以通过确定调度程序所在节点的位置,然后在 Cloud Console 中检查来检查调度程序所在节点的 CPU 指标。要查找节点名称:
# Obtain the Composer namespace name
kubectl get namespaces | grep composer
# Check for the scheduler
kubectl get pods -n $NAMESPACE -o wide | grep scheduler
如果上述方法没有帮助,那么调度程序也有可能故意阻塞某个条件。要检查调度程序检查要运行的任务时评估的所有条件,请设置core.logging_level=DEBUG
. 在调度程序日志(您可以在 Cloud Logging 中对其进行过滤)中,您可以检查所有通过或失败的条件,以便任务运行或保持排队。
推荐阅读
- mysql - 从数据库中获取数据以在 Scala 中写入 Json 格式
- css - 如何去除 React Link 的文字装饰?
- bazel - Bazel 范围内用于运行 shell 命令的目标的工具列表
- angular - 没有本地通知的 Ionic 4 推送通知
- javascript - JS在函数中创建全局变量并在另一个函数中使用它
- c++ - Cmakelists 与柯南
- php - Symfony 二进制文件响应在下载过程结束时失败
- kubernetes - 具有公制数量的 pubsub 未确认消息的尖峰 kubernetes HPA
- python - 查找文本中短语之间的距离
- python - 如何在 Anaconda 安装程序中安装“sparse_dot_topn”包?