当前生产上的任务主要分为两部分:sqoop任务和hive计算任务,测试这两种任务,分别以shell文件和直接执行命令的方式来测试.

本次测试的表是airflow.code_library.

1.测试sqoop任务

1.1 测试全量抽取

1.1.1.直接执行命令

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta default_args = {
'owner': 'yangxw',
'depends_on_past': False,
'start_date': datetime(2017, 5, 23),
}
dag = DAG('sqoop4', default_args=default_args,schedule_interval=None)
bash_cmd = '''
sqoop import \
--connect jdbc:oracle:thin:@//XX.XX.XX.XX/aaaa \
--username bbbb --password 'cccc' \
--query " select CODENO, ITEMNO, ITEMNAME, BANKNO, SORTNO, ISINUSE, ITEMDESCRIBE, ITEMATTRIBUTE, RELATIVECODE, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, ATTRIBUTE6, ATTRIBUTE7, ATTRIBUTE8, INPUTUSER, INPUTORG, INPUTTIME, UPDATEUSER, UPDATETIME, REMARK, HELPTEXT , to_char(SysDate,'YYYY-MM-DD HH24:mi:ss') as etl_in_dt from XDGL.CODE_LIBRARY where \$CONDITIONS " \
--hcatalog-database airflow \
--hcatalog-table CODE_LIBRARY \
--hcatalog-storage-stanza 'stored as ORC' \
--hive-overwrite \
--hive-delims-replacement " " -m 1
'''
t1 = BashOperator(
task_id='sqoopshell',
bash_command=bash_cmd,
dag=dag)

测试成功,数据导入到表中.

1.1.2.以shell文件方式执行sqoop或hive任务

上述步骤虽然可以执行成功,但是如果要truncate 表,那么还要需要再增加一个task来执行truncate命令,这样一个ETL任务就要分成两个task很不方便.通过shell将truncate和import放在一起执行.

1)创建dag

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta default_args = {
'owner': 'yangxw',
'depends_on_past': False,
'start_date': datetime(2017, 5, 23)
} dag = DAG('sqoop7', default_args=default_args,schedule_interval=None) bash_cmd = 'sh /home/airflow/sqoop3.sh'
t1 = BashOperator(
task_id='sqoop7',
bash_command=bash_cmd,
dag=dag)

2)创建shell文件

hive -e "truncate table airflow.CODE_LIBRARY"
sqoop import \
--connect jdbc:oracle:thin:@//AAAA/BBB \
--username CCC --password 'DDD' \
--query " select CODENO, ITEMNO, ITEMNAME, BANKNO, SORTNO, ISINUSE, ITEMDESCRIBE, ITEMATTRIBUTE, RELATIVECODE, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, ATTRIBUTE6, ATTRIBUT
E7, ATTRIBUTE8, INPUTUSER, INPUTORG, INPUTTIME, UPDATEUSER, UPDATETIME, REMARK, HELPTEXT , to_char(SysDate,'YYYY-MM-DD HH24:mi:ss') as etl_in_dt from XDGL.CODE_LIBRARY where \$CONDITIONS " \
--hcatalog-database airflow \
--hcatalog-table CODE_LIBRARY \
--hcatalog-storage-stanza 'stored as ORC' \
--hive-overwrite \
--hive-delims-replacement " " -m 1

将这些文件分发到scheduler和worker节点上,然后执行:

查看日志会报错:

…………
[2017-05-24 10:55:52,853] {base_task_runner.py:95} INFO - Subtask: File "/opt/anaconda2/lib/python2.7/site-packages/jinja2/loaders.py", line 187, in get_source
[2017-05-24 10:55:52,853] {base_task_runner.py:95} INFO - Subtask: raise TemplateNotFound(template)
[2017-05-24 10:55:52,854] {base_task_runner.py:95} INFO - Subtask: jinja2.exceptions.TemplateNotFound: sh /home/airflow/sqoop3.sh

这是airflow的一个bug,默认会使用jinja2的语法来解析task.

