この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バケットに到着するのを待ってから、プロセスを無期限に繰り返します。
Airflow内には、常に実行中のDAGに対応する概念はありません。ユースケースに適していれば、DAGを1〜5分ごとのように非常に頻繁に実行できます。
ここで重要なことは、S3KeySensorは、最初のファイルがキーのワイルドカードパス(またはタイムアウト)に存在することを検出するまでチェックし、その後実行されます。ただし、2番目、3番目、または4番目のファイルが到着すると、S3センサーはそのDAG実行の実行を既に完了しています。次のDAGが実行されるまで、実行がスケジュールされることはありません。 (あなたが説明したループのアイデアは、DAG実行を作成するときにスケジューラが行うこととほぼ同じですが、永久ではありません。)
外部トリガーは、そのトリガーがAirflow CLIの trigger_dag コマンド($ airflow trigger_dag ...
):
またはREST API:
どちらも振り向いてtrigger_dag
共通(実験的)APIの関数:
たとえば、ファイルがS3に到達したときに呼び出され、トリガーDAG呼び出しを実行するAWS Lambda関数を設定できます。