单机airflow性能优先和调度说明

单机airflow性能优先和调度说明

性能调优

环境说明

airflow版本 2.0.2
执行测试环境的执行器:Local Executor,将自带的sqlite替换成msyql数据库,可以支持并发调度
使用 airflow config get-value core executor可以查看使用的执行器

参数调整

主要对于airflow.cfg配置文件内参数进行调整,针对核心的几个参数进行说明:

  1. parallelism: 执行器能最大并行执行的task数量
  2. dag_concurrency: 一个DAG能并发执行的task数量,这个设置较低的值避免同时运行的数量太大,导致CPU使用率过高,系统响应慢
  3. max_active_runs_per_dag: 每个DAG能处于running状态的最大数量, 需设置较低的值避免大量任务堆积的情况
  4. scheduler_heartbeat_sec: 调度器执行调度的周期,对于强实时任务应设置较低的值
  5. parsing_processes: 解析DAG的进程的数量,在DAG比较多的时候可以设置较高
  6. workers 实际进行工作的进程数,设置为合理值避免worker进程过多导致cpu使用率过高

调度说明

如我的DAG创建时传递参数,如下
DAG(
dag_id=‘tutorial_’+str(i),
default_args=default_args,
description=‘A simple tutorial DAG’,
schedule_interval=timedelta(seconds=60*i + 60),
# start_date=days_ago(0, hour=23, minute=0),
start_date=timezone.utcnow().replace(minute=0),
)
其中start_date+schedule_interval就是第一个DAG执行的时间对应前端中的 Execution Date ,随后调度的时候就是使用 Execution Date 为标准每次DAG执行完之后就增加schedule_interval,当当前的时间>Execution Date时,DAG会被不停的触发调度,会不断积累调度中的DAG和并发执行的task,其调度周期不满足设置的schedule_interval周期。
所以创建DAG时,设置start_date应该恰好设置为当前时间-schedule_interval的相近时间,这样在airflow迅速补完欠缺的运行次数后,Execution Date更新至未来的时间点,就会在当前时间到达未来的时间点后迅速调度(前提是调度器未挂的情况下),使得调度时间周期满足设置的周期。
注: start_date+schedule_interval 不能是未来的时间,否则每次解析DAG时,都无法触发DAG。同时在第一次使用 start_date+schedule_interval 作为Execution Date后,新的DAG的Execution Date都在原来的基础上增加schedule_interval

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用Airflow的Data Profiling模块,可以从数据库中读取参数并使用这些参数来调度任务。Data Profiling模块可以将数据源的元数据存储在Airflow元数据库中,并提供了一些函数来访问和处理这些元数据。以下是一个示例,演示如何使用Data Profiling模块从数据库中读取参数并使用这些参数来调度任务: ```python from airflow import DAG from airflow.operators.python_operator import PythonOperator from datetime import datetime, timedelta from sqlalchemy import create_engine from data_profiling import get_parameter # 定义DAG default_args = { 'owner': 'airflow', 'depends_on_past': False, 'start_date': datetime(2021, 8, 1), 'email': ['airflow@example.com'], 'email_on_failure': False, 'email_on_retry': False, 'retries': 1, 'retry_delay': timedelta(minutes=5), } dag = DAG( 'my_dag', default_args=default_args, description='My DAG', schedule_interval='0 8 * * *', ) # 从数据库中读取参数 def read_parameters(): engine = create_engine('my_database_connection_string') parameter = get_parameter(engine, 'my_parameter_name') return parameter # 使用参数调度任务 def run_task(**context): parameter = context['task_instance'].xcom_pull(task_ids='read_parameters') # 使用参数来调度任务,例如: # my_task = MyOperator(param=parameter) # 定义任务 read_parameters_task = PythonOperator( task_id='read_parameters', python_callable=read_parameters, dag=dag, ) run_task_task = PythonOperator( task_id='run_task', python_callable=run_task, provide_context=True, dag=dag, ) # 设置任务依赖关系 read_parameters_task >> run_task_task ``` 在这个示例中,首先定义了一个`read_parameters`函数,用于从数据库中读取参数。然后定义了一个`run_task`函数,用于使用从数据库中读取的参数来调度任务。接着定义了两个任务,分别是`read_parameters_task`和`run_task_task`,并将它们设置为PythonOperator类型的任务。最后将这两个任务设置为依赖关系,使得`run_task_task`在`read_parameters_task`完成后执行。 在这个示例中,DAG被设置为每天8点执行一次。当DAG执行时,`read_parameters_task`会先执行,从数据库中读取参数,并将参数作为XCom传递给`run_task_task`任务。`run_task_task`任务会根据读取的参数来调度任务,例如使用`MyOperator(param=parameter)`来调度任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NineKit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值