apache Apache Airflow/Cloud Composer 中多个客户端的最佳实践?
Posted
技术标签:
【中文标题】apache Apache Airflow/Cloud Composer 中多个客户端的最佳实践?【英文标题】:Best practices for multiple clients in apache Apache Airflow/Cloud Composer? 【发布时间】:2019-12-28 12:27:11 【问题描述】:问题:
需要为客户执行的几个任务/作业 很多客户(数百个) 任务/作业几乎相同,只是配置更改Airflow 中是否有任何最佳实践可以让事情变得简单?我正在考虑(没有特定顺序):
尽可能特定客户端配置(在需要时覆盖默认值) ui 概览:每个客户的工作将很难获得概览 模块化:尽可能重复使用代码 性能:客户不应相互妨碍(太多) 缩放:应该很容易提高性能(最好是水平) 容错性:当一个客户出现故障时,他们不会妨碍其他客户 + 清晰的用户界面指示 重新执行:易于为 1 个客户手动重新执行 设置:设置新客户端应该很容易(并且使用代码/配置,没有 ui) 治理:易于评估代码更改和执行规则 清理:轻松删除客户端 等我找不到很多关于这个特定用例的材料。
理想情况下,我们有一个“模板”,可以为每个客户重复使用。目前尚不清楚一份工作还是多份工作是最佳解决方案。或者也许有另一种更适合这种用法的方法?
【问题讨论】:
【参考方案1】:Airflow 为 Google Cloud Platform 提供广泛支持。但请注意,大多数 Hooks 和 Operators 都位于 contrib 部分,这意味着它们处于 beta 状态,这意味着它们可以在次要版本之间进行重大更改。
客户方面的数量:
可以有尽可能多的 DAG,每个 DAG 都可以提及多个任务。建议在一个 DAG 文件中保留一个逻辑工作流,并尽量保持精简(例如配置文件)。它允许 Airflow 调度程序在每次心跳时花费更少的时间和资源来处理它们。
可以根据任意数量的配置参数动态创建 DAG(具有相同的基本代码),这在拥有大量客户端时非常有用且节省时间。
要创建新的 DAG,请在 create_dag
函数中创建一个 DAG 模板。代码可以包装在允许传入自定义参数的方法中。此外,输入参数不必存在于 dag 文件本身中。另一种生成 DAG 的常见形式是在 Variable
对象中设置值。请参考here 了解更多信息。
特定客户端配置:
您可以使用宏在运行时将动态信息传递给任务实例。可以在 here 找到所有模板中可访问的默认变量列表。
Airflow 对Jinja templating 的内置支持使用户能够传递可在模板化字段中使用的参数。
用户界面概览
如果您的 dag 需要很长时间才能加载,您可以将 airflow.cfg 中 default_dag_run_display_number
配置的值减小到更小的值。这个可配置控制在 UI 中显示的 dag 运行的数量,默认值为 25。
模块化
如果将 default_args
的字典传递给 DAG,它会将它们应用于其任何运算符。这样可以轻松地将一个通用参数应用于许多运算符,而无需多次键入。
看看例子:
from datetime import datetime, timedelta
default_args =
'owner': 'Airflow',
'depends_on_past': False,
'start_date': datetime(2015, 6, 1),
'email': ['airflow@example.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5),
# 'queue': 'bash_queue',
# 'pool': 'backfill',
# 'priority_weight': 10,
# 'end_date': datetime(2016, 1, 1),
dag = DAG('my_dag', default_args=default_args)
op = DummyOperator(task_id='dummy', dag=dag)
print(op.owner) # Airflow
有关 BaseOperator 的参数及其作用的更多信息,请参阅airflow.models.BaseOperator 文档。
性能
可以使用可以控制的变量来提高气流 DAG 性能(可以在 airflow.cfg 中设置。):
parallelism
:控制在整个 Airflow 集群中同时运行的任务实例的数量。
concurrency
:Airflow 调度程序将在任何给定时间为您的 DAG 运行不超过并发任务实例。并发在您的 Airflow DAG 中定义。如果您未在 DAG 上设置并发,调度程序将使用您的 airflow.cfg 中 dag_concurrency 条目中的默认值。
task_concurrency
:此变量控制每个任务跨 dag_runs 并发运行的任务实例数。
max_active_runs
:Airflow 调度程序在给定时间运行的 DAG 不会超过 max_active_runs DagRuns。
pool
:此变量控制分配给池的并发运行任务实例的数量。
您可以在作曲家实例存储桶gs://composer_instance_bucket/airflow.cfg
中看到气流配置。您可以根据需要调整此配置,但请记住 Cloud Composer 已阻止某些配置。
缩放
请记住,建议节点数必须大于 3,将此数字保持在 3 以下可能会导致一些问题,如果您想升级节点数,可以使用gcloud command来指定这个值。另请注意,有一些与自动缩放相关的气流配置被阻止并且不能是overridden。 一些 Airflow 配置是为 Cloud Composer 预先配置的,您无法更改它们。
容错
请参考以下documentation。
重新执行
就像对象是类的实例一样,Airflow 任务是Operator (BaseOperator) 的实例。因此,只需传递不同的参数,编写一个“可重用”运算符并在您的管道中使用它数百次。
延迟
可以通过以下方式减少生产中的气流 DAG 调度延迟:
max_threads
:调度程序将并行生成多个线程来调度 dag。这由 max_threads 控制,默认值为 2。
scheduler_heartbeat_sec
:用户应考虑将 scheduler_heartbeat_sec 配置增加到更高的值(例如 60 秒),以控制气流调度程序获取心跳的频率并更新数据库中的作业条目。
请参阅以下有关最佳实践的文章:
Airflow documentation Medium希望对你有所帮助。
【讨论】:
非常感谢您的广泛概述!您对客户端方面有什么建议,即为所有客户端创建 1 个 dag 或为每个客户端创建 1 个 dag?我见过从 1 个模板创建多个 dag 的动态 dag 构造。 可以有任意多的 DAG。尽管每个人都可以提及多个任务,但最好将一个逻辑工作流保留在一个文件中。保持 DAG 文件非常轻量(如配置文件)至关重要,这样 Airflow 调度程序在每次心跳时处理它们所需的时间和资源更少。所以你可以指定默认的 DAG 参数。正如您所说,我建议每个客户端使用 1DAG 并使用 DAG 的动态创建。您可以使用并行选项。希望你能管理好。另外,看看gtoonstra.github.io/etl-with-airflow 如果您认为有用,请考虑接受答案,谢谢! 您建议使用多个 dags 方法(我想它的工作原理是这样的:astronomer.io/guides/dynamically-generating-dags)您可以用这些信息更新您的答案吗?为了将来参考,我认为答案包含选择每个客户端 dag 与每个客户端任务的相关信息很重要。谢谢! @Jonny5 我更新了我的答案,考虑到客户数量方面动态生成 DAG,谢谢!以上是关于apache Apache Airflow/Cloud Composer 中多个客户端的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章