You need to enable JavaScript to run this app.
导航
常见问题和注意事项
最近更新时间:2023.12.27 14:47:37首次发布时间:2022.07.28 17:33:38

1 常见问题

下面为您列举使用 Airflow 过程中可能遇到的几个常见问题。

  • Q1:新加入的 DAG 文件为什么页面上没有展示?

  • Q2:需要对 DAG 做修改,应该注意什么?

  • Q3:怎么排查执行失败的任务?

  • Q4:如何手动重启失败的 DAG Run?

  • Q5:TaskInstance 看不到日志,应该怎么办?

  • Q6:怎么调整 Airflow 运行的并发度与行为模式?

  • Q7:Airflow UI 加载慢怎么调优?

  • Q8:一些跨 DAG 复用的工具类逻辑如何定义?

Q1:新加入的 DAG 文件为什么页面上没有展示?

Airflow 会根据dag_dir_list_interval参数定义的值,来决定从系统目录上解析新 DAG 文件的时间间隔,该值以秒为单位,默认是300。

若超过该值规定的时间还未出现该 DAG,请通过工单联系我们。

Q2:需要对 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,使其不再调度。

Q3:怎么排查执行失败的任务?

  1. 进入 Airflow UI 的 DAGs 页面,从页面的 DAG 列表中找到对应 DAG 的 Runs,点击红色的部分,进入该 DAG 执行失败的 DAG Runs List。

  2. 从该 List 中找到具体某次失败的 DAG Run,从 DAG id 点击进入 DAG 详情页面,您会来到 Graph 子页,会列出该 DAG Run 的图示,方框对应具体的 TaskInstance。

  3. 点击执行失败的具体 Task,在弹窗中点击 Log,进行日志查看

Q4:如何手动重启失败的 DAG Run?

  1. 进入 Airflow UI 的 DAGs 页面,从页面的 DAG 列表中找到对应 DAG 的 Runs,点击红色的部分,进入该 DAG 执行失败的 DAG Runs List。

  2. 从该 List 中找到具体某次失败的 DAG Run,勾选上之后 Clear 状态即可。Scheduler 会当作此任务未运行过,然后重新执行调度。

Q5:TaskInstance 看不到日志,我应该怎么办?

在某些情况下,在查看日志时您可能会看到下图的报错,这时请尝试按以下方案尝试解决:

  • 参考上一条指引,手动重启该 DAG Run。

  • 检查集群各台机器上是否都持有本次调度的 dag 文件。

    EMR 会在集群的每一台机器上都部署 Airflow Worker 进程,参与调度的机器都必须在本地持有运行的 DAG 源文件,否则就会出现上述问题。分发 DAG 可以参考 快速开始-步骤三

  • 提工单联系我们。

    若按照上述方法排查仍无法解决问题,请您联系我们,开发人员将为您提供一对一支持。

Q6:怎么调整 Airflow 运行的并发度与行为模式?

  • Airflow 中有三个关键的全局配置,定义集群的整体与 DAG 级别的并发度,决定 Worker 进程的数量。

    在文档 Airflow 关键配置 中,有相关的描述说明。

  • DAGs 在定义时有参数可以改善并发性能:

  • Operator/Tasks 在定义时也有参数调整并发度,决定优先级:

    • max_active_tis_per_dag: 该参数定义了该任务在 所有 的 dag_runs 中的总体并发度。

    • pool: 参见 Pools,Pools 在 Airflow 中,定义了在其中运行的 Tasks 的最大整体并发度,可供用户根据对端系统的负载实际进行分类调整。

    • priority_weight: 参见 Priority Weights,Airflow 中的优先级策略默认支持上游优先、下游优先与绝对值三种策略。

Q7:Airflow UI 加载慢怎么调优?

  • 如果您的 Airflow UI 首页加载耗时比较长,可以适当降低配置page_size的值,它统一控制了在 Airflow UI 上所有的列表视图上展示的条目数量。

  • 如果您的 DAG 详情页加载比较慢,可以适当降低配置default_dag_run_display_number的值,它控制了在 UI 上展示的 DAG Run 的数量。

Q8:如何定义一些跨 DAG 复用的逻辑?

在 Airflow 中,DAG 文件目录会被添加到模块搜索目录中,Scheduler 会基于这个文件目录进行 DAG 文件更新扫描。因此,我们可以在这个目录中直接新增工具类模块,或者是对应的包进行管理,这些包与模块可以直接在 DAG 定义中使用。
最后不要忘记在 .airflowignore 文件中加入对应模块或者包的路径信息(支持相对路径,通配符),这样调度器在寻找 DAG 的时候就会忽略这些工具类了。

2 注意事项

2.1 数据库要求

EMR 中部署的 Airflow 是 2.2.0 版本,利用其开箱即用的 Scheduler HA 以提供高可用/高性能的体验。在这样的场景下,官方强烈推荐使用 MySQL8.0+ 以上版本的数据库,因为新版本 Airflow 在多 Scheduler 部署时利用到了诸如 NOWAITSKIP LOCKED 等高级声明。
内置 的 MySQL 数据库版本已经满足此要求,但是 没有 高可用承诺;您可以使用 RDS 产品来为集群提供高可用的数据库,但需要 自行确保 该 RDS 数据库版本足够高。