bash_cmd = 'sh /home/airflow/sqoop3.sh' 修改为
bash_cmd = '{{"sh /home/airflow/sqoop3.sh"}}' 即可

测试成功.或者使用:

bash_cmd = '''
sh /home/airflow/sqoop3.sh
'''

也可以执行成功.

1.2 测试增量抽取

新建个dag,sqoop8.

dag = DAG('sqoop8', default_args=default_args,schedule_interval=None)

bash_cmd = '''
sh /home/airflow/sqoop4.sh %s
''' % '2017-05-24' t1 = BashOperator(
task_id='sqoop8',
bash_command=bash_cmd,
dag=dag)

创建shell:

hive -e "alter table airflow.ACCT_FEE_ARCH drop partition(p_day='$1');"
sqoop import --connect jdbc:oracle:thin:@//AAA/BBB --username CCC --password 'DDD' \
--query " select SERIALNO, \
……
to_char(SYNCHDATE, 'YYYY-MM-DD HH24:mi:ss') as SYNCHDATE , to_char(SysDate,'YYYY-MM-DD HH24:mi:ss') as ETL_IN_DT \
from XDGL.ACCT_FEE_ARCH \
where SYNCHDATE < (TO_DATE('$1', 'YYYY-MM-DD') +1) and SYNCHDATE >= (TO_DATE('$1', 'YYYY-MM-DD')) and \$CONDITIONS " \
--hcatalog-database airflow \
--hcatalog-table ACCT_FEE_ARCH \
--hcatalog-storage-stanza 'stored as ORC' \
--hive-partition-key p_day --hive-partition-value $1 \
--hive-delims-replacement " " -m 1

2.测试hive任务

上面以shell方式执行了hive truncate任务,下面以命令的方式执行sql文件.

创建sqoop9:

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta
from airflow.models import Variable default_args = {
'owner': 'yangxw',
'depends_on_past': False,
'start_date': datetime(2017, 5, 23)
} dag = DAG('hivesh2', default_args=default_args,schedule_interval=None)
str1 = Variable.get("str1")
bash_cmd = '''
hive -f "/home/airflow/hive1.sql" -hivevar tbname=%s
''' % str1 t1 = BashOperator(
task_id='hivesh2',
bash_command=bash_cmd,
dag=dag)

创建hive sql文件:

insert overwrite table airflow.tab_cnt select '${tbname}',  count(*) from ${tbname}

在页面上创建变量 str1=airflow.ACCT_FEE_ARCH

执行成功.

3.总结

1.如果执行shell,一定要用jinja2语法或者''' ''':

bash_cmd = '{{" sh /home/airflow/sqoop1.sh"}}' 或者

bash_cmd = '''

sh /home/airflow/sqoop1.sh

'''

2.所有的文件必须复制到所有节点

python文件\shell文件\sql文件,必须复制到所有的webserver scheduler worker节点

3.有时候使用python命令编译不出来pyc文件,在页面上只能看到dag名称,不能看到代码及调度等.这时使用

python -m py_compile XXX.py 来编译

4.airflow的dag一旦创建就无法删除,错误的或者多余的dag可以设置为pause模式并隐藏.

5.shell的方式适合执行sqoop任务,可以将truncate table\drop partition和import一步执行完成,不用起两个task来执行.命令的方式适合执行hive 任务,通过hive -f XXX.sql --hivevar a=%s b=%s的方式,动态的传递参数给hive.

4.airflow测试的更多相关文章

  1. Airflow Comman Line 测试

    官网文档:https://incubator-airflow.readthedocs.io/en/latest/cli.html clear (1)clear 指定日期某一个dag下的任务,任务名可以 ...

  2. 灵活可扩展的工作流管理平台Airflow

    1. 引言 Airflow是Airbnb开源的一个用Python写就的工作流管理平台(workflow management platform).在前一篇文章中,介绍了如何用Crontab管理数据流, ...

  3. 系统研究Airbnb开源项目airflow

    开源项目airflow的一点研究 调研了一些几个调度系统, airflow 更满意一些. 花了些时间写了这个博文, 这应该是国内技术圈中最早系统性研究airflow的文章了.  转载请注明出处 htt ...

  4. 【原创】大数据基础之Airflow(1)简介、安装、使用

    airflow 1.10.0 官方:http://airflow.apache.org/ 一 简介 Airflow is a platform to programmatically author, ...

  5. airflow笔记

    airflow webserver --debug &  # debug 模式,在后台启动webserver airflow list_dags airflow list_tasks tuto ...

  6. 20170803 Airflow自带的API进行GET 和POST动作部分内容

    --1 首先你要有安装好的Airflow 环境并且在配置文件中有启用API 属性 --2 就是GET 和POST 方法的调用了 这里说一下,由于Airflow在网络上的资料比较少,可以从GETHUB中 ...

  7. 开源数据流管道-Luigi vs Azkaban vs Oozie vs Airflow

    原文链接:https://www.jianshu.com/p/4ae1faea733b 随着企业的发展,他们的工作流程变得更加复杂,越来越多的有着错综复杂依赖关系的工作流需要增加监控,故障排除.如果没 ...

  8. Python测试 ——开发工具库

    Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...

  9. apache airflow docker 运行简单试用

    airflow 是一个编排.调度和监控workflow的平台,由Airbnb开源,现在在Apache Software Foundation 孵化. airflow 将workflow编排为tasks ...

随机推荐

  1. Qt串口接收使用多个LCD控件显示不同的数据

    https://blog.csdn.net/qq_30976353/article/details/84836124 参考链接

  2. 【Linux】Linux文件跟目录管理

    熟悉Linux的大家都知道,在Linux中,一切皆文件,可能在有些人的理解中,Linux跟我们的Windows差不多,是都具有图形操作界面的一种操作系统,但是更深入的来说,Linux更偏向于用命令操作 ...

  3. MySQL----MySQL数据库入门----第一章 数据库入门

    第一章 数据库入门 1.1 数据库基础知识 1.1.1 数据库概述 数据不仅包括普通意义上的数字,还包括文字.图像.声音等.也就是说,凡是在计算机中用来描述事物的记录都可称作数据. 数据库的基本特点: ...

  4. pdf.js 打印出错

    两种方法:1.使用0.8.223版本的pdf.js2.viewer.js中 line 3642 PRINT_OUTPUT_SCALE=1,line 3639 pdfPage.getViewPort(2 ...

  5. 基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(一)之miscdevice和ioctl

    基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(一)之miscdevice和ioctl 0. 导语 在嵌入式的道路上寻寻觅觅很久,进入嵌入式这个行业也有几年的时间了,从2011年后 ...

  6. 嵌入式Linux系统移植——uboot常用命令

    flash的一般分区: 其它数据 环境变量 可执行程序.如bootloader print(可缩写为:pri):打印查看uboot这个软件中集成的环境变量setenv.saveenv:设置.保存环境变 ...

  7. Bessel函数的零点计算 MATLAB

    由于MATLAB自己没有附带贝塞尔函数零点,因此使用起来很不方便,特别是在绘制仿真场量时. 下面给出0-9阶的贝塞尔函数零点的计算公式,其中理论上计算零点个数N在50以内时较为精确: function ...

  8. 20155218 《Java程序设计》实验五(网络编程与安全)实验报告

    20155218 <Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 (一) 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上面 ...

  9. 20155232 实验一《Java开发环境的熟悉》实验报告

    20155232 实验一<Java开发环境的熟悉>实验报告 实验内容 使用JDK编译.运行简单的Java程序: 使用Eclipse 编辑.编译.运行.调试Java程序 实验要求 没有Lin ...

  10. 【LG3241】[HNOI2015]开店

    题面 洛谷 题解 20pts 直接暴力统计即可,复杂度\(O(NQ)\). 另20pts 我们考虑动态点分治. 怎么在原树上统计答案呢,我们对点\(x\), 预处理出其子节点数目\(s_0\),其子树 ...