我真的是这个论坛的新手。但是我一直在为我们的公司玩气流。对不起,如果这个问题听起来真的很蠢。
我正在使用一堆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的一般问题。 任何帮助都将得到真诚的赞赏。
由于
答案 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为您提供了多种机制来实现相同的效果:
在命令中使用jinja模板(它可以在代码或文件中的字符串中,两者都将被处理)。您可以在此处获得可用模板列表:https://airflow.apache.org/macros.html#default-variables。请注意,某些功能也可用,特别是对于计算天数增量和日期格式。
使用PythonOperator传递上下文(带有provide_context
参数)。这将允许您使用语法kwargs['<variable_name']
访问同一模板。如果需要,可以从PythonOperator返回一个值,这个值将存储在一个XCOM变量中,以后可以在任何模板中使用。对XCOM变量的访问使用以下语法:https://airflow.apache.org/concepts.html#xcoms
如果您编写自己的运算符,则可以使用dict context
访问气流变量。
答案 3 :(得分:7)
temp
这应该在Operator
的execute()方法中答案 4 :(得分:0)
要在.o
的可调用函数中打印执行日期,可以在Airflow脚本中使用以下内容,还可以如下添加PythonOperator
和start_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。