web-dev-qa-db-ja.com

Airflow S3KeySensor-実行を継続させる方法

このStackoverflowポスト の助けを借りて、プログラムを作成しました(ポストに示されているもの)。ファイルがS3バケット内に配置されると、実行中のDAGの1つでタスクがトリガーされ、次にBashOperatorを使用していくつかの作業を実行します。それが完了すると、DAGは実行状態ではなくなりますが、代わりに成功状態になり、別のファイルを取得する場合は、「過去」、「未来」、「上流」、「すべて」をクリアする必要があります下流の活動。このプログラムを作成して、常に実行され、新しいファイルがS3バケット内に配置されると、プログラムがタスクを開始するようにしたいと考えています。

これを行うために引き続きS3KeySenorを使用できますか、それとも External Trigger を設定してDAGを実行する方法を理解する必要がありますか?今のところ、S3KeySensorが一度しか実行されないのであれば、S3KeySensorはまったく無意味です。

from airflow import DAG
from airflow.operators import SimpleHttpOperator, HttpSensor, EmailOperator, S3KeySensor
from datetime import datetime, timedelta
from airflow.operators.bash_operator import BashOperator

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2018, 5, 29),
    'email': ['[email protected]'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 5,
    'retry_delay': timedelta(minutes=5)
}

dag = DAG('s3_triggered_emr_cluster_dag', default_args=default_args, schedule_interval= '@once')

# This Activity runs a Python script that creates an AWS EMR cluster and then does EMR activity on the EMR cluster.
t2 = BashOperator(
    task_id='create_emr_cluster_1',
    bash_command='python /home/ec2-user/aws-python-sample/Create_EMR_Then_Do_EMR_Activities.py',
    retries=1,
    dag=dag)

t1 = BashOperator(
    task_id='success_log',
    bash_command='echo "Dag ran successfully" >> /home/ec2-user/s3_triggered_dag.txt',
    dag=dag)

sensor = S3KeySensor(
    task_id='new_s3_file_in_foobar-bucket',
    bucket_key='*',
    wildcard_match=True,
    bucket_name='foobar-bucket',
    s3_conn_id='s3://foobar-bucket',
    timeout=18*60*60,
    poke_interval=120,
    dag=dag)

t1.set_upstream(sensor)
t2.set_upstream(t1)

これは有向非巡回グラフではなく、ループが繰り返されるセンサー-> t1-> t2->センサー->であるため、これが不可能かどうか疑問に思っていますt1-> t2->センサー-> ...繰り返し続けます

更新:

私のユースケースは非常にシンプルです。新しいファイルが指定されたAWS S3バケット内に配置されるたびに、DAGをトリガーしてさまざまなタスクのプロセスを開始します。タスクは、新しいAWS EMRクラスターをインスタンス化し、AWS S3バケットからファイルを抽出し、いくつかのAWS EMRアクティビティを実行してから、AWS EMRクラスターをシャットダウンするなどの処理を行います。そこからDAGは待機状態に戻り、新しいファイルがAWS S3バケットに到着するのを待ってから、プロセスを無期限に繰り返します。

17

Airflow内には、常に実行中のDAGに対応する概念はありません。ユースケースに適していれば、DAGを1〜5分ごとのように非常に頻繁に実行できます。

ここで重要なことは、S3KeySensorは、最初のファイルがキーのワイルドカードパス(またはタイムアウト)に存在することを検出するまでチェックし、その後実行されます。ただし、2番目、3番目、または4番目のファイルが到着すると、S3センサーはそのDAG実行の実行を既に完了しています。次のDAGが実行されるまで、実行がスケジュールされることはありません。 (あなたが説明したループのアイデアは、DAG実行を作成するときにスケジューラが行うこととほぼ同じですが、永久ではありません。)

外部トリガーは、そのトリガーがAirflow CLIの trigger_dag コマンド($ airflow trigger_dag ...):

https://github.com/Apache/incubator-airflow/blob/972086aeba4616843005b25210ba3b2596963d57/airflow/bin/cli.py#L206-L222

またはREST API:

https://github.com/Apache/incubator-airflow/blob/5de22d7fa0d8bc6b9267ea13579b5ac5f62c8bb5/airflow/www/api/experimental/endpoints.py#L41-L89

どちらも振り向いてtrigger_dag共通​​(実験的)APIの関数:

https://github.com/Apache/incubator-airflow/blob/089c996fbd9ecb0014dbefedff232e8699ce6283/airflow/api/common/experimental/trigger_dag.py#L28-L67

たとえば、ファイルがS3に到達したときに呼び出され、トリガーDAG呼び出しを実行するAWS Lambda関数を設定できます。

11
Taylor Edmiston