繁体   English   中英

设定气流计划间隔

[英]set airflow schedule interval

我已经在airflow中创建了任务,我计划每小时运行一次, start_date设置为2016-11-16

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2016, 11, 16),
    'email': ['airflow@airflow.com'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
    # 'queue': 'bash_queue',
    # 'pool': 'backfill',
    # 'priority_weight': 10,
    # 'end_date': datetime(2016, 1, 1),
}

dag = DAG('test_hourly_job', default_args=default_args,schedule_interval="@hourly")

我在当前时间10:00 AM开始气流,我可以看到Airflow从00:00 AM运行,然后是01:00 AM ,依此类推:

INFO - Executing command: airflow run test_hourly_job task1 2016-11-16T00:00:00 --local -sd DAGS_FOLDER/test_airflow.py
........
........
INFO - Executing command: airflow run test_hourly_job task1 2016-11-16T01:00:00 --local -sd DAGS_FOLDER/test_airflow.py 
.......
....... 

如何配置气流从当前时间开始说并且每小时运行一次,而不是从00:00开始?

在你的问题中你写了字典:default_args

In this there is Key: 'start_date': datetime(2016, 11, 16)

实际上这里是创建了具有输入YYYY / MM / DD格式的datetime对象,我们没有提供时间输入所以默认为00:00,所以你的脚本在00:00运行你可以这样检查:在python中

从datetime导入日期时间

日期时间(2016,11,16)

 #That Datetime object is generated with 00:00 Time  

#datetime(2016,11,16,0,0)

#If you need Current date and time to start process you can set value as:
'start_date': datetime.now()
#if you want only current time with respective date then you can use as fallows:

current_date = datetime.now() 
default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2016, 11, 16, current_date.hour, current_date.minute),
    'email': ['airflow@airflow.com'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
    # 'queue': 'bash_queue',
    # 'pool': 'backfill',
    # 'priority_weight': 10,
    # 'end_date': datetime(2016, 1, 1),
}
dag = DAG('test_hourly_job', default_args=default_args,schedule_interval="@hourly")
  1. 在python虚拟环境中安装气流。
  2. 激活环境。
  3. ~/airflow/airflow.cfg重置load_examples = False
  4. 启动气流。 $ airflow webserver -p <port>
  5. 将下面的dag复制到~/airflow/dags
  6. 启动调度程序$ airflow scheduler

现在有关计划间隔,请参阅以下代码。

尝试这个:

 'start_date': datetime.now()
 dag = DAG('tutorial', default_args=default_args, schedule_interval="* * * * *")

要么

'start_date': datetime(2015, 6, 1),
dag = DAG('tutorial', default_args=default_args, schedule_interval="@hourly")

完整代码

"""
Code that goes along with the Airflow tutorial located at:
https://github.com/airbnb/airflow/blob/master/airflow/example_dags/tutorial.py
"""
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta


default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    #'start_date': datetime(2015, 6, 1),
    'start_date': datetime.now(),
    'email': ['airflow@airflow.com'],
    'email_on_failure': False,
    'email_on_retry': False,
    #'retries': 1,
    #'retry_delay': timedelta(minutes=5),
    # 'queue': 'bash_queue',
    # 'pool': 'backfill',
    # 'priority_weight': 10,
    # 'end_date': datetime(2016, 1, 1),
}

dag = DAG('tutorial', default_args=default_args, schedule_interval="* * * * *") // For minute
#dag = DAG('tutorial', default_args=default_args, schedule_interval="@hourly")
#

# t1, t2 and t3 are examples of tasks created by instantiating operators
t1 = BashOperator(
    task_id='print_date',
    bash_command='date',
    dag=dag)

t2 = BashOperator(
    task_id='sleep',
    bash_command='sleep 5',
    retries=3,
    dag=dag)

templated_command = """
    {% for i in range(5) %}
        echo "{{ ds }}"
        echo "{{ macros.ds_add(ds, 7)}}"
        echo "{{ params.my_param }}"
    {% endfor %}
"""

t3 = BashOperator(
    task_id='templated',
    bash_command=templated_command,
    params={'my_param': 'Parameter I passed in'},
    dag=dag)

t2.set_upstream(t1)
t3.set_upstream(t1)

Airflow为名为LatestOnlyOperator的运算符提供gem,以跳过在DAG的最近计划运行期间未运行的任务。 如果现在的时间不在其execution_time和下一个计划的execution_time之间,则LatestOnlyOperator将跳过所有直接下游任务及其自身。 该运算符可减少CPU周期的浪费。

default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime(2016, 11, 16),
'email': ['airflow@airflow.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5)
}

dag = DAG('test_hourly_job', default_args=default_args,schedule_interval="@hourly")

latest_only = LatestOnlyOperator(task_id='latest_only', dag=dag)

task1 = DummyOperator(task_id='task1', dag=dag)

latest_only >> task  

Latest_only应始终位于您要跳过的任务的上游。 latest_only运算符的优点是无论何时重新启动dag,它都会跳过以前所有的任务并运行当前的dag。

最好不要硬编码开始时间。 而是放:

from datetime import datetime, timedelta

START_DATE = datetime.combine(datetime.today() - timedelta(1), datetime.min.time())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM