我在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)
答案 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是最好的!