在线教育之离线数仓 day03

在线教育之离线数仓 day03
第6章 数据仓库环境准备6.1数据仓库运行环境6.1.1Hive环境搭建1Hive引擎简介Hive引擎包括默认MR、tez、sparkHive on SparkHive既作为存储元数据又负责SQL的解析优化语法是HQL语法执行引擎变成了SparkSpark负责采用RDD执行。Spark on Hive : Hive只作为存储元数据Spark负责SQL解析优化语法是SparkSQL语法Spark负责采用RDD执行。2HiveonSpark配置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如果之前已经部署了Spark则该步骤可以跳过1Spark官网下载jar包地址Downloads | Apache Spark2上传并解压解压spark-3.0.0-bin-hadoop3.2.tgz[atguiguhadoop102 software]$ tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /opt/module/ [atguiguhadoop102 software]$ mv /opt/module/spark-3.0.0-bin-hadoop3.2 /opt/module/spark3配置SPARK_HOME环境变量[atguiguhadoop102 software]$ sudo vim /etc/profile.d/my_env.sh添加如下内容# SPARK_HOME export SPARK_HOME/opt/module/spark export PATH$PATH:$SPARK_HOME/binsource 使其生效[atguiguhadoop102 software]$ source /etc/profile.d/my_env.sh4在hive中创建spark配置文件[atguiguhadoop102 software]$ vim /opt/module/hive/conf/spark-defaults.conf添加如下内容在执行任务时会根据如下参数执行spark.master yarnspark.eventLog.enabled truespark.eventLog.dir hdfs://hadoop101:8020/spark-historyspark.executor.memory 1gspark.driver.memory 1g在HDFS创建如下路径用于存储历史日志[atguiguhadoop102 software]$ hadoop fs -mkdir /spark-history5向HDFS上传Spark纯净版jar包说明1由于Spark3.0.0非纯净版默认支持的是hive2.3.7版本直接使用会和安装的Hive3.1.2出现兼容性问题。所以采用Spark纯净版jar包不包含hadoop和hive相关依赖避免冲突。说明2Hive任务最终由Spark来执行Spark任务资源分配由Yarn来调度该任务有可能被分配到集群的任何一个节点。所以需要将Spark的依赖上传到HDFS集群路径这样集群中任何一个节点都能获取到。1上传并解压spark-3.0.0-bin-without-hadoop.tgz[atguiguhadoop102 software]$ tar -zxvf /opt/software/spark-3.0.0-bin-without-hadoop.tgz2上传Spark纯净版jar包到HDFS[atguiguhadoop102 software]$ hadoop fs -mkdir /spark-jars [atguiguhadoop102 software]$ hadoop fs -put spark-3.0.0-bin-without-hadoop/jars/* /spark-jars6修改hive-site.xml文件[atguiguhadoop102 ~]$ vim /opt/module/hive/conf/hive-site.xml添加如下内容!--Spark依赖位置注意端口号8020必须和namenode的端口号一致-- property namespark.yarn.jars/name valuehdfs://hadoop101:8020/spark-jars/*/value /property !--Hive执行引擎-- property namehive.execution.engine/name valuespark/value /property3Hive on Spark测试1启动hive客户端[atguiguhadoop102 hive]$ hive2创建一张测试表hive (default) create table student(id int, name string);3通过insert测试效果hive (default) insert into table student values(1,abc);若结果如下则说明配置成功6.1.2Yarn环境配置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文件中修改如下参数值[atguiguhadoop102 hadoop]$ vim capacity-scheduler.xmlproperty nameyarn.scheduler.capacity.maximum-am-resource-percent/name value0.8/value /property2分发capacity-scheduler.xml配置文件[atguiguhadoop102 hadoop]$ xsync capacity-scheduler.xml3关闭正在运行的任务重新启动yarn集群[atguiguhadoop103 hadoop-3.1.3]$ stop-yarn.sh [atguiguhadoop103 hadoop-3.1.3]$ start-yarn.sh Application Master同时运行6.2数据仓库开发环境数仓开发工具可选用DBeaver或者DataGrip。两者都需要用到JDBC协议连接到Hive故需要启动HiveServer2。1启动HiveServer2[atguiguhadoop102 hive]$ hiveserver2启动脚本如下详细解释请看 Metastore HiveServer2 启停脚本#!/bin/bash HIVE_HOME/opt/module/hive-3.1.2 case $1 in start){ echo Starting Hive MetaStore... nohup hive --service metastore ${HIVE_HOME}/metastore.log 21 echo Starting HiveServer2... nohup hive --service hiveserver2 ${HIVE_HOME}/hiveserver2.log 21 };; stop){ SIGNAL${SIGNAL:-TERM} PIDS$(ps -ef | grep [h]ive.*metastore | awk {print $2}) if [ -z $PIDS ]; then echo No HiveMetaStore server to stop else echo Stopping HiveMetaStore (PID: $PIDS) kill -s $SIGNAL $PIDS fi PIDS$(ps -ef | grep [h]iveserver2 | awk {print $2}) if [ -z $PIDS ]; then echo No HiveServer2 server to stop else echo Stopping HiveServer2 (PID: $PIDS) kill -s $SIGNAL $PIDS fi };; esac2配置DataGrip连接1创建连接2配置连接属性所有属性配置和Hive的beeline客户端配置一致即可。初次使用配置过程会提示缺少JDBC驱动按照提示下载即可。3测试使用创建数据库edu2077并观察是否创建成功。1创建数据库2查看数据库3修改连接指明连接数据库4选择当前数据库为edu20776.3模拟数据准备通常企业在开始搭建数仓时业务系统中会存在历史数据一般是业务数据库存在历史数据而用户行为日志无历史数据。假定数仓上线的日期为2022-02-21为模拟真实场景需准备以下数据。注在执行以下操作之前先将HDFS上/origin_data路径下之前的数据删除。1用户行为日志用户行为日志一般是没有历史数据的故日志只需要准备2022-02-21一天的数据。2业务数据业务数据一般存在历史数据此处需准备2022-02-16至2022-02-21的数据。可以通过数据生成脚本一键完成历史数据初始化操作如下[atguiguhadoop102 bin]$ mock.sh init 2022-02-212全量表同步1执行全量表同步脚本[atguiguhadoop102 bin]$ mysql_to_hdfs_full.sh all 2022-02-21 hadoop fs -text /origin_data/edu/db/base_category_info_full/2022-02-21/*2观察HDFS上是否出现全量表数据3增量表首日全量同步1清除Maxwell断点记录由于Maxwell支持断点续传而上述重新生成业务数据的过程会产生大量的binlog操作日志这些日志我们并不需要。故此处需清除Maxwell的断点记录另其从binlog最新的位置开始采集。关闭Maxwell[atguiguhadoop102 bin]$ 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;2修改Maxwell配置文件中的mock_date参数[atguiguhadoop102 maxwell]$ vim /opt/module/maxwell/config.propertiesmock_date2022-02-213启动增量表数据通道包括Maxwell、Kafka、Flume4执行增量表首日全量同步脚本[atguiguhadoop102 bin]$ mysql_to_kafka_inc_init.sh all5观察HDFS上是否出现全量表数据方法二直接在navicat删除Maxwell数据库中所有表即可6.4Hive常见问题及解决方式1DataGrip中注释乱码问题注释属于元数据的一部分同样存储在mysql的metastore库中如果metastore库的字符集不支持中文就会导致中文显示乱码。不建议修改Hive元数据库的编码此处我们在metastore中找存储注释的表找到表中存储注释的字段只改对应表对应字段的编码。如下两步修改缺一不可1修改mysql元数据库我们用到的注释有两种字段注释和整张表的注释。COLUMNS_V2 表中的 COMMENT 字段存储了 Hive 表所有字段的注释TABLE_PARAMS 表中的 PARAM_VALUE 字段存储了所有表的注释。我们可以通过命令修改字段编码也可以用 DataGrip 或 Navicat 等工具修改此处仅对 Navicat 进行展示。i命令修改alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8; alter table TABLE_PARAMS modify column PARAM_VALUE mediumtext character set utf8;ii使用工具以 COLUMNS_V2 表中COMMENT 字段的修改为例a右键点击表名选择设计表b在右侧页面中选中表的字段c在页面下方下拉列表中将字符集改为 utf8修改字符集之后已存在的中文注释能否正确显示不能。为何数据库中的字符都是通过编码存储的写入时编码读取时解码。修改字段编码并不会改变此前数据的编码方式依然为默认的 latin1此时读取之前的中文注释会用 utf8 解码编解码方式不一致依然乱码。2修改url连接修改 hive-site.xml 在末尾添加amp;useUnicodetrueamp;characterEncodingUTF-8xml 文件中 符是有特殊含义的我们必须使用转义的方式 对 进行替换修改结果如下xml 文件中 符是有特殊含义的我们必须使用转义的方式 对 进行替换修改结果如下property namejavax.jdo.option.ConnectionURL/name valuejdbc:mysql://hadoop102:3306/metastore?useSSLfalseamp;useUnicodetrueamp;characterEncodingUTF-8 /value /property只要修改了 hive-site.xml就必须重启 hiveserver2。2DataGrip刷新连接时 hiveserver2后台报错1报错信息如下FAILED: ParseException line 1:5 cannot recognize input near show indexes on in ddl statement原因我们使用的是 Hive-3.1.2早期版本的 Hive 有索引功能当前版本已移除 DataGrip 刷新连接时会扫描索引而 Hive 没有就会报错。3OOM报错Hive 默认堆内存只有 256M如果 hiveserver2 后台频繁出现 OutOfMemoryError可以调大堆内存。在 Hive 家目录的 conf 目录下复制一份模板文件 hive-env.sh.template[atguiguhadoop102 conf]$ cd $HIVE_HOME/conf [atguiguhadoop102 conf]$ cp hive-env.sh.template hive-env.sh修改 hive-env.sh将 Hive 堆内存改为 1024M如下export HADOOP_HEAPSIZE1024可根据实际使用情况适当调整堆内存。4DataGripODS层部分表字段显示异常建表字段中有如下语句的表字段无法显示ROW FORMAT SERDE org.apache.hadoop.hive.serde2.JsonSerDe上述语句指定了 Hive 表的序列化器和反序列化器 SERDEserialization 和 deserialization 的合并缩写用于解析 JSON 格式的文件。上述 SERDE 是由第三方提供的在 hive-site.xml 中添加如下配置即可解决property namemetastore.storage.schema.reader.impl/name valueorg.apache.hadoop.hive.metastore.SerDeStorageSchemaReader/value /property