对PythonOperator的运行时配置

时间:2018-12-14 13:39:57

标签: python airflow

例如,我找不到任何有关如何使用通过“ -c”传递的JSON变量的有效文档。补余工作。

我一直在打印我的python任务** kwargs来查找,但是我仍然无法确定。 Provide_context =真

有人能指出我正确的方向吗?

所以,我想做什么:

var user = await _userManager.FindByEmailAsync ("jon@live.be");

我有一个PythonOperator:

airflow backfill mydag -c '{"override":"yes"}' -s 2018-12-01 -e 2018-12-12

在run_task中,我想访问覆盖变量:

PythonOperator(
    task_id = 'task_identifier',
    python_callable = 'run_task',
    op_kwargs = {
        'task_conf': task_config 
    },
    provide_context=True,
    dag = this_dag
)

但是我找不到访问此覆盖变量的方法

def run_task(*args, **kwargs): 

    dag_run = kwargs.get('dag_run')
    logging.info(kwargs['dag_run'].conf.get('override'))

编辑:我确实找到了一个配置设置和说明,似乎表明这些参数已经在代码中设置了

[2018-12-17 10:07:24,649] {models.py:1760} ERROR - 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
  File "/home/daimonie/.local/lib/python3.6/site-packages/airflow/models.py", line 1659, in _run_raw_task
    result = task_copy.execute(context=context)
  File "/home/daimonie/.local/lib/python3.6/site-packages/airflow/operators/python_operator.py", line 95, in execute
    return_value = self.execute_callable()
  File "/home/daimonie/.local/lib/python3.6/site-packages/airflow/operators/python_operator.py", line 100, in execute_callable
    return self.python_callable(*self.op_args, **self.op_kwargs)
  File "/home/daimonie/airflow/dags/dag_scheduled_queries.py", line 65, in run_query
    logging.info(kwargs['dag_run'].conf.get('override'))

将donot_pickle参数设置为False。

4 个答案:

答案 0 :(得分:1)

对于任何想知道错误的原因

AttributeError: 'NoneType' object has no attribute 'get

尝试从 confdag_run 属性检索键/值是因为传递给 confairflow backfill mydag -c 参数需要配置为:

'{"conf": {"key1": "value", ...}}'

不是

'{"key1": "value", ...}'

然后你可以从上下文中引用它,例如

def do_something(**context):
    value = context['dag_run'].conf['key']
    ...

答案 1 :(得分:0)

您需要做两件事。

  1. kwargs['run_dag'].conf.get('override')替换为kwargs['dag_run'].conf.get('override')
  2. 也更改签名     从def run_task(*args, **kwargs):def run_task(**kwargs):

答案 2 :(得分:0)

您可以使用LiveData从CLI传递参数,然后在Python可调用函数中将其用作-c '{"key":"value"}'

就您而言,

操作员

"dag_run.conf["key"]"

可调用函数

PythonOperator(
    task_id = 'task_identifier',
    python_callable = 'run_task',
    provide_context=True,
    dag = this_dag
)

答案 3 :(得分:0)

对于那些和我一样在尝试阅读 ERROR - 'NoneType' object has no attribute 'get' 时一直徘徊在这里寻找解决相同错误 (kwargs['dag_run'].conf.get('something')) 的人。

默认情况下,调度程序运行 dag 时未设置字典 dag_run.conf。这就是错误出现的原因。 因此,当您需要不时使用自定义参数手动运行计划的 dag 时,类似这样的操作将起作用:

在可调用函数中:

def run_task(**kwargs):
    if kwargs['dag_run'].conf:
        my_parameter = kwargs['dag_run'].conf.get('my_parameter', None)
    else:
        my_parameter = "some_default_value"