如何在Apache Airflow中的PythonOperator中创建BashOperator

时间:2018-01-11 14:14:15

标签: python-3.x airflow apache-airflow

我在PythonOperator中创建了一些BashOperator,但它无法正常工作。 任务t1从上下文读取conf参数并返回一个值和第二个任务t2,这是Python操作员使用xcom读取值,我能够读取值,但for循环中的任务不是创建的。

是否可以在PythonOperator中创建BashOperator?

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperator
from datetime import datetime


def load_properties(comment_char='#', sep='=', **kwargs):
    #some processing
    return kwargs['dag_run'].conf.get('propname')


def createtask(**kwargs):
    property_from_task1=ti.xcom_pull(key=None, task_ids='t1')
    for value in range(property_from_task1):
        task = BashOperator(task_id=task_name, bash_command='echo creating a commond', dag=dag)



default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2017, 12, 21),
    'provide_context': True,
}




dag = DAG(
    'param', default_args=default_args,schedule_interval=None)

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


t2 = PythonOperator(task_id='t2',
                    python_callable=createtask,
                    provide_context=True,
                    dag=dag)


t2.set_upstream(t1)

2 个答案:

答案 0 :(得分:0)

因此,您正在调用PythonOperator运算符来构建BashOperator,在执行代码之前,气流将无法实现。我不知道你可以用编译时间做到这一点。

您可以尝试将for循环输出并从那里构建bash运算符,您可能需要

property_from_task1 = load_properties()

for value in range(property_from_task1):
        task = BashOperator(task_id=task_name, bash_command='echo creating a commond', dag=dag)

我发现有一个配置文件(YAML,JSON)然后解析它property_from_task1可能更容易,但这取决于你的用例。

答案 1 :(得分:0)

Airflow DAG已经用Python编写,因此无需在运算符中生成运算符。继承承的答案之后,这是一个用于按顺序链接命令的工作片段:

operators = [BashOperator(task_id=step,
                          bash_command=command,
                          dag=exec_ssh) for step, command in commands.items()]

for upstream, downstream in zip(operators[:-1], operators[1:]):
    upstream >> downstream

在此示例中,“命令”是您可以从JSON或某种配置加载的步骤的字典。您可以扩展它以构建具有并行性,分支等的DAG。自生成DAG是最好的!