一、目的
经过6个月的奋斗,项目的离线数仓部分终于可以上线了,因此整理一下离线数仓的整个流程,既是大家提供一个案例经验,也是对自己近半年的工作进行一个总结。
二、项目背景
项目行业属于交通行业,因此数据具有很多交通行业的特征,比如转向比数据就是统计车辆左转、右转、直行、掉头的车流量等等。
三、业务需求
(一)预估数据规模
(二)指标查询频率
指标的实时查询由Flink实时数仓计算,离线数仓这边提供指标的T+1的历史数据查询
四、数仓技术架构
(一)简而言之,数仓模块的数据源是Kafka,终点是ClickHouse数据库
第一步,用kettle采集Kafka的数据写入到HDFS中;
第二步,在Hive中建数仓,ODS层、DWD层和DWS层
第三步,把Hive的DWS层处理好的结果数据用kettle同步到ClickHouse数据库中
(二)注意点
1、ETL工具统一使用kettle
2、调度工具是海豚调度器
五、数仓环境部署
(一)部署原则:易部署、易维护
(二)部署工具及其版本
1、jdk1.8.0
2、MySQL8.0.31
3、Kafka_2.13-3.0.0(Kafka自带ZooKeeper)
4、ClickHouse21.9.5.16
5、Hadoop3.1.3
6、Hive3.1.2(不要用Spark作为计算引擎,默认的mr即可)
7、DolphinScheduler2.0.5
8、Kettle9.2
(三)部署脚本以及部署文档
由于一开始的数据规模不大以及服务器资源有限问题,所以目前使用的单机版部署,没有部署集群
六、数仓实施步骤(搭建好数仓环境后)
(一)步骤一、用Kettle从Kafka、MySQL等数据源采集数据然后写入HDFS
1、Kettle转换任务配置
(1)样例一:维度表数据——从MySQL导入数据到HDFS
(2)样例二:事实表数据——从Kafka采集数据到HDFS
2、Kettle转换任务配置注意点
(1)维度表数据——从MySQL导入数据到HDFS
2.1.1、由于维度表数据量少,因此直接overwrite写入HDFS中,每次都是覆盖的全量导入
2.1.2、为了减少磁盘资源使用,在Hadoop file output控件中加了gzip压缩方式
(2)事实表数据——从Kafka采集数据到HDFS
2.2.1、由于Kafka的数据在不停发送,所以Kettle任务就需要一直运行。
2.2.2、由于HDFS的特性是以packet为单位写入,一个packet是64KB,所以不能根据日期每天自动生成一个HDFS文件,那样的话每天都会丢失一部分数据。
因为只要每天最后剩余的数据不满64KB,那这部分数据就不会写入。kettle任务直接生成第二天的数据文件、写入第二天的数据,即使这天的数据文件的状态还在写入。
所以就直接生成一个HDFS文件,一直在这个文件里写入数据即可。后面先get到Linux本地,然后再overwrite写入HDFS的ODS层表中,这样不会每天丢数据。
2.2.3、由于kettle任务需要一直运行,所以Hadoop file output控件不能添加数据压缩方式。
否则虽然显示HDFS文件有数据,但只要任务不停止文件就不会压缩,这样HDFS文件实际上没有数据,所以HDFS文输出控件不能添加压缩
3、海豚调度器调度kettle转换任务
(1)首先,为了便于团队开发,kettle需要配置共享资源库,把kettle任务统一放在资源库中运行。
用海豚调度kettle任务不需要开启carte服务,如果是用xxl-job调度,那可以开启carte服务
(2)对于事实表数据——从Kafka采集数据到HDFS
3.2.1、脚本不要加日志文件,因为数据量太大。
#!/bin/bash
source /etc/profile
/usr/local/hurys/dc_env/kettle/data-integration/pan.sh -rep=hurys_linux_kettle_repository -user=admin -pass=admin -dir=/kafka_to_hdfs/ -trans=02_Kafka_to_HDFS_evaluation
3.2.2、工作流不需要定时,直接启动,一直跑任务即可
(3)对于维度表数据——从MySQL导入数据到HDFS
3.3.1、脚本可以添加日志文件
#!/bin/bash
source /etc/profile
/usr/local/hurys/dc_env/kettle/data-integration/pan.sh -rep=hurys_linux_kettle_repository -user=admin -pass=admin -dir=/mysql_to_hdfs/ -trans=04_MySQL_to_HDFS_t_team level=Basic >>/home/log/kettle/04_MySQL_to_HDFS_t_team_`date +%Y%m%d`.log
3.3.2、工作流需要定时,不过需要注意不同工作流的定时时间,保留工作流之间充足的定时区间
(二)步骤二、在Hive的ODS层数据库中建外部表加载HDFS中的数据
1、首先在ODS数据库中建外部表