web-dev-qa-db-ja.com

Airflowを使用して実装されたワークフローのDAGのタスクで非同期イベントを待機する方法は?

Airflowを使用して実装されたワークフローには、タスクA、B、C、およびDが含まれています。ワークフローがタスクCでイベントを待機するようにします。 Airflowでは、センサーを使用して、ある状態をポーリングすることである状態をチェックします。その条件がtrueの場合、ワークフローの次のタスクがトリガーされます。私の要件は、ポーリングを回避することです。 ここ エアフローの rest_api_plugin について言及している1つの回答は、エアフローCLIをトリガーするrest_apiエンドポイントを作成します-このプラグインを使用して、ワークフローでタスクをトリガーできます。ただし、私のワークフローでは、ポーリングせずにREST API呼び出し(非同期イベント)を待機するタスクを実装したいと考えています。RESTAPIリクエストを受信すると、タスクがトリガーされ、Airflowワークフローが再開されます。

ポーリングを回避する理由:非効率的であり、要件に従ってスケーリングされません。

更新

@Daniel Huangの回答に記載されている提案に従い、Falseを返すセンサーを作成しました。このセンサーはtask:start_evaluating_cycleに実装されていますが、このセンサータスクは何も検出していませんが、常にFalseを返します。

class WaitForEventSensor(BaseSensorOperator):

    def poke(self, context):
        return False

start_evaluating_cycle = WaitForEventSensor(
    task_id="start_evaluating_cycle",
    dag=dag,
    poke_interval=60*60 # any number will do here, because it not polling just returning false
)

enter image description here

Rest_api_pluginを構成し、プラグインを使用して、ワークフローを続行するためにtask:start_evaluating_cyleを完了としてマークしようとしています。

  • enter image description here

Rest_api_pluginはタスクを正常に実行し、flowerを使用してタスクが実行されたことがわかります。

  • enter image description here

ただし、ワークフローでは、タスク:start_evaluating_cycleはまだ実行状態です:

  • List item

rest_api_pluginは、ワークフローとは独立してタスクを実行しています。ワークフローに依存せずに、ワークフロー内でタスクを実行するようにrest_api_pluginを作成するにはどうすればよいですか。

ただし、airflow UI管理者からタスクを選択し、成功をマークすると、次のようになります。

  • List item

このURLに移動します: http:// localhost:8080/admin/airflow/success?task_id = start_evaluating_cycle&dag_id = faculty_evaluation_workflow&upstream = false&downstream = false&future = false&past = false&execution_date = 2017-11-26T06:48:54.297289&Origin = HTTP%3A%2F%2Flocalhost%3A8080%2Fadmin%2Fairflow%2Fgraph%3Fexecution_date%3D2017-11-26T06%253A48%253A54.297289%26arrange%3DTB%26root%3D%26dag_id%3Dfaculty_evaluation_workflow%26_csrf_token%3DImM3NmU4ZTVjYTljZTQzYWJhNGI4Mzg2MmZmNDU5OGYxYWY0ODAxYWMi.DPv1Ww.EnWS6ffVLNcs923y6eVRV_8R- X8

確認すると、ワークフローはさらに進みます。これは私が望んでいることですが、RESTAPI呼び出しから成功をマークする必要があります。

私の懸念は次のとおりです。

  1. を使用して、ワークフロー内で実行されているタスクを成功としてマークする方法
    rest_api_plugin?
  2. Airflow adminが作成したURLを使用して、外部システムからタスクを呼び出すことにより、タスクを成功としてマークすることは可能ですか?
12
javed

考えられる解決策の1つは、外部の何かが手動で状態を成功に設定するまで永久に待機するセンサーを使用することです。

したがって、ある種のダミーセンサーがあります。

class DummySensor(BaseSensorOperator):

    def poke(self, context):
        return False

このように初期化されます:

task_c = DummySensor(
    dag=dag,
    task_id='task_c',
    interval=600,  # something fairly high since we're not polling for anything, just to check when to timeout
    timeout=3600,  # if nothing externally sets state to success in 1 hour, task will fail so task D does not run
)

タスクCが開始すると、実行状態になります。次に、REST APIプラグインを使用して、条件が満たされたときにタスクCの状態をSUCCESSに設定できます。その後、タスクDおよびその他のダウンストリームタスクが開始されます。

これの欠点は、ダミーセンサーが何もしないのを待っている間もワーカースロットを保持していることです。

6
Daniel Huang