这是本人的学习过程,看到的同道中人祝福你们心若有所向往,何惧道阻且长;
但愿每一个人都像星星一样安详而从容的,不断沿着既定的目标走完自己的路程,一起做星光下的赶路人;
最后想说一句君子不隐其短,不知则问,不能则学。
如果大家觉得我写的还不错的话希望可以收获关注、点赞、收藏(谢谢大家)
一、数据仓库环境准备
1.1 数据仓库运行环境
1.1.1 Hive环境搭建
SQL(Code) =>(Hive => MR(Spark) =>jar)(Tool) => Yarn(RUN)
1、Hive引擎简介
Hive引擎包括:默认MR、Tez、Spark。
Hive on Spark:Hive既作为储存元数据又负责SQL的解析优化,语法是HQL语法,执行引擎变成了Spark,Spark负责采用RDD执行。
Spark On Hive:Hive只作为储存原数据,Spark负责SQL解析优化,语法是SparkSQL语法,Spark负责采用RDD执行。
2、Hive on Spark配置
(1)兼容性说明
注意:官网下载的Hive3.1.2和Spark3.0.0默认是不兼容的。因为Hive3.1.2支持的Spark版本是2.4.5,所以需要我们重新编译Hive3.1.2版本。
编译步骤:官网下载Hive3.1.2源码,修改pom文件中引用的Spark版本为3.0.0,如果编译通过,直接打包获取jar包。如果报错,就根据提示,修改相关方法,直到不报错,打包获取jar包。
(2)在Hive所在节点部署Spark
(2-1)Spark官网下载jar包地址
http://spark.apache.org/downloads.html
(2-2)上传并解压解压spark-3.0.0-bin-hadoop3.2.tgz
(2-3)配置SPARK_HOME环境变量
vim /etc/profile.d/my_env.sh #添加如下内容 # SPARK_HOME export SPARK_HOME=/opt/module/spark export PATH=$PATH:$SPARK_HOME/bin #Source使其生效 source /etc/profile.d/my_env.sh
(2-4)在hive中创建spark配置文件
vim /opt/module/hive/conf/spark-defaults.conf #添加如下内容(在执行任务时,会根据如下参数执行) spark.master yarn spark.eventLog.enabled true spark.eventLog.dir hdfs://hadoop102:8020/spark-history spark.executor.memory 1g spark.driver.memory 1g #在HDFS创建如下路径,用于存储历史日志。 hadoop fs -mkdir /spark-history
(2-5)向HDFS上传Spark纯净版jar包
说明1:由于Spark3.0.0非纯净版默认支持的是hive2.3.7版本,直接使用会和安装的Hive3.1.2出现兼容性问题。所以采用Spark纯净版jar包,不包含hadoop和hive相关依赖,避免冲突。
说明2:Hive任务最终由Spark来执行,Spark任务资源分配由Yarn来调度,该任务有可能被分配到集群的任何一个节点。所以需要将Spark的依赖上传到HDFS集群路径,这样集群中任何一个节点都能获取到。
(2-5-1)
上传并解压spark-3.0.0-bin-without-hadoop.tgz
(2-5-2)上传Spark纯净版jar包到HDFS
(2-6)修改hive-site.xml文件
vim /opt/module/hive/conf/hive-site.xml #添加如下内容 <!--Spark依赖位置(注意:端口号8020必须和namenode的端口号一致)--> <property> <name>spark.yarn.jars</name> <value>hdfs://hadoop102:8020/spark-jars/*</value> </property> <!--Hive执行引擎--> <property> <name>hive.execution.engine</name> <value>spark</value> </property>
3、Hive on Spark测试
(1)启动hive客户端
node1:
bin/hive --service hiveserver2 /export/server/apache-hive-3.1.2-bin/bin/hive
node2:
export/server/apache-hive-3.1.2-bin/bin/beeline 连接访问 beeline> ! connect jdbc:hive2://node1:10000
(2)在Hive所在节点部署Spark纯净版
①Spark官网下载jar包地址:
http://spark.apache.org/downloads.html
②上传并解压解压spark-3.3.1-bin-without-hadoop.tgz
[atguigu@hadoop102 software]$ tar -zxvf spark-3.3.1-bin-without-hadoop.tgz -C /opt/module/
[atguigu@hadoop102 software]$ mv /opt/module/spark-3.3.1-bin-without-hadoop /opt/module/spark
③修改spark-env.sh配置文件
修改文件名。
[atguigu@hadoop102 software]$ mv /opt/module/spark/conf/spark-env.sh.template /opt/module/spark/conf/spark-env.sh
编辑文件
[atguigu@hadoop102 software]$ vim /opt/module/spark/conf/spark-env.sh
增加如下内容。
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
(3)配置SPARK_HOME环境变量
[atguigu@hadoop102 software]$ sudo vim /etc/profile.d/my_env.sh
添加如下内容。
添加如下内容。
# SPARK_HOME
export SPARK_HOME=/opt/module/spark
export PATH=$PATH:$SPARK_HOME/bin
source 使其生效。
[atguigu@hadoop102 software]$ source /etc/profile.d/my_env.sh
(4)在hive中创建spark配置文件
[atguigu@hadoop102 software]$ vim /opt/module/hive/conf/spark-defaults.conf
添加如下内容(在执行任务时,会根据如下参数执行)。
spark.master yarn
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hadoop102:8020/spark-history
spark.executor.memory 1g
spark.driver.memory 1g
在HDFS创建如下路径,用于存储历史日志。
[atguigu@hadoop102 software]$ hadoop fs -mkdir /spark-history
(5)向HDFS上传Spark纯净版jar包
说明1:采用Spark纯净版jar包,不包含hadoop和hive相关依赖,能避免依赖冲突。
说明2:Hive任务最终由Spark来执行,Spark任务资源分配由Yarn来调度,该任务有可能被分配到集群的任何一个节点。所以需要将Spark的依赖上传到HDFS集群路径,这样集群中任何一个节点都能获取到。
[atguigu@hadoop102 software]$ hadoop fs -mkdir /spark-jars
[atguigu@hadoop102 software]$ hadoop fs -put /opt/module/spark/jars/* /spark-jars
(6)修改hive-site.xml文件
[atguigu@hadoop102 ~]$ vim /opt/module/hive/conf/hive-site.xml
添加如下内容。
<!--Spark依赖位置(注意:端口号8020必须和namenode的端口号一致)-->
<property>
<name>spark.yarn.jars</name>
<value>hdfs://hadoop102:8020/spark-jars/*</value>
</property>
<!--Hive执行引擎-->
<property>
<name>hive.execution.engine</name>
<value>spark</value>
</property>
3)Hive on Spark测试
(1)启动hive客户端
[atguigu@hadoop102 hive]$ hive
(2)创建一张测试表
hive (default)> create table student(id int, name string);
(3)通过insert测试效果
hive (default)> insert into table student values(1,'abc');
若结果如下,则说明配置成功。
2.1.2 Yarn环境配置
1、增加ApplicationMaster资源比例
容量调度器对每个资源队列中同时运行的Application Master占用的资源进行了限制,该限制通过yarn.scheduler.capacity.maximum-am-resource-percent参数实现,其默认值是0.1,表示每个资源队列上Application Master最多可使用的资源为该队列总资源的10%,目的是防止大部分资源都被Application Master占用,而导致Map/Reduce Task无法执行。
生产环境该参数可使用默认值。但学习环境,集群资源总数很少,如果只分配10%的资源给Application Master,则可能出现,同一时刻只能运行一个Job的情况,因为一个Application Master使用的资源就可能已经达到10%的上限了。故此处可将该值适当调大。
(1)在hadoop102的/opt/module/hadoop-3.1.3/etc/hadoop/capacity-scheduler.xml文件中修改如下参数值
vim capacity-scheduler.xml #修改 <property> <name>yarn.scheduler.capacity.maximum-am-resource-percent</name> <value>0.8</value> </property
2)分发capacity-scheduler.xml配置文件
xsync capacity-scheduler.xml
(3)关闭正在运行的任务,重新启动yarn集群
sbin/stop-yarn.sh sbin/start-yarn.sh
2.2 数据仓库开发环境
数仓开发工具可选用DBeaver或者DataGrip。两者都需要用到JDBC协议连接到Hive,故需要启动HiveServer2。
1、启动HiveServer2
2.3模拟数据准备
通常企业在开始搭建数仓时,业务系统中会存在历史数据,一般是业务数据库存在历史数据,而用户行为日志无历史数据。假定数仓上线的日期为2022-06-08,为模拟真实场景,需准备以下数据。
注:在执行以下操作之前,先将HDFS上/origin_data路径下之前的数据删除。
1)启动采集通道
上课老师用的是:xmock start loginc
启动数据生成:xmock start data
命令如下。
[atguigu@hadoop102 ~]$ cluster.sh start
停止Maxwell。
[atguigu@hadoop102 bin]$ mxw.sh stop
停止Maxwell
2)数据准备
(1)生成模拟数据
① 修改hadoop102节点的/opt/module/applog/application.yml文件,将mock.date,mock.clear,mock.clear.user,mock.new.user,mock.log.db.enable五个参数调整为如下的值。
#业务日期
mock.date: "2022-06-04"
#是否重置业务数据
mock.clear.busi: 1
#是否重置用户数据
mock.clear.user: 1
# 批量生成新用户数量
mock.new.user: 100
# 日志是否写入数据库一份 写入z_log表中
mock.log.db.enable: 0
② 执行数据生成脚本,生成第一天2022-06-04的历史数据。
[atguigu@hadoop102 applog]$ lg.sh
③ 修改/opt/module/applog/application.properties文件,将mock.date、mock.clear,mock.clear.user,mock.new.user四个参数调整为如图所示的值。
#业务日期
mock.date: "2022-06-05"
#是否重置业务数据
mock.clear.busi: 0
#是否重置用户数据
mock.clear.user: 0
# 批量生成新用户
mock.new.user: 0
④ 执行数据生成脚本,生成第二天2022-06-05的历史数据。
[atguigu@hadoop102 applog]$ lg.sh
⑤ 之后只修改/opt/module/applog/application.properties文件中的mock.date参数,依次改为2022-06-06,2022-06-07,并分别生成对应日期的数据。
⑥ 删除/origin_data/gmall/log目录,将⑤中提到的参数修改为2022-06-08,并生成当日模拟数据。
(2)全量表同步
① 执行全量表同步脚本
[atguigu@hadoop102 bin]$ mysql_to_hdfs_full.sh all 2022-06-08
② 观察HDFS上是否出现全量表数据
(3)增量表首日全量同步
① 清除Maxwell断点记录
由于Maxwell支持断点续传,而上述重新生成业务数据的过程,会产生大量的binlog操作日志,这些日志我们并不需要。故此处需清除Maxwell的断点记录,令其从binlog最新的位置开始采集。
清空Maxwell数据库,相当于初始化Maxwell。
mysql>
drop table maxwell.bootstrap;
drop table maxwell.columns;
drop table maxwell.databases;
drop table maxwell.heartbeats;
drop table maxwell.positions;
drop table maxwell.schemas;
drop table maxwell.tables;
② 修改Maxwell配置文件中的mock_date参数
[atguigu@hadoop102 maxwell]$ vim /opt/module/maxwell/config.properties
mock_date=2022-06-08
③ 启动Maxwell
④ 执行增量表首日全量同步脚本
[atguigu@hadoop102 bin]$ mysql_to_kafka_inc_init.sh all
⑤ 观察HDFS上是否出现增量表数据
(1-2)执行模拟生成业务数据的命令,生成第一天2020-06-4的历史数据。
java -jar gmall2020-mock-db-2021-01-22.jar
(1-4)执行模拟生成业务数据的命令,生成第二天2020-06-11的历史数据。
java -jar gmall2020-mock-db-2021-10-10.jar
(1-5)之后只修改/opt/module/db_log/application.properties文件中的mock.date参数,依次改为2020-06-12,2020-06-13,2020-06-14,并分别生成对应日期的数据。
(2)全量表同步
(2-1)执行全量表同步脚本
mysql_to_hdfs_full.sh all 2020-06-14
(2-1)观察HDFS上是否出现全量表数据
(3)增量表首日全量同步
(3-1)清除Maxwell断点记录
由于Maxwell支持断点续传,而上述重新生成业务数据的过程,会产生大量的binlog操作日志,这些日志我们并不需要。故此处需清除Maxwell的断点记录,另其从binlog最新的位置开始采集。
关闭Maxwell。
mxw.sh stop
清空Maxwell数据库,相当于初始化Maxwell。
mysql> drop table maxwell.bootstrap; drop table maxwell.columns; drop table maxwell.databases; drop table maxwell.heartbeats; drop table maxwell.positions; drop table maxwell.schemas; drop table maxwell.tables;
(3-2)修改Maxwell配置文件中的mock_date参数
vim /opt/module/maxwell/config.properties #修改如下 mock_date=2020-06-14
(3-3)启动增量表数据通道,包括Maxwell、Kafka、Flume
(3-4)执行增量表首日全量同步脚本
mysql_to_kafka_inc_init.sh all
(3-5)观察HDFS上是否出现全量表数据
恭喜大家看完了小编的博客,希望你能够有所收获,我一直相信躬身自问和沉思默想会充实我们的头脑,希望大家看完之后可以多想想喽,编辑不易,求关注、点赞、收藏(Thanks♪(・ω・)ノ)