1, 任务设计
说明:
- 一、二期都有同样的处理,包括汇聚、入库。
- 二期汇聚,依赖一期的汇聚结果。
- 一、二期都入完Oracle后,再启动Oracle侧的汇聚。
2, 配置 dag
# 隐藏 airflow 自带的 dag 样例
[root@do-airflow ~]# systemctl stop airflow-webserver
[root@do-airflow ~]# systemctl stop airflow-scheduler
[root@do-airflow ~]# vi /opt/airflow/airflow.cfg
load_examples = False
## 可以重启 airflow 服务的话,那就按下方操作
### 如果 airflow 从未初始化过,那就执行 initdb 使其生效
[root@do-airflow ~]# airflow initdb
### 否则,执行 resetdb 使其生效
[root@do-airflow ~]# airflow resetdb -y
[root@do-airflow ~]# systemctl start airflow-webserver
[root@do-airflow ~]# systemctl start airflow-scheduler
## 不可以重启 airflow 服务的话,那就按下方操作
### 指定 dag_id,逐个删除 dag
[root@do-airflow ~]# airflow delete_dag example_dag_to_delete
# 编写一段用来测试的 shell 脚本,接收两个参数
# 第一个是任务类型,即一期(a),二期(b)
# 第二个是任务的进度,即汇聚(1),入库(2)
[root@do-airflow ~]# vi /root/test.script.sh
#!/bin/bash
S_FILE=""
case $2 in
"1")
S_FILE="/root/$1.1.log"
;;
"2")
S_FILE="/root/$1.2.log"
;;
"3")
S_FILE="/root/$1.3.log"
;;
*)
S_FILE=""
;;
esac
if [[ $S_FILE == "" ]]; then
exit
fi
rm -f $S_FILE
I=0
while true; do
S_MSG=`date "+%Y-%m-%d %H:%M:%S"`
echo $S_MSG
echo $S_MSG >> $S_FILE
((I=I+1))
if [[ $I == 10 ]]; then
break
fi
sleep 1
done
# 给文件可执行的权限
[root@do-airflow ~]# chmod 755 /root/test.script.sh
# 以下编写 dag
[root@do-airflow ~]# vi /root/a_hello.py
import airflow
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import timedelta
default_args = {
'owner': 'dosrain',
'depends_on_past': False,
'start_date': airflow.utils.dates.days_ago(2)
}
dag = DAG(
dag_id='a_hello',
default_args=default_args,
description='my first DAG',
schedule_interval=None)
# 一期汇聚
a1_operator = BashOperator(
task_id='a1_task',
bash_command='/root/test.script.sh a 1',
dag=dag)
# 一期入库
a2_operator = BashOperator(
task_id='a2_task',
bash_command='/root/test.script.sh a 2',
dag=dag)
# 二期汇聚
b1_operator = BashOperator(
task_id='b1_task',
bash_command='/root/test.script.sh b 1',
dag=dag)
# 二期入库
b2_operator = BashOperator(
task_id='b2_task',
bash_command='/root/test.script.sh b 2',
dag=dag)
# Oracle汇聚
c1_operator = BashOperator(
task_id='c1_task',
bash_command='/root/test.script.sh c 1',
dag=dag)
a1_operator>>a2_operator
a1_operator>>b1_operator
b1_operator>>b2_operator
a2_operator>>c1_operator
b2_operator>>c1_operator
# 另外一种写法
# a2_operator.set_upstream(a1_operator)
# b1_operator.set_upstream(a1_operator)
# b2_operator.set_upstream(b1_operator)
# c1_operator.set_upstream(a2_operator)
# c1_operator.set_upstream(b2_operator)
# 以上编写 dag
# 看看有没有语法错误,不报 Exception 就算通过
[root@do-airflow ~]# python3 a_hello.py
[root@do-airflow ~]#
# 复制到 dag 目录下
## 看一下配置文件中的 dags 目录在哪里
[root@do-airflow ~]# cat /opt/airflow/airflow.cfg | grep ^dags_folder
dags_folder = /opt/airflow/dags
## 没有就创建一个
[root@do-airflow ~]# mkdir /opt/airflow/dags
## 把 a_hello.py 移过去
[root@do-airflow ~]# mv /root/a_hello.py /opt/airflow/dags/
## 刷新页面,坐等我们的dag出现在页面上。
http://192.168.109.131:8080/admin
点击 a_hello 那一行,列表右侧的 Graph View 按钮,查看依赖关系,见下图。
3, 测试及运行 dag
# 看看 airflow 是否可以识别出 dag 中的任务。
[root@do-airflow ~]# airflow list_tasks a_hello
a1_task
a2_task
a3_task
b1_task
b2_task
b3_task
访问 airflow 页面:http://192.168.109.131:8080/admin,找到名为 a_hello 的 dag,点击列表左侧的 toggle 开关,使其呈 on 状态,然后再点击列表右侧的 trigger dag 按钮来触发执行。
在 Graph View 页面,点击各 task 方块,再点 View Log 按钮,可以查看执行日志。
等待任务全部执行完毕,见下图:
核查执行结果:
[root@do-airflow ~]# ll --full-time /root/*.log
-rw-r--r--. 1 root root 200 2020-07-20 14:11:18.728971219 +0800 /root/a.1.log
-rw-r--r--. 1 root root 200 2020-07-20 14:12:31.252528742 +0800 /root/a.2.log
-rw-r--r--. 1 root root 200 2020-07-20 14:12:31.257528781 +0800 /root/b.1.log
-rw-r--r--. 1 root root 200 2020-07-20 14:13:45.216097337 +0800 /root/b.2.log
-rw-r--r--. 1 root root 200 2020-07-20 14:14:57.093649893 +0800 /root/c.1.log