azkaban的复杂场景使用以及使用时发现的一些坑!

前言

使用教程

搭建一个az

完成一个复杂的azkaban使用案例,结构图如下

azkaban的复杂场景使用以及使用时发现的一些坑!_第1张图片

任务描述

  • job1:使用az框架传参,打印任务准备开始!
  • job2:依赖于job1,在本地创建一个目录名字叫做inputwc!
  • job3:依赖于job2,利用hive查询结果并输出到指定目录下的指定文件里
  • job4:依赖于job2,调用自定义java程序生成一个文件,内容是职业名称并用制表符隔开!
  • job5:依赖于job3,job4,将java程序输出的结果追加到hive查询结果里!
  • job6:依赖于job5,将生成的inputwc目录上传到hdfs上!
  • job7:调用wordcount 来统计职业出现的次数!

结果预期

azkaban的复杂场景使用以及使用时发现的一些坑!_第2张图片

代码展示

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的依然不识别!
    azkaban的复杂场景使用以及使用时发现的一些坑!_第3张图片

其他功能展示

定时任务

azkaban的复杂场景使用以及使用时发现的一些坑!_第4张图片

  • 选择东8区

  • 选择第一次执行日期和时间!

  • checkbox勾选代表需要定时执行,selectlist里面选择单位,input框里面输入数字!

  • 关键的一点!!!如果执行定时任务需要传参数,请在输入参数之后再进入定时调度选项,选项在右下角的schedule!
    azkaban的复杂场景使用以及使用时发现的一些坑!_第5张图片一定先输入参数!!! 一定先输入参数!!! 一定先输入参数!!!

email报警功能!

SLA!

azkaban的复杂场景使用以及使用时发现的一些坑!_第6张图片

azkaban的复杂场景使用以及使用时发现的一些坑!_第7张图片

azkaban的复杂场景使用以及使用时发现的一些坑!_第8张图片

在定时任务里有这样的选项,可以设置某个job是成功or完成超过HH:MM这个阈值,就对job进行杀死或者发邮件报警!

普通调度中email报警

azkaban的复杂场景使用以及使用时发现的一些坑!_第9张图片

job list

azkaban的复杂场景使用以及使用时发现的一些坑!_第10张图片可以查询每个job执行情况!
从history中进入选择工作流!

总结

  • bash -c使用时注意引号的嵌套!单引号外层只能用双引号否则会使解析出问题!
  • 当上传失败时!肯定是job代码有bug!

踩坑!

虽然很ZZ,但是还是有必要贴出来,毕竟自己找了半天才发现的错误!

  • 栈溢出!

azkaban的复杂场景使用以及使用时发现的一些坑!_第11张图片

如果上传的时候出现栈溢出,一般只有一种可能,那就是出现递归调用,在解析时出现的递归调用只有一种可能,那就是依赖关系!我自己写job5的时候出现job5依赖job5!检查了半天才发现!!

  • job必须是以 .job 结尾的文件。类型是 * . * !!!
  • job打包必须是zip格式!
  • java自定义程序 type 必须是 javaprocess,java.class必须是全类名,classpath必须是绝对路径!
  • 运行azkaban的服务所在机器上面必须有配置HADOOP_HOME环境HIVE环境才能使用笔者简写的方式调用,否则只能使用全类名来进行调用!!!!
  • 启动azkaban时必须在executor或者web-server的conf目录的同级运行脚本,否则会报错找不到全局配置文件!!
  • 单引号不能嵌套,外层要改为" " 双引号来引起来!

你可能感兴趣的:(大数据)