前言
完成一个复杂的azkaban使用案例,结构图如下
任务描述
- job1:使用az框架传参,打印任务准备开始!
- job2:依赖于job1,在本地创建一个目录名字叫做inputwc!
- job3:依赖于job2,利用hive查询结果并输出到指定目录下的指定文件里
- job4:依赖于job2,调用自定义java程序生成一个文件,内容是职业名称并用制表符隔开!
- job5:依赖于job3,job4,将java程序输出的结果追加到hive查询结果里!
- job6:依赖于job5,将生成的inputwc目录上传到hdfs上!
- job7:调用wordcount 来统计职业出现的次数!
结果预期
代码展示
java代码
package com.zhengkw.azkaban;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* @ClassName:AzkabanTest
* @author: zhengkw
* @description: 输出用制表符隔开的字符串
* @date: 20/03/19下午 3:45
* @version:1.0
* @since: jdk 1.8
*/
public class AzkabanTest {
public static void main(String[] args) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream("/home/zhengkw/inputwc/hi.txt");
String words = "teachter" + "\t" + "doctor" + "\t" + "driver"
+ "\t" + "doctor" + "\t" + "driver" + "\t" + "doctor" + "\t" + "driver";
fos.write(words.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
job代码
job1
#first.job
type=command
command=echo ${param}
job2
type=command
dependencies=job1
command= mkdir -p /home/zhengkw/inputwc
job3
type=command
dependencies=job1,job2
command=bash -c "hive -e 'select job from zhengkw.emp' > /home/zhengkw/inputwc/emp.txt"
job4
type=javaprocess
denpendencies=job2
java.class=com.zhengkw.azkaban.AzkabanTest
classpath=/home/zhengkw/jar/*
java.class 要使用全类名!!!
job5
type=command
dependencies=job4,job3
command= bash -c 'cat /home/zhengkw/inputwc/hi.txt >> /home/zhengkw/inputwc/emp.txt'
job6
type=command
dependencies=job5
command= bash -c 'hadoop fs -put /home/zhengkw/inputwc /'
job7
type=command
dependencies=job6
command= bash -c 'hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /inputwc /azout'
注意事项
- java程序打包以后放到指定位置,job里面必须指定!classpath后面的参数为jar的路径!!java.class参数必须是全类名!!!
- job的文件类型是 *.* !而且结尾必须是.job!!!
- 打包选择zip格式,其他格式不支持!后缀为zip但是格式rar的依然不识别!
其他功能展示
定时任务
-
选择东8区
-
选择第一次执行日期和时间!
-
checkbox勾选代表需要定时执行,selectlist里面选择单位,input框里面输入数字!
-
关键的一点!!!如果执行定时任务需要传参数,请在输入参数之后再进入定时调度选项,选项在右下角的schedule!
一定先输入参数!!! 一定先输入参数!!! 一定先输入参数!!!
email报警功能!
SLA!
在定时任务里有这样的选项,可以设置某个job是成功or完成超过HH:MM这个阈值,就对job进行杀死或者发邮件报警!
普通调度中email报警
job list
可以查询每个job执行情况!
从history中进入选择工作流!
总结
- bash -c使用时注意引号的嵌套!单引号外层只能用双引号否则会使解析出问题!
- 当上传失败时!肯定是job代码有bug!
踩坑!
虽然很ZZ,但是还是有必要贴出来,毕竟自己找了半天才发现的错误!
- 栈溢出!
如果上传的时候出现栈溢出,一般只有一种可能,那就是出现递归调用,在解析时出现的递归调用只有一种可能,那就是依赖关系!我自己写job5的时候出现job5依赖job5!检查了半天才发现!!
- job必须是以 .job 结尾的文件。类型是 * . * !!!
- job打包必须是zip格式!
- java自定义程序 type 必须是 javaprocess,java.class必须是全类名,classpath必须是绝对路径!
- 运行azkaban的服务所在机器上面必须有配置HADOOP_HOME环境HIVE环境才能使用笔者简写的方式调用,否则只能使用全类名来进行调用!!!!
- 启动azkaban时必须在executor或者web-server的conf目录的同级运行脚本,否则会报错找不到全局配置文件!!
- 单引号不能嵌套,外层要改为" " 双引号来引起来!