在已经计划并运行Apache Airflow DAG的同时进行测试?

时间:2019-01-17 22:23:50

标签: airflow

我运行了以下测试命令:

airflow test events {task_name_redacted} 2018-12-12

...并得到以下输出:

Dependencies not met for <TaskInstance: events.{redacted} 2018-12-12T00:00:00+00:00 [None]>, dependency 'Task Instance Slots Available' FAILED: The maximum number of running tasks (16) for this task's DAG 'events' has been reached.
[2019-01-17 19:47:48,978] {models.py:1556} WARNING - 
--------------------------------------------------------------------------------
FIXME: Rescheduling due to concurrency limits reached at task runtime. Attempt 1 of 6. State set to NONE.
--------------------------------------------------------------------------------

[2019-01-17 19:47:48,978] {models.py:1559} INFO - Queuing into pool None

我的Airflow的最大并发配置为16。这是否意味着当DAG当前正在运行并且已使用所有任务插槽时,我无法测试任务?

此外,从文档中还不清楚,但是airflow test是否确实执行了任务,就好像它是SparkSubmitOperator一样,它实际上会提交任务?

1 个答案:

答案 0 :(得分:0)

虽然我还没有达到并发至关重要的部署阶段,但是docs确实很好地表明了手头的问题

  1. 由于在任何时间都只有一个scheduler在运行(和you shouldn't be running multiple anyways),所以实际上似乎不管DAG-是否运行实时-运行测试-运行,此限制将共同适用于它们。因此,这当然是一个障碍。

      

    #调度程序允许并发运行的任务实例数

         

    dag_concurrency = 16


  1. 但是请注意,仅增加此数目(假设您有足够大的 box 用于容纳大量worker /多个worker的盒子),其他几种配置将还必须进行调整,以实现我想要的那种并行性。

    它们全部列在[core]部分

      

    #作为执行程序设置的并行度。这个   定义应运行的任务实例的最大数量   在此气流装置上同时进行

         

    并行度= 32

         

    #不使用池时,任务在“默认池”中运行,默认池的   大小由此配置元素决定

         

    non_pooled_task_slot_count = 128

         

    #每个DAG的最大活动DAG运行次数

         

    max_active_runs_per_dag = 16


  1. 但是我们仍然不在那里,因为一旦您同时产生了这么多任务,后端 metadata -db就会开始阻塞。尽管这可能是一个小问题(除非您的任务中有DAG interactions 个很大的Variable /非常大的executor /很大的问题,否则它不会影响),但它仍然值得一提的潜在障碍

      

    #SqlAlchemy池大小是数据库的最大数目   池中的连接。 0表示没有限制。

         

    sql_alchemy_pool_size = 5

         

    #SqlAlchemy池回收是连接的秒数   可以在无效之前在池中空闲。此配置不   适用于sqlite。如果曾经超过数据库连接数,则   较低的配置值将使系统恢复更快。

         

    sql_alchemy_pool_recycle = 1800

         

    #在多少秒后重试重新建立数据库连接   断开连接。将此设置为0将禁用重试。

         

    sql_alchemy_reconnect_timeout = 300


  1. 不用说,除非您选择正确的SequentialExecutor,否则所有这一切都是徒劳的; depends_on_past,特别是仅用于测试

      

    #气流应使用的执行程序类。选项包括SequentialExecutor,LocalExecutor,CeleryExecutor,DaskExecutor,   KubernetesExecutor

         

    执行者= SequentialExecutor


  1. 但随后params to BaseOperatorwait_for_downstreamAirflow一样也破坏了党派

  1. 最后,我留下了与Spark + print(re.sub(r'[^0-9a-zA-Z ]+', '', re.sub(r'\s+', ' ', s))) 组合相关的链接:How to submit Spark jobs to EMR cluster from Airflow?

(如果答案比您对您的困惑更深,请原谅我,但是..)