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格式的值,所以,传递多个参数也不是问题。