如何检索python callable中的默认args

时间:2017-05-16 05:46:42

标签: airflow

我需要能够访问在Python运算符python_callable中定义为DAG定义一部分的default_args。也许这是我对python或气流的不满意,但有人可以指导如何实现这一目标。

以下是我想要实现的代码示例

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'email': 'xyz@xyz.com',
    'email_on_failure': 'xyz@xyz.com',
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
    'start_date': datetime(2017, 5, 15, 23, 20),
    'end_date': datetime(2017, 5, 16, 23, 45),
    'touchfile_path': '/user/myname/touchfiles/',
}

dag = DAG(
    'test',
    default_args=default_args,
    template_searchpath=['/Users/myname/Desktop/utils/airflow/resources'],
    user_defined_macros=dict(SCHEMA_NAME='abc'),
    #schedule_interval='*/2 * * * * ')
    schedule_interval='@once')

def webhdfs_touchfile_create(ds, *args, **kwargs):
    web_hdfs_hook = WebHDFSHook('webhdfs_default')
    client = web_hdfs_hook.get_conn()
    client.write("/user/myname/airflow_hdfs","stringToWrite")
    pp.pprint(kwargs)

task1 = PythonOperator(
    task_id='task1',
    provide_context=True, #enabling this would allow to pass arguments automatically to your callable function
    python_callable=webhdfs_touchfile_create,
    templates_dict={'attr1': {{ default_args['touchfile_path'] }}},
    dag=dag)

由于PythonOperator的template_dict是jinja模板工作的唯一属性,如何在那里检索“ touchfile_path ”参数?

3 个答案:

答案 0 :(得分:3)

有两种在Airflow中传递变量的机制:

  • (1)Jinja模板化
  • (2)专门的运算符属性

使用(1)方法变量可以通过 DAG 级别的user_defined_macros属性进行传递。 使用(2)方法,您应该查看特定的 operator 属性。

请注意,某些操作符属性由Jinja处理,您可以使用模板语法。

这是一个可行的示例:

from datetime import timedelta

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperator
from airflow.utils.dates import days_ago

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': days_ago(2),
    'email': ['airflow@example.com'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
    'custom_key1': 'custom_value1',
    'custom_key2': 'custom_value2'
}

dag = DAG(
    'tutorial',
    default_args=default_args,
    description='A simple tutorial DAG',
    schedule_interval=timedelta(days=1),
    user_defined_macros=default_args ,
)

bash_command = """
    echo "access via DAG's user_defined_macros = {{ custom_key1 }}"
    echo "access via Operator's params = {{ params.custom_key2 }}"
"""

t1 = BashOperator(
    task_id='print_in_bash_op',
    bash_command=bash_command,
    params=default_args,
    dag=dag,
)

def myfunc(**context):
    print(context['templates_dict']['custom_key1'])
    print(context['templates_dict']['custom_key2'])


t2 = PythonOperator(
    task_id='print_in_python_op',
    python_callable=myfunc, 
    templates_dict=default_args,
    provide_context=True,
    dag=dag,
)

templates_dict={
    'custom_key1': '{{ custom_key1 }}',
    'custom_key2': '{{ custom_key2 }}'
}

t3 = PythonOperator(
    task_id='print_in_python_op_2',
    python_callable=myfunc, 
    templates_dict=templates_dict,
    provide_context=True,
    dag=dag,
)

t1 >> t2 >> t3

基于评论的添加

使用变量的能力完全取决于运算符

在(2)方法中,通常具有用于传递信息的专用属性,例如:

  • BashOperator中的bash_command
  • PythonOperator中的op_kwargs,
  • BigQueryOperator中的SQL

对于使用方法(1),应在操作员代码中使用jinja渲染此类属性(在文档中将其标记为templated)。 例如,上面的属性是templated个属性。

Airflow Macros的每个地方 可以使用,也可以使用用户变量(通过user_defined_macros定义)。

答案 1 :(得分:0)

由于它们在相同级别的同一文件中定义,您可以这样做:

def webhdfs_touchfile_create(ds, *args, **kwargs):
    web_hdfs_hook = WebHDFSHook('webhdfs_default')
    client = web_hdfs_hook.get_conn()
    client.write("/user/myname/airflow_hdfs","stringToWrite")
    pp.pprint(kwargs) 
    pp.pprint(default_args['touchfile_path'])

答案 2 :(得分:0)

默认args应该在* args中可用。您是否尝试过从那里访问touchfile_path