airflow中的execution_date:需要作为变量访问

时间:2016-04-19 22:36:40

标签: airflow

我真的是这个论坛的新手。但是我一直在为我们的公司玩气流。对不起,如果这个问题听起来真的很蠢。

我正在使用一堆BashOperator编写一个管道。 基本上,对于每个任务,我想简单地使用'curl'

调用REST api

这就是我的管道(非常简化的版本):

from airflow import DAG
from airflow.operators import BashOperator, PythonOperator
from dateutil import tz
import datetime

datetime_obj = datetime.datetime

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime.datetime.combine(datetime_obj.today() - datetime.timedelta(1), datetime_obj.min.time()),
    'email': ['xxxx@xxx.xxx'],
    'email_on_failure': True,
    'email_on_retry': False,
    'retries': 2,
    'retry_delay': datetime.timedelta(minutes=5),
}


current_datetime = datetime_obj.now(tz=tz.tzlocal())

dag = DAG(
    'test_run', default_args=default_args, schedule_interval=datetime.timedelta(minutes=60))

curl_cmd='curl -XPOST "'+hostname+':8000/run?st='+current_datetime +'"'


t1 = BashOperator(
    task_id='rest-api-1',
    bash_command=curl_cmd,
    dag=dag)

如果您发现我在做current_datetime= datetime_obj.now(tz=tz.tzlocal()) 相反,我想要的是 'execution_date'

如何直接使用'execution_date'并将其分配给我的python文件中的变量?

我遇到了访问args的一般问题。 任何帮助都将得到真诚的赞赏。

由于

6 个答案:

答案 0 :(得分:33)

BashOperator的{​​{1}} 参数模板。您可以使用bash_command变量在任何模板中以execution_date 对象的身份访问datetime。在模板中,您可以使用任何execution_date方法来操作它。

将以下内容用作jinja2 BashOperator 字符串

bash_command

如果您只想要相当于执行日期的字符串,# pass in the first of the current month some_command.sh {{ execution_date.replace(day=1) }} # last day of previous month some_command.sh {{ execution_date.replace(day=1) - macros.timedelta(days=1) }} 将返回一个日期戳(YYYY-MM-DD),ds将返回相同而不包含短划线(YYYYMMDD)等。更多关于{ {1}}中提供了{1}}。

您的最终运营商将如下所示:

ds_nodash

答案 1 :(得分:22)

PythonOperator构造函数采用'provide_context'参数(参见https://pythonhosted.org/airflow/code.html)。如果它是True,那么它通过kwargs将许多参数传递给python_callable。我相信kwargs ['execution_date']就是你想要的。

这样的事情:

{{1}}

我不确定如何使用BashOperator,但您可能会从这个问题开始:https://github.com/airbnb/airflow/issues/775

答案 2 :(得分:12)

我认为您无法使用任务实例外部的气流上下文中的值分配变量,它们仅在运行时可用。当dag加载并在气流中执行时,基本上有两个不同的步骤:

  • 首先解释和解析你的dag文件。它必须工作和编译,任务定义必须正确(没有语法错误或任何东西)。在此步骤中,如果您进行函数调用以填充某些值,则这些函数将无法访问气流上下文(例如,执行日期,如果您正在进行某些回填,则更多)。

  • 第二步是执行dag。只有在第二步中,气流(execution_date, ds, etc...)提供的变量才可用,因为它们与执行dag有关。

因此,您无法使用Airflow上下文初始化全局变量,但是,Airflow为您提供了多种机制来实现相同的效果:

  1. 在命令中使用jinja模板(它可以在代码或文件中的字符串中,两者都将被处理)。您可以在此处获得可用模板列表:https://airflow.apache.org/macros.html#default-variables。请注意,某些功能也可用,特别是对于计算天数增量和日期格式。

  2. 使用PythonOperator传递上下文(带有provide_context参数)。这将允许您使用语法kwargs['<variable_name']访问同一模板。如果需要,可以从PythonOperator返回一个值,这个值将存储在一个XCOM变量中,以后可以在任何模板中使用。对XCOM变量的访问使用以下语法:https://airflow.apache.org/concepts.html#xcoms

  3. 如果您编写自己的运算符,则可以使用dict context访问气流变量。

答案 3 :(得分:7)

temp

这应该在Operator

的execute()方法中

答案 4 :(得分:0)

要在.o的可调用函数中打印执行日期,可以在Airflow脚本中使用以下内容,还可以如下添加PythonOperatorstart_time

end_time

我已将datetime值转换为字符串,因为我需要在SQL查询中传递它。我们也可以使用它。

答案 5 :(得分:0)

您可以考虑使用SimpleHttpOperator https://airflow.apache.org/_api/airflow/operators/http_operator/index.html#airflow.operators.http_operator.SimpleHttpOperator。发出http请求非常简单。您可以通过模板传递带有端点参数的execution_date。