Airflow实战–通过REST API来为任务传递参数1
本文介绍如何通过REST API来给任务传递参数。在实际应用中任务的参数传递非常重要,因为根据不同的参数任务会执行不同的逻辑。所以,参数传递是一个任务调度系统必须具备的基本功能。本文就来研究一下如何通过airflow的REST API来为任务传递参数。
基于airflow-2.2.1。
Airflow的参数传递
前面的文章已经分析过,可以通过两种方式来对airflow中的任务进行参数传递,一种是通过xcom机制,一种是通过共享变量。如何利用这两种方式,再结合REST API来实现任务参数的传递。这里使用的是通过xcom机制来传递参数给DAG后序的其他子任务。
一般接收rest接口来接收参数的步骤是:先通过python算子来接收参数,然后再通过xcom或Variable来把参数值传递给后序的其他子任务。不同算子之间传递参数值的形式不同。
通过Python算子来获取参数
通过Python算子来从REST接口获取任务的参数,并把该参数传递给DAG的后序任务,这里的后序任务任然是Python算子。若是Bash算子,其获取参数的方式和Python不同。
在Python算子中,一般通过context["dag_run"].conf.get("param_key")
来获取rest接口传递过来的参数值。此语句中的param_key就是通过rest接口传递过来的参数的key的值。
而通过REST接口来启动该DAG的参数设置方式,就是在REST接口中的conf参数中添加需要传递的参数:param_key以及参数值。这里的param_key是一个json格式的参数,所以可以在其中添加多个参数,只要符合json格式就可以了。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
from datetime import timedelta
import os
from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.utils.dates import days_ago
from airflow.models import Variable
# 任务参数
default_args = {
'owner': 'admin',
'depends_on_past': False,
'email': ['airflow@example.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
# 从Rest接口的conf参数中获取参数,PythonOperator返回直接存储在xcom中
def receive_param(**context):
stock_list = context["dag_run"].conf.get("stocks")
valid_tickers = []
for ticker in stock_list:
if ticker:
valid_tickers.append(ticker)
else:
continue
print(f"returned tickers: {valid_tickers}")
return valid_tickers
# 从Xcom中获取参数
def process_param(*args, **context):
tickers = context['ti'].xcom_pull(task_ids='receive_param')
# 从xcom中获取数据
print(f"received tickers: {tickers}")
with DAG(
'rest_pass_param_1',
default_args=default_args,
description='How to get rest param',
schedule_interval=timedelta(days=1),
start_date=days_ago(2),
tags=['hover'],
) as dag:
dag.doc_md = """ This rest pass param DAG. """
# task定义
receive_task = PythonOperator(
task_id = "receive_param",
python_callable = receive_param,
provide_context = True,
dag=dag)
# task定义
process_task = PythonOperator(
task_id = "process_param",
python_callable = process_param,
provide_context = True,
dag=dag)
# 依赖关系
receive_task >> process_task
通过shell命令来启动DAG
注意:我这里使用的是curl命令,也可以使用postman来进行测试。启动DAG的接口可以参考这里的官方文档。
使用rest接口来启动该DAG的shell命令如下:
curl -X POST 'http://localhost:20001/api/v1/dags/rest_pass_param_1/dagRuns' \
-d "{\"execution_date\": \"${EXE_DATE}\", \"conf\": {\"stocks\":[\"A\",\"B\", \"C\"]}}" \
-H 'content-type: application/json' \
--user "user1:user1"
小结
本文讲述了如何通过rest接口来给任务传递参数。通过rest为任务传递参数是每个优秀的调度器都应该支持的功能。Airflow可以通过rest接口的conf参数来设置任务参数,任务可以通context["dag_run"].conf.get("param_key")
来接收参数,并通过xcom或共享变量的方式把参数传递给后序的子任务。另外,参数是一个json格式的值,所以,传递多个参数也不是问题。