我有一个DAG,其中包含三个任务流(licappts,代理,agentpolicy):
为简单起见,我将这三个不同的流称为。这些流是独立的,这意味着仅仅因为agentpolicy失败并不意味着其他两个流(失败应用程序和代理)应该受到其他流失败的影响。
但是对于 sourceType _emr_task_1任务(即licappts_emr_task_1,agents_emr_task_1和agentpolicy_emr_task_1),我一次只能运行其中一个任务。例如,即使它们是两个不必相互关心的独立任务,我也无法同时运行agent_emr_task_1和agentpolicy_emr_task_1。
如何在Airflow中实现此功能?现在,我唯一能想到的就是将该任务包装在以某种方式锁定全局变量的脚本中,然后如果该变量被锁定,我将让脚本执行Thread.sleep(60秒)之类的操作,然后重试。但这似乎很hacky,我很好奇Airflow是否可以提供解决方案。
如果需要,我愿意调整DAG的订购结构。我想到做的一件事是对
进行硬编码排序Dag Starts -> ... -> licappts_emr_task_1 -> agents_emr_task_1 -> agentpolicy_emr_task_1 -> DAG Finished
但是我不认为以这种方式组合流,因为例如,agentpolicy_emr_task_1必须等待另外两个完成才能启动,并且有时agentpolicy_emr_task_1准备好可以去其他两个之前完成其他任务。
因此,理想情况下,我希望先启动准备就绪的 sourceType _emr_task_1任务,然后阻止其他任务运行其 sourceType _emr_task_1任务,直到完成。 / strong>
更新:
我刚刚想到的另一种解决方案是,是否可以通过一种方法检查另一个任务的状态,我可以为 sourceType _emr_task_1创建一个脚本,以检查其他两个任务是否存在 sourceType _emr_task_1任务的状态为正在运行,如果它们处于睡眠状态,则它们会休眠并定期检查是否其他任务都未在运行,在这种情况下它将开始执行过程。我不是这种方式的忠实拥护者,因为我感觉这可能会导致一种竞争状况,即两者(同时)都读取并没有运行并且都开始运行。
答案 0 :(得分:5)
您可以使用pool来确保这些任务的并行度为1。
对于每个*_emr_task_1
任务,将pool
kwarg设置为类似于pool=emr_task
的东西。
然后只需进入Web服务器->管理员->池->创建:
设置名称Pool
以匹配您的运算符中使用的池,并将Slots
设置为1。
这将确保调度程序仅允许任务在该池中排队直至配置的插槽数,而与其余Airflow的并行性无关。