Airflow生成基础DAG和Task的示例Python脚本

 环境: Pyhton 2.7.5 Airflow 1.10.1

 Dag代码如下:

# -*- coding: utf-8 -*-
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.dummy_operator import DummyOperator
from datetime import datetime, timedelta
import airflow
from airflow.models import Variable
from airflow.operators.python_operator import BranchPythonOperator, PythonOperator
import os, sys

####################################################################
# 名称:AirFlow First
#  测试Airflow功能的一个python脚本
####################################################################
reload(sys)
sys.setdefaultencoding('utf8')

# 定义DAG需要的一些默认参数
default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2023, 3, 21), #调度开始时间
    'email': ['zhangjiaqi01@happycfc.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(2023, 3, 30), #调度失效时间 如果时间大于这个值 调度不会生效 而且无法自己启动
    'x_name': 'xiaozhangtest_1'  # 不生效 无法获取
}
# 声明dag名字和调度时间
dag = DAG(
    'test_zjq', default_args=default_args, schedule_interval='*/5 * * * *')  # schedule_interval=timedelta(days=1)

# Variables 参数


# 挂载task到dag上 taskid和dag是必须传的
t1 = BashOperator(
    task_id='print_date',
    bash_command='date ',
    dag=dag)

t2 = BashOperator(
    task_id='add_default_args',
    bash_command='echo {{x_name}} ',
    retries=3,
    dag=dag)

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

#模板命令 这个命令也可以通过paramas传递参数进去 然后在上面的templated_command中直接使用
t3 = BashOperator(
    task_id='templated',
    bash_command=templated_command,
    params={'my_param': 'Parameter I passed in'},
    dag=dag)

t4 = BashOperator(
    task_id='echo_ds',
    bash_command='echo {{ds}} {{execution_date}} ',
    dag=dag)


def my_func():
    print('Hello from my_func')


t5 = PythonOperator(task_id='python_task',
                    python_callable=my_func,
                    dag=dag)


def SendEmail(my_param, **kwargs):
    print(my_param)
    print(kwargs['key1'])
    print(kwargs['key2'])


t6 = PythonOperator(task_id='kwargs',
                    python_callable=SendEmail,
                    op_kwargs={'my_param': '随便试试', 'key1': '第一个参数', 'key2': '第二个参数'},
                    dag=dag)


#**kwargs 是airflow内置的一个dict 可以自己在调用这个方法的Operator里面传递参数
def get_task_run(**kwargs):
    print kwargs['flag']
    print kwargs['key2']
    print Variable.get("testByZjq")
    flag_x = kwargs['flag']
    if flag_x == 1:
        return 'run_this_last_7'
    else:
        return 'run_this_last_8'


# 可以在airflow的web页面设置的一个参数 通过下面这个方法获取 可以再task和dag中使用
fo = Variable.get("testByZjq")
#选择功能的Operator 调用的方法必须返回一个已经存在的taskid
branch_op = BranchPythonOperator(
    task_id="branch_task",
    python_callable=get_task_run,
    op_kwargs={'flag': fo, 'key2': 'value2'}, #这个op_kwargs 就是给方法里面的**kwargs传递参数的
    dag=dag,
)

#特殊的Operator 什么也不做 一般用在开头和结尾
t7 = DummyOperator(
    task_id='run_this_last_7',
    dag=dag
)

t8 = DummyOperator(
    task_id='run_this_last_8',
    dag=dag
)
# 指定依赖关系
t2.set_upstream(t1)
t3.set_upstream(t1)
t4.set_upstream(t3)
t5.set_upstream(t4)
t6.set_upstream(t5)
branch_op.set_upstream(t6)
branch_op.set_downstream([t7, t8])

 

posted @ 2023-03-24 10:18  超级无敌小剑  阅读(468)  评论(0编辑  收藏  举报