文章目录
- (一)数据可视化工具选择
- (1)Zeppelin安装部署
- (2)Zepplin的界面参数配置
- (3)Zepplin的使用
- (二)任务调度
- (1)Crontab调度器的使用
- (2)Azkaban调度器的使用
- 1)Azkaban介绍
- 2)Azkaban安装部署
- 3)提交独立任务
(一)数据可视化工具选择
数据可视化工具可以选择现成的,想要查询hive中的数据可以使用hue,不过hue无法自动生成图表。所以我们可以考虑使用Zeppelin。针对一些复杂的图表,可以选择定制开发,使用echarts等组件实现
(1)Zeppelin安装部署
注意:不要使用Zeppelin0.8.2版本,这个版本有bug,无法使用图形展现数据。
在这我们使用zeppelin-0.9.0-preview1这个版本
1)下载zeppelin的安装包,上传解压
2)修改配置
[root@bigdata04 soft]# cd zeppelin-0.9.0-preview1-bin-all/conf
[root@bigdata04 conf]# mv zeppelin-env.sh.template zeppelin-env.sh
[root@bigdata04 conf]# mv zeppelin-site.xml.template zeppelin-site.xml
[root@bigdata04 conf]# vi zeppelin-site.xml
# 将默认的127.0.0.1改为0.0.0.0 否则默认情况下只能在本机访问zeppline
<property>
<name>zeppelin.server.addr</name>
<value>0.0.0.0</value>
<description>Server binding address</description>
</property>
- 增加Hive依赖jar包
由于我们需要使用Zepplien连接hive,它里面默认没有集成Hive的依赖jar包,所以最简单的方式就是将Hive的lib目录中的所有jar包全复制到Zeppline中的interpreter/jdbc目录中。
[root@bigdata04 zeppelin-0.9.0-preview1-bin-all]# cd interpreter/jdbc
[root@bigdata04 jdbc]# cp /data/soft/apache-hive-3.1.2-bin/lib/*.jar .
- 启动
#bin/zeppelin-daemon.sh start - 停止
bin/zeppelin-daemon.sh stop
(2)Zepplin的界面参数配置
Zepplin启动之后可以通过8080端口进行访问
http://bigdata04:8080/
在使用之前需要先配置hive的基本信息
右上角interpreter中搜索jdbc
点击edit修改里面的参数信息
修改这四项的内容即可,这里的内容其实就是我们之前学习hive的jdbc操作时指定的参数
参数 值 解释
default.url jdbc:hive2://192.168.23.103:10000
里面的ip是启动hiveserver2服务的机器ip
default.user root
default.password any 注意:密码随便填即可
default.driver org.apache.hive.jdbc.HiveDriver
注意:需要在192.168.182.103这台机器上启动hiveserver2服务,否则在zeppline中连不上hive
(3)Zepplin的使用
1) 创建一个note,类似于工作台的概念
2) 此时就可以在里面写SQL了。
(二)任务调度
针对数据仓库中的任务脚本我们前面已经整理过了,任务脚本还是比较多的,针对初始化表的脚本只需要执行一次即可,其它的脚本需要每天都执行一次,这个时候就需要涉及到任务定时调度了。
(1)Crontab调度器的使用
学习Linux的时候学过一个crontab调度器,通过它可以实现定时执行指定的脚本。
针对我们这个数据仓库中的这些脚本使用crontab进行调度是可以的但是需要注意一点:
这些任务之间是有一些依赖关系的,从大的层面上来说,dwd层的任务需要等ods层的任务执行成功之后才能开始执行。那crontab如何知道任务之间的依赖关系呢?
crontab是无法知道任务之间的依赖关系的,我们只能间接实现
- 举个例子:针对MapReduce任务和Spark任务,任务执行成功之后,在输出目录中会有一个success标记文件,这个文件表示这个任务成功的执行结束了。
此时如果我们使用crontab调度两个job,一个jobA,一个jobB,先执行jobA,jobA成功执行结束之后才能执行jobB,这个时候我们就需要在脚本中添加一个判断,判断jobA的结果输出目录中是否存在success文件,如果存在则继续执行jobB,否则不执行,并且告警,提示jobA任务执行失败。
那我们现在执行的是hive的sql任务,sql任务最终不会在输出目录中产生success文件,所以没有办法使用这个标记文件进行判断,不过sql任务会产生数据文件,数据文件的文件名是类似000000_0这样的,可能会有多个,具体的个数是由任务中的reduce的个数决定的,我们也可以选择判断这个数据文件是否存在来判断任务是否成功执行结束。 - 注意了:针对SQL任务虽然可以通过判断数据文件来判定任务是否执行成功,不过这种方式不能保证100%的准确率,有可能会存在这种情况,任务确实执行成功了,但是在向结果目录中写数据文件的时候,写了一半,由于网络原因导致数据没有写完,但是我们过来判断000000_0这个文件肯定是存在的,那我们就误以为这个任务执行成功了,其实它的数据是缺失一部分的,不过这种情况的概率极低,可以忽略不计。
此时使用crontab调度两个有依赖关系的任务,脚本该如何实现呢?
在bigdata04机器中创建 /data/soft/warehouse_job 目录
创建脚本: crontab_job_schedule.sh
#!/bin/bash
# 默认获取昨天的日期,也支持传参指定一个日期
if [ "z$1" = "z" ]
then
dt=`date +%Y%m%d --date="1 days ago"`
else
dt=$1
fi
# 执行jobA
# 先删除jobA的输出目录
hdfs dfs -rm -r hdfs://bigdata01:9000/data/dwd/user_addr/dt=${dt}
hive -e "
insert overwrite table dwd_mall.dwd_user_addr partition(dt='${dt}') select
addr_id,
user_id,
addr_name,
order_flag,
user_name,
mobile
from ods_mall.ods_user_addr
where dt = '${dt}' and addr_id is not null;
# 如果jobA执行成功,这条查询命令就可以成功执行,否则在执行的时候会报错
hdfs dfs -ls hdfs://bigdata01:9000/data/dwd/user_addr/dt=${dt}/000000_0
# 执行jobB,注意:jobB在执行的时候需要依赖于jobA的结果,所以必须要保证jobA执行成功之
# 在这里通过$?来判断上一条命令是否成功执行,如果$?的返回值为0,则表示jobA执行成功,否
if [ $? = 0 ]
then
echo "执行jobB"
else
# 可以在这里发短信或者发邮件
echo "jobA执行失败,请处理..."
fi
"
如果jobA成功执行,则jobB也可以执行,如果jobA执行失败,则jobB不会执行,脚本会生成告警信息。
这就是使用crontab调度器如何实现任务依赖的功能。
如果项目中的定时任务有很多,使用crontab虽然可以实现任务依赖的功能,但是管理起来不方便,
crontab没有提供图形化的界面,使用起来比较麻烦
针对一些简单的定时任务的配置,并且任务比较少的情况下使用crontab是比较方便的。
(2)Azkaban调度器的使用
1)Azkaban介绍
在实际工作中如果需要配置很多的定时任务,一般会采用一些支持界面操作的调度器,例如:Azkaban、
Ooize
- Azkaban是一个轻量级的调度器,使用起来比较简单,容易上手。
- Ooize是一个重量级的调度器,使用起来相对比较复杂。
在这里我们主要考虑易用性,所以我们选择使用Azkaban。
下面我们来快速了解一下Azkaban,以及它的用法。
Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一
组工作和流程。
Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
那我们首先把Azkaban安装部署起来
官网下载的Azkaban是源码,需要编译,编译过程会非常慢,主要是由于国外网络原因导致的。
在这里我们就使用Azkaban的solo模式部署。
solo模式属于单机模式,那对应的Azkaban也支持在多台机器上运行。
solo模式的优点:
- 易于安装:无需MySQL示例。它将H2打包为主要的持久存储。
- 易于启动:Web服务器和执行程序服务器都在同一个进程中运行。
- 全功能:它包含所有Azkaban功能。
2)Azkaban安装部署
- 上传安装包,解压
- 修改Azkaban的时区为上海时区
我们的bigdata04机器在创建的时候已经指定了时区为上海时区, 要保证bigdata04机器的时区和Azkaban的时区是一致的。
cd conf/
[root@bigdata04 conf]# vi azkaban.properties
......
default.timezone.id=Asia/Shanghai
......
- 启动
bin/azkaban-solo-start.sh - 停止
bin/azkaban-solo-stop.sh
启动成功之后,azkaban会启动一个web界面,监听的端口是8081
http://bigdata04:8081/ 用户名和密码默认都是 azkaban
3)提交独立任务
1:先创建一个Project
2:向test项目中提交任务
先演示一个独立的任务
创建一个文件hello.job,文件内容如下:
# hello.job
type=command
command=echo "Hello World!"
这里面的#号开头表示是注释
type:任务类型,这里的command表示这个任务执行的是一个命令
command:这里的command是指具体的命令
将hello.job文件添加到一个zip压缩文件中,hello.zip。
将hello.zip压缩包提交到刚才创建的test项目中
3: 配置定时执行任务
点击Schedule,进入配置定时信息
4:提交依赖任务
`向depen_test项目中提交任务
先创建一个文件first.job
# first.job
type=command
command=echo "Hello First!"
再创建一个文件second.job
这里面通过dependencies属性指定了任务的依赖关系,后面的first表示依赖的任务的文件名称
# second.job
type=command
dependencies=first
command=echo "Hello Second!"
最后将这两个job文件打成一个zip压缩包,将这个压缩包上传到项目里面.点击Execute Flow,也可以看到任务之间的依赖关系。
总结:在数据仓库中使用Azkaban
针对数仓中的多级任务依赖,如何使用Azkaban实现
以统计电商GMV为例:
这个指标需要依赖于这个流程 MySQL–>HDFS–>ODS–>DWD–>APP
MySQL–>HDFS需要使用Sqoop脚本
HDFS–>ODS需要使用hive alter命令
ODS–>DWD需要使用hive的SQL
DWD–>APP需要使用hive的SQL