下面为您列举使用 Airflow 过程中可能遇到的几个常见问题。
Q1:新加入的 DAG 文件为什么页面上没有展示?
Q2:需要对 DAG 做修改,应该注意什么?
Q3:怎么排查执行失败的任务?
Q4:如何手动重启失败的 DAG Run?
Q5:TaskInstance 看不到日志,应该怎么办?
Q6:怎么调整 Airflow 运行的并发度与行为模式?
Q7:Airflow UI 加载慢怎么调优?
Q8:一些跨 DAG 复用的工具类逻辑如何定义?
Airflow 会根据dag_dir_list_interval
参数定义的值,来决定从系统目录上解析新 DAG 文件的时间间隔,该值以秒为单位,默认是300。
若超过该值规定的时间还未出现该 DAG,请通过工单联系我们。
Airflow 对已被解析的 DAG 文件的更新,会根据配置min_file_process_interval
规定的时间间隔进行刷新。建议您在对 DAG 做更新过程中,保证该 DAG 没有具体任务在运行,以避免执行和更新冲突的问题。
当在 DAG 运行时对应的 DAG 代码文件发生变化,这里为您列举一些场景进行说明:
如果您删除了 DAG 中的某个 Task,且该 DAG 正在运行中,Airflow 会将其置为 "removed" 状态,并且打印如下日志:State of this instance has been externally set to removed. Taking the poison pill.
如果您往 DAG 中添加了 Task,在 Airflow 刷新后,该步骤会在 UI 上可见,并且后续的 DAG Run 中会进行步骤执行,而历史的 DAG Run 会按照新的 DAG 定义进行展示,只不过面对新增 Task 的执行情况则展示为空。
如果您修改了 DAG 中的某个 Task 的逻辑,这个更改会作用于尚未执行与尚未完成的 TaskInstance。
从原则上讲,一般我们不应该修改 DAG 中的定义,更好的做法是新起一个 DAG 文件来实现新的工作流,然后按需要关闭旧的 DAG,使其不再调度。
进入 Airflow UI 的 DAGs 页面,从页面的 DAG 列表中找到对应 DAG 的 Runs,点击红色的部分,进入该 DAG 执行失败的 DAG Runs List。
从该 List 中找到具体某次失败的 DAG Run,从 DAG id 点击进入 DAG 详情页面,您会来到 Graph 子页,会列出该 DAG Run 的图示,方框对应具体的 TaskInstance。
点击执行失败的具体 Task,在弹窗中点击 Log,进行日志查看
进入 Airflow UI 的 DAGs 页面,从页面的 DAG 列表中找到对应 DAG 的 Runs,点击红色的部分,进入该 DAG 执行失败的 DAG Runs List。
从该 List 中找到具体某次失败的 DAG Run,勾选上之后 Clear 状态即可。Scheduler 会当作此任务未运行过,然后重新执行调度。
在某些情况下,在查看日志时您可能会看到下图的报错,这时请尝试按以下方案尝试解决:
参考上一条指引,手动重启该 DAG Run。
检查集群各台机器上是否都持有本次调度的 dag 文件。
EMR 会在集群的每一台机器上都部署 Airflow Worker 进程,参与调度的机器都必须在本地持有运行的 DAG 源文件,否则就会出现上述问题。分发 DAG 可以参考 快速开始-步骤三。
提工单联系我们。
若按照上述方法排查仍无法解决问题,请您联系我们,开发人员将为您提供一对一支持。
Airflow 中有三个关键的全局配置,定义集群的整体与 DAG 级别的并发度,决定 Worker 进程的数量。
在文档 Airflow 关键配置 中,有相关的描述说明。
DAGs 在定义时有参数可以改善并发性能:
max_active_tasks
: 覆盖 max_active_tasks_per_dag.
max_active_runs
: 覆盖 max_active_runs_per_dag.
Operator/Tasks 在定义时也有参数调整并发度,决定优先级:
max_active_tis_per_dag
: 该参数定义了该任务在 所有 的 dag_runs 中的总体并发度。
pool
: 参见 Pools,Pools 在 Airflow 中,定义了在其中运行的 Tasks 的最大整体并发度,可供用户根据对端系统的负载实际进行分类调整。
priority_weight
: 参见 Priority Weights,Airflow 中的优先级策略默认支持上游优先、下游优先与绝对值三种策略。
如果您的 Airflow UI 首页加载耗时比较长,可以适当降低配置page_size
的值,它统一控制了在 Airflow UI 上所有的列表视图上展示的条目数量。
如果您的 DAG 详情页加载比较慢,可以适当降低配置default_dag_run_display_number
的值,它控制了在 UI 上展示的 DAG Run 的数量。
在 Airflow 中,DAG 文件目录会被添加到模块搜索目录中,Scheduler 会基于这个文件目录进行 DAG 文件更新扫描。因此,我们可以在这个目录中直接新增工具类模块,或者是对应的包进行管理,这些包与模块可以直接在 DAG 定义中使用。
最后不要忘记在 .airflowignore 文件中加入对应模块或者包的路径信息(支持相对路径,通配符),这样调度器在寻找 DAG 的时候就会忽略这些工具类了。
EMR 中部署的 Airflow 是 2.2.0 版本,利用其开箱即用的 Scheduler HA 以提供高可用/高性能的体验。在这样的场景下,官方强烈推荐使用 MySQL8.0+ 以上版本的数据库,因为新版本 Airflow 在多 Scheduler 部署时利用到了诸如 NOWAIT
,SKIP LOCKED
等高级声明。
内置 的 MySQL 数据库版本已经满足此要求,但是 没有 高可用承诺;您可以使用 RDS 产品来为集群提供高可用的数据库,但需要 自行确保 该 RDS 数据库版本足够高。