气流:在运营商之外使用宏

时间:2017-07-12 18:14:51

标签: hadoop macros airflow apache-airflow airbnb

有没有办法在任何运营商之外使用Airflow宏?

例如,在DAG中我有一个动作:

datestamp = '{{ ds }}'

print(datestamp) # prints string not the date when I run it for any date

scanner = S3KeySensor(
        task_id='scanner',
        poke_interval=60,
        timeout=24 * 60 * 60,
        soft_fail=False,
        wildcard_match=True,
        bucket_key=getPath() + datestamp, #datestamp correctly replaced with execution date
        bucket_name=bucketName,
        dag=dag)

因此,当调用扫描程序时,“ds”值将被替换为预期的执行日期,但我想在其他一些地方使用“ds”值。但在这种情况下,它不会替换值,而是将整个字符串作为“{{ds}}”。在上面的例子中。 print语句打印“{{ds}}”而不是执行日期。

2 个答案:

答案 0 :(得分:1)

幸运的是你bucket_key是模板化的,只需将jinja模板放入其中。

…
bucket_key=getPath() + '{{ ds }}',
…

完全在操作员外部,您无法使用这些宏。因为调度程序会定期解释文件,而不仅仅是在dag运行期间。那么当dag没有运行时ds的值是多少呢?

然而,由于你不太可能想要在任务之外对它做任何事情,你可以把它放到模板化的领域。您还可以扩展另一个要模板化的字段。

class MySensor(S3KeySensor):
    template_fields = ('bucket_key', 'bucket_name', 'my_thing')

    def __init__(self, my_thing=None, *args, **kwargs):
        super(MySensor, self).__init__(*args, **kwargs)
        self.my_tyhing = my_thing

    def post_execute(self, context):
        logging.info(
           "I probably wanted to over-ride poke to use {}".format(my_thing)

scanner = MySensor(
    my_thing='{{ ds }}',
    task_id='scanner',
    poke_interval=60,
    timeout=24 * 60 * 60,
    soft_fail=False,
    wildcard_match=True,
    bucket_key=getPath() + '{{ ds }}',
    bucket_name=bucketName,
    dag=dag)

答案 1 :(得分:-3)

使用双引号。

datestamp = "{{ ds }}"
print datestamp