web-dev-qa-db-ja.com

Python Airflow-PythonOperatorから結果を返す

複数のPythonOperatorを使用してDAGを作成しました

task1 = af_op.PythonOperator(task_id='Data_Extraction_Environment',
                          provide_context=True,
                          python_callable=Task1, dag=dag1)

def Task1(**kwargs):
    return(kwargs['dag_run'].conf.get('file'))

PythonOperatorから「Task1」メソッドを呼び出しています。そのメソッドは値を返します。その値は次のPythonOperatorに渡す必要があります。「task1」変数から値を取得する方法またはTask1メソッドから返される値を取得する方法

更新しました :

    def Task1(**kwargs):
          file_name = kwargs['dag_run'].conf.get[file]
          task_instance = kwargs['task_instance']
          task_instance.xcom_Push(key='file', value=file_name) 
          return file_name

  t1 = PythonOperator(task_id = 'Task1',provide_context=True,python_callable=Task1,dag=dag)

  t2 =   BashOperator(
      task_id='Moving_bucket', 
      bash_command='python /home/raw.py {{ task_instance.xcom_pull(task_ids='Task1',key='file') }} ',
      dag=dag,
    )

t2.set_upstream(t1)
11
Teja

AirflowのXCOMを確認することをお勧めします。 https://airflow.Apache.org/concepts.html#xcoms

関数から値を返す場合、この値はxcomに格納されます。あなたの場合、他のPythonコードからそのようにアクセスできます:

task_instance = kwargs['task_instance']
task_instance.xcom_pull(task_ids='Task1')

またはそのようなテンプレートで:

{{ task_instance.xcom_pull(task_ids='Task1') }}

キーを指定する場合は、XCOMにプッシュできます(タスク内にあります)。

task_instance = kwargs['task_instance']
task_instance.xcom_Push(key='the_key', value=my_str)

その後、次のようにアクセスできます:

task_instance.xcom_pull(task_ids='my_task', key='the_key')

EDIT 1

追加質問:別の関数で値を使用する代わりに、「t2 = "BashOperator(task_id = 'Moving_bucket'、bash_command = 'python/home/raw.py "%s" '%file_name、dag = dag) "---" Task1 "から返されたfile_nameにアクセスしたいのですが、どうすれば達成できますか?

まず第一に、値は実際にはではない別のPythonOperatorではなくBashOperatorに渡されているようです。

第二に、これはすでに上記の私の回答でカバーされています。フィールドbash_commandがテンプレート化されています(ソースのtemplate_fieldsを参照してください: https://github.com/Apache/incubator-airflow/blob/master/airflow/operators/bash_operator.py )。したがって、テンプレートバージョンを使用できます。

BashOperator(
  task_id='Moving_bucket', 
  bash_command='python /home/raw.py {{ task_instance.xcom_pull(task_ids='Task1') }} ',
  dag=dag,
)

EDIT 2

説明:Airflowは次のように機能します。Task1を実行し、xcomにデータを入力してから、次のタスクを実行します。したがって、例を機能させるには、最初にTask1を実行してから、Task1のダウンストリームでMoving_bucketを実行する必要があります。

リターン関数を使用しているので、key='file'からxcom_pullを省略して、関数で手動で設定しないこともできます。

18
tobi6