本地数仓项目(三)—— 数据可视化和任务调度

1 背景

本文基于《本地数据仓库项目(一)——数仓搭建详细流程》和《本地数仓项目(二)——搭建系统业务数仓详细流程》数据为依托,实现数据可视化和任务调度

2 构造可视化数据

在mysql中新建ads_uv_count表

DROP TABLE IF EXISTS `ads_uv_count`;
CREATE TABLE `ads_uv_count`  (
  `dt` varchar(255) DEFAULT NULL COMMENT '统计日期',
  `day_count` bigint(200) DEFAULT NULL COMMENT '当日用户数量',
  `wk_count` bigint(200) DEFAULT NULL COMMENT '当周用户数量',
  `mn_count` bigint(200) DEFAULT NULL COMMENT '当月用户数量',
  `is_weekend` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'Y,N是否是周末,用于得到本周最终结果',
  `is_monthend` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'Y,N是否是月末,用于得到本月最终结果'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '每日活跃用户数量' ROW_FORMAT = Dynamic;

插入数据

INSERT INTO `ads_uv_count` VALUES ('2022-03-01 14:10:04', 20, 30, 100, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-02 14:12:48', 35, 50, 100, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-03 14:14:07', 25, 640, 3300, 'Y', 'Y');
INSERT INTO `ads_uv_count` VALUES ('2022-03-04 14:14:14', 10, 23, 123, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-05 14:14:21', 80, 121, 131, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-06 14:14:38', 30, 53, 453, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-07 14:33:27', 20, 31, 453, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-08 14:33:39', 10, 53, 453, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-09 14:33:47', 10, 34, 453, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-10 14:33:54', 10, 653, 8453, 'Y', 'Y');
INSERT INTO `ads_uv_count` VALUES ('2022-03-11 14:34:04', 100, 453, 1453, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-12 14:34:10', 101, 153, 134, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-13 14:34:16', 100, 286, 313, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-14 14:34:22', 100, 45, 453, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-15 14:34:29', 100, 345, 3453, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-16 14:34:35', 101, 453, 453, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-17 14:34:41', 100, 678, 9812, 'Y', 'Y');
INSERT INTO `ads_uv_count` VALUES ('2022-03-18 14:34:46', 100, 186, 193, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-19 14:34:53', 453, 686, 712, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-20 14:34:57', 452, 786, 823, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-21 14:35:02', 214, 58, 213, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-22 14:35:08', 76, 78, 95, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-23 14:35:13', 76, 658, 745, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-24 14:35:19', 76, 687, 9300, 'Y', 'Y');
INSERT INTO `ads_uv_count` VALUES ('2022-03-25 14:35:25', 76, 876, 923, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-26 14:35:30', 76, 456, 511, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-27 14:35:35', 76, 456, 623, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-28 14:35:41', 43, 753, 4000, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-29 14:35:47', 76, 876, 4545, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-30 14:35:57', 76, 354, 523, 'N', 'N');
INSERT INTO `ads_uv_count` VALUES ('2022-03-31 14:36:02', 43, 634, 6213, 'Y', 'Y');

2.1 留存率统计

2.1.1 建表

DROP TABLE IF EXISTS `ads_user_retention_day_rate`;
CREATE TABLE `ads_user_retention_day_rate`  (
  `stat_date` varchar(255)  DEFAULT NULL COMMENT '统计日期',
  `create_date` varchar(255) DEFAULT NULL COMMENT '设备新增日期',
  `retention_day` bigint(200) DEFAULT NULL COMMENT '截止当前日期留存天数',
  `retention_count` bigint(200) DEFAULT NULL COMMENT '留存数量',
  `new_mid_count` bigint(200) DEFAULT NULL COMMENT '当日设备新增数量',
  `retention_ratio` decimal(10, 2) DEFAULT NULL COMMENT '留存率'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '每日用户留存情况' ROW_FORMAT = Dynamic;

2.1.2 插入数据

INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-09','2022-03-08', 1,88,  99,  0.78);
INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-10','2022-03-08', 2,77,  88,  0.68);
INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-11','2022-03-08', 3,66,  77,  0.58);
INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-12','2022-03-08', 4,55,  66,  0.48);
INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-13','2022-03-08', 5,44,  55,  0.38);
INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-14','2022-03-08', 6,33,  44,  0.28);
INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-10','2022-03-09', 1,77,  88,  0.56);
INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-11','2022-03-09', 2,66,  77,  0.46);
INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-12','2022-03-09', 3,55,  66,  0.36);
INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-13','2022-03-09', 4,44,  55,  0.26);
INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-14','2022-03-09', 5,33,  44,  0.16);
INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-11','2022-03-10', 1,66,  77,  0.55);
INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-12','2022-03-10', 2,55,  66,  0.45);
INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-13','2022-03-10', 3,44,  55,  0.35);
INSERT INTO `ads_user_retention_day_rate` VALUES ('2022-03-14','2022-03-10', 4,33,  44,  0.25);

2.2 漏斗分析

2.2.1 建表

DROP TABLE IF EXISTS `ads_user_action_convert_day`;
CREATE TABLE `ads_user_action_convert_day`  (
  `dt` varchar(200) DEFAULT NULL COMMENT '统计日期',
  `total_visitor_m_count` bigint(20) DEFAULT NULL COMMENT '总访问人数',
  `order_u_count` bigint(20) DEFAULT NULL COMMENT '下单人数',
  `visitor2order_convert_ratio` decimal(10, 2) DEFAULT NULL COMMENT '购物车到下单转化率',
  `payment_u_count` bigint(20) DEFAULT NULL COMMENT '支付人数',
  `order2payment_convert_ratio` decimal(10, 2) DEFAULT NULL COMMENT '下单到支付的转化率'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '每日用户行为转化率统计' ROW_FORMAT = Dynamic;

2.2.2 导入数据

INSERT INTO `ads_user_action_convert_day` VALUES ('2022-04-28 19:36:18', 10000, 3000, 0.25, 2000, 0.15)

2.3 GMV统计

2.3.1 新建表

DROP TABLE IF EXISTS ads_gmv_sum_day;
CREATE TABLE ads_gmv_sum_day(
  `dt` varchar(200) DEFAULT NULL COMMENT '统计日期',
  `gmv_count` bigint(20) DEFAULT NULL COMMENT '当日gmv订单个数',
  `gmv_amount` decimal(16, 2) DEFAULT NULL COMMENT '当日gmv订单总金额',
  `gmv_payment` decimal(16, 2) DEFAULT NULL COMMENT '当日支付金额'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '每日活跃用户数量' ROW_FORMAT = Dynamic;

2.3.2 插入数据

INSERT INTO `ads_gmv_sum_day` VALUES ('2022-03-01 22:51:37', 1000, 210000.00, 2000.00);
INSERT INTO `ads_gmv_sum_day` VALUES ('2022-05-08 22:52:32', 3434, 12413.00, 1.00);
INSERT INTO `ads_gmv_sum_day` VALUES ('2022-07-13 22:52:51', 1222, 324345.00, 1.00);
INSERT INTO `ads_gmv_sum_day` VALUES ('2022-09-13 22:53:08', 2344, 12312.00, 1.00);

2.4 全国商品销售

2.4.1 创建表

DROP TABLE IF EXISTS `ads_gmv_sum_province`;
CREATE TABLE `ads_gmv_sum_province`  (
  `province` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `gmv` bigint(255) DEFAULT NULL,
  `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

2.4.2 插入数据

INSERT INTO `ads_gmv_sum_province` VALUES ('北京', 2000, '');
INSERT INTO `ads_gmv_sum_province` VALUES ('辽宁', 30000, '沈阳:21.1%,大连:20%,鞍山:35%');
INSERT INTO `ads_gmv_sum_province` VALUES ('浙江', 8002, '杭州:20%,舟山:50%');

3 web页面查看

1)运行spring-boot-echarts-master程序
运行前需要配置mysql地址
本地数仓项目(三)—— 数据可视化和任务调度_第1张图片

2)在web页面上查看显示结果
http://localhost:8080/active
springboot项目的jar包网盘内容如下:

链接:https://pan.baidu.com/s/1c5DlSiBwwuQf1UXb5bpBRQ
提取码:mya5

  1. 启动springboot项目后可看到如下简单图表展示
    本地数仓项目(三)—— 数据可视化和任务调度_第2张图片
    本地数仓项目(三)—— 数据可视化和任务调度_第3张图片
    本地数仓项目(三)—— 数据可视化和任务调度_第4张图片
    本地数仓项目(三)—— 数据可视化和任务调度_第5张图片

4 任务调度——Azkaban调度器

4.1 安装Azkaban调度器

4.1.1 解压tar包

tar -zxvf azkaban-executor-server-2.5.0.tar.gz
tar -zxvf azkaban-sql-script-2.5.0.tar.gz
tar -zxvf azkaban-web-server-2.5.0.tar.gz

4.1.2 创建azkaban数据库

进入mysql,创建azkaban数据库,并将解压的脚本导入到azkaban数据库。

mysql> create database azkaban;
Query OK, 1 row affected (0.00 sec)
mysql> use azkaban;
Database changed
mysql> source /root/soft/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql;

4.1.3 生成密钥库

keytool -keystore keystore -alias jetty -genkey -keyalg RSA

Keytool:是java数据证书的管理工具,使用户能够管理自己的公/私钥对及相关证书。
-keystore:指定密钥库的名称及位置(产生的各类信息将不在.keystore文件中)
-genkey:在用户主目录中创建一个默认文件".keystore"
-alias:对我们生成的.keystore进行指认别名;如果没有默认是mykey
-keyalg:指定密钥的算法 RSA/DSA 默认是DSA

本地数仓项目(三)—— 数据可视化和任务调度_第6张图片

将keystore 拷贝到 azkaban web服务器根目录中

mv keystore /root/soft/azkaban/azkaban-web-2.5.0/

4.1.4 配置文件

4.1.4.1 web配置文件
  1. 进入azkaban web服务器安装目录 conf目录,打开azkaban.properties文件
    2)按照如下配置修改azkaban.properties文件
#默认web server存放web文件的目录
web.resource.dir=/root/soft/azkaban/azkaban-web-2.5.0/web
#默认时区,已改为亚洲/上海 默认为美国
default.timezone.id=Asia/Shanghai
#用户权限管理默认类(绝对路径)
user.manager.xml.file=/root/soft/azkaban/azkaban-web-2.5.0/conf/azkaban-users.xml
#global配置文件所在位置(绝对路径)
executor.global.properties=/root/soft/azkaban/azkaban-executor-2.5.0/conf/global.properties
#数据库连接IP
mysql.host=192.168.2.100
#数据库实例名
mysql.database=azkaban
#数据库用户名
mysql.user=root
#数据库密码
mysql.password=123456
#SSL文件名(绝对路径)
jetty.keystore=/root/soft/azkaban/azkaban-web-2.5.0/keystore
#SSL文件密码
jetty.password=123456
#Jetty主密码与keystore文件相同
jetty.keypassword=123456
#SSL文件名(绝对路径)
jetty.truststore=/root/soft/azkaban/azkaban-web-2.5.0/keystore
#SSL文件密码
jetty.trustpassword=123456

3)在azkaban web服务器安装目录 conf目录,按照如下配置修改azkaban-users.xml 文件,增加管理员用户

"admin" password="admin" roles="admin" />
4.1.4.2 server配置

1) 按照如下配置修改azkaban.properties文件

#时区
default.timezone.id=Asia/Shanghai
executor.global.properties=/root/soft/azkaban/azkaban-executor-2.5.0/conf/global.properties
mysql.host=192.168.2.100
mysql.database=azkaban
mysql.user=root
mysql.password=123456

本地数仓项目(三)—— 数据可视化和任务调度_第7张图片

4.1.5 启动executor服务器

[root@wavehouse-1 bin]# pwd
/root/soft/azkaban/azkaban-executor-2.5.0/bin
[root@wavehouse-1 bin]# ./azkaban-executor-start.sh

本地数仓项目(三)—— 数据可视化和任务调度_第8张图片

4.1.6 启动web服务器

[root@wavehouse-1 azkaban-web-2.5.0]# pwd
/root/soft/azkaban/azkaban-web-2.5.0
[root@wavehouse-1 azkaban-web-2.5.0]# bin/azkaban-web-start.sh

本地数仓项目(三)—— 数据可视化和任务调度_第9张图片

4.1.7 jps查看启动进程

本地数仓项目(三)—— 数据可视化和任务调度_第10张图片

4.1.8 登录页面验证

启动完成后,在浏览器(建议使用谷歌浏览器)中输入https://服务器IP地址:8443,即可访问azkaban服务了。在登录中输入刚才在azkaban-users.xml文件中新添加的户用名及密码,点击 login。
本地数仓项目(三)—— 数据可视化和任务调度_第11张图片至此azkaban安装完成

4.2 Azkanba使用示例

4.2.1 单一job

  1. 创建frist.job
#first.job
type=command
command=echo 'this is my first job'
  1. 将job资源文件打包成zip文件
    注意:Azkaban上传的工作流文件只支持xxx.zip文件。zip应包含xxx.job运行作业所需的文件和任何文件(文件名后缀必须以.job结尾,否则无法识别)。作业名称在项目中必须是唯一的。
  2. 通过azkaban的web管理平台创建project并上传job的zip包
    本地数仓项目(三)—— 数据可视化和任务调度_第12张图片
    4)启动任务
    本地数仓项目(三)—— 数据可视化和任务调度_第13张图片
  3. 查看输出
    本地数仓项目(三)—— 数据可视化和任务调度_第14张图片

4.2.2 多job工作流

分别指定start.job ➡ step1.job ➡ step2.job ➡ end.job
start.job

#!/bin/bash
#start.job
type=command
command=touch /root/soft/azkaban/test/azkaban.txt

step1.job

#!/bin/bash
#step1.job
type=command
dependencies=start
command=echo "this is step1 job" >> /root/soft/azkaban/test/azkaban.txt

这里的dependencies字段指定依赖,即需要start.job启动完成后才会启动step1.job
step2.job

#!/bin/bash
#step2.job
type=command
dependencies=start
command=echo "this is step2 job" >> /root/soft/azkaban/test/azkaban.txt

end.job

#!/bin/bash
#end.job
type=command
dependencies=step1,step2
command=echo "this is end job" >> /root/soft/azkaban/test/azkaban.txt

压缩并上传zip包,可以看到任务执行逻辑
本地数仓项目(三)—— 数据可视化和任务调度_第15张图片
执行任务并查看日志
本地数仓项目(三)—— 数据可视化和任务调度_第16张图片

4.2.3 java操作任务

  1. 编写java程序并将依赖打成jar包
    注:如果java程序引入了其他依赖需要将所有依赖打成一个jar包,或将依赖的jar包上传到Azkaban的lib目录下并重启Azkaban服务。
  2. 编写job,并压缩成zip文件
    java.job
#!/bin/bash
type=javaprocess
java.class=com.atguigu.appclient.AppMain ${param1} ${param2}
classpath=/root/log-collector-1.0-SNAPSHOT-jar-with-dependencies.jar

这里的${param1}表示传参参数,在Azkaban指定参数,这里的参数名需要和前面定义的名保持一致
本地数仓项目(三)—— 数据可视化和任务调度_第17张图片
3) 启动job并查看结果
本地数仓项目(三)—— 数据可视化和任务调度_第18张图片

4.2.4 HDFS操作任务

1)创建hdfs.job
hdfs.job

#hdfs job
type=command
command=/root/soft/hadoop-2.7.2/bin/hadoop fs -mkdir /azkaban

2)压缩并上传zip
3) 执行并查看结果本地数仓项目(三)—— 数据可视化和任务调度_第19张图片
查看hdfs文件是否成功创建,可以看到已经成功创建了
本地数仓项目(三)—— 数据可视化和任务调度_第20张图片

4.2.5 MR任务

  1. 创建mr.job
#mapreduce job
type=command
command=/root/soft/hadoop-2.7.2/bin/hadoop jar /root/soft/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /wordcount /wordcount/output

2)压缩并提交zip
3)执行查看结果
本地数仓项目(三)—— 数据可视化和任务调度_第21张图片
4) 查看mr生成的结果
本地数仓项目(三)—— 数据可视化和任务调度_第22张图片

4.2.6 Hive任务

  1. 编写hive.sql和hive.job
    hive.job
#!/bin/bash
# hiva job
type=command
command=/root/soft/azkaban/test/hive.sql

hive.sql

use default;
drop table student;
create table student(id int, name string)
row format delimited fields terminated by '\t';
load data local inpath '/root/soft/azkaban/test/datas/student.txt' into table student;
insert overwrite local directory '/root/soft/azkaban/test/datas/student'
row format delimited fields terminated by '\t'
select * from student;

2) 压缩zip文件并上传
3) 查看任务日志
本地数仓项目(三)—— 数据可视化和任务调度_第23张图片
另外Azkanban还可以自定义执行时间、基于Azkaban功能可以实现业务数仓需求的各种调用,并实现自动化调度。
本地数仓项目(三)—— 数据可视化和任务调度_第24张图片
新增调度之后可以在Scheduling栏可以看到预调度的任务
本地数仓项目(三)—— 数据可视化和任务调度_第25张图片

接下来是数仓即席查询相关内容,详见《本地数仓项目(四)—— 即席查询》

你可能感兴趣的:(大数据数仓,数据仓库,数据分析,hive,Azkaban,任务调度)