HiveOnSpark保姆级教程
声明:
此博客参考了官⽹的配置⽅式,并结合笔者在实践⽹上部分帖⼦时的踩坑经历整理⽽成
这⾥贴上官⽅配置说明:
[官⽅]:
⼤前提:
从Hive1.1开始⽀持使⽤Spark作为执⾏引擎,我们配置使⽤Spark On Yarn时,⼀定要注意
Hive版本与Spark版本的适配,不适配的需要⾃⼰重新编译使其适配
这⾥贴上官⽅推荐的对应版本
Hive Version Spark Version
master  2.3.0
3.0.x  2.3.0
2.3.x  2.0.0
2.2.x  1.6.0
mysql的jar包下载
2.1.x  1.6.0
2.0.x  1.5.0
1.2.x  1.3.1
1.1.x  1.
2.0
笔者这⾥使⽤的是hive-3.1.2,按理说应该使⽤spark-2.3.0作为对应,但出于业务要求需使⽤spark-3.1.2,故重新编译hive-3.1.2源码使其适配spark-3.1.2
Spark使⽤的jar包必须是没有集成Hive的
因spark包⾃带hive,其⽀持的版本与我们使⽤的版本冲突(如spark-3.1.2默认⽀持的hive版本为2.3.7),故我们只需spark⾃⾝即可,不需其⾃带的hive模块
两种⽅式去获得去hive的jar包
从官⽹下载完整版的jar包,解压后将其jars⽬录下的hive相关jar包全部删掉(本⽂即使⽤此种⽅法)
重新编译spark,但不指定-Phive
注:⽹上部分帖⼦中所说使⽤“纯净版”,其实指的就是去hive版,⽽不是官⽅提供的without-hadoop版
下⾯进⼊正题
部署环境:CentOS 7.4 x86_64
Hive版本:3.1.2(重新编译过,修改了Spark版本和Scala版本,替换修改了部分源码,如有需要后续会出编译指导)
Spark版本:3.1.2(spark-3.1.,官⽹直接下载)
Hadoop版本:3.1.3(与Spark3.1.2⾃带hadoop版本3.2只差⼀个⼩版本,可直接使⽤,不⽤重新编译)
JDK版本:1.8.0_172
myql版本:5.7.32
步骤:
1. 在机器上部署spark
解压
tar -zxvf spark-3.1.
设置环境变量
echo '#SPARK_HOME' >> /etc/profile
echo 'export SPARK_HOME=/data/apps/spark-3.1.2-bin-hadoop3.2' >> /etc/profile
echo 'export PATH=$PATH:$SPARK_HOME/bin' >> /etc/profile
source /etc/profile
准备去hive版本的spark-jars(!!!除了hive-storage-api-2.7.2.jar这个包!!!,如果⽤的spark是重新编译的且没有指定-Phive,这步可以省略)
cd $SPARK_HOME                        //进⽬录
mv jars/hive-storage-api-2.7.2.jar .  //把这包先移出去
rm -rf jars/*hive*                    //删
mv hive-storage-api-2.7.2.jar jars/    //再移回去
将刚做好的spark-jars上传到hdfs
hdfs dfs -mkdir -p /spark-jars
hdfs dfs -put jars/* /spark-jars/
hdfs上创建spark-history存⽇志
hdfs dfs -mkdir -p /spark-history
2. 在机器上部署hive
解压
tar -zxvf apache-hive-3.1.
注:解压后的hive还需要⼀些额外的包放在lib下,⽐如因元数据库换为mysql需要⼀个mysql-connector-java-5.1.48.jar,⽐如为了处理hive-3.1.2和hadoop-3.1.3中guava包版本冲突的问题需要把原lib下的guava19删了放⼀个guava27,再⽐如为了处理slf4j包冲突问题将lib下⾯log4j-slf4j-impl-2.10.0.jar删喽,这⾥都不做详细说明(已经够详细了吧/doge);且这些问题都可以通过重新编译hive解决,不过要费⼀番功夫
改名(⾮必要)
mv apache-hive-3.1.2-bin hive-3.1.2
设置环境变量
echo '#HIVE_HOME' >> /etc/profile
echo 'export HIVE_HOME=/data/apps/hive-3.1.2' >> /etc/profile
echo 'export PATH=$PATH:$HIVE_HOME/bin' >> /etc/profile
source /etc/profile
修改配置⽂件
注:该⽂件⾸先需要从plate复制⼀份出来,⾥⾯参数根据⾃⼰需要调整,这⾥只讲hive-on-spark需要修改或新增的参数  <!--Spark依赖位置,上⾯上传jar包的hdfs路径-->
<property>
<name>spark.yarn.jars</name>
<value>hdfs://bdp3install:8020/spark-jars/*</value>
</property>
<!--Hive执⾏引擎,使⽤spark-->
<property>
<name&ine</name>
<value>spark</value>
</property>
<!--Hive连接spark-client超时时间-->
<property>
<name>hive.t.timeout</name>
<value>30000ms</value>
</property>
hive-env.sh
注:该⽂件⾸先需要从plate复制⼀份出来,⾥⾯参数根据⾃⼰需要调整,这⾥只讲hive-on-spark需要修改或新增的参数
# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=${HADOOP_HOME:-/data/apps/hadoop-3.1.3}
export HIVE_HOME=${HIVE_HOME:-/data/apps/hive-3.1.2}
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=${HIVE_CONF_DIR:-/data/apps/hive-3.1.2/conf}
export METASTORE_PORT=9083
export HIVESERVER2_PORT=10000
注:直接vim⽣成吧,不⽤从spark⽬录再拷过来,更多的参数可以参考最上⾯的官⽅地址
spark.master            yarn
abled  true
spark.eventLog.dir      hdfs://bdp3install:8020/spark-history
<    4g
      4g
spark.serializer        org.apache.spark.serializer.KryoSerializer
spark.Overhead    400m
3. 启动hive
cd $HIVE_HOME
nohup bin/hive --service metastore &
等metastore启完(9083端⼝被监听了)
nohup bin/hive --service hiveserver2 &
等hiveserver2启完(10000端⼝被监听了)
4. 客户端连接测试
beeline
!connect jdbc:hive2://localhost:10000 hive ""
执⾏⼀些insert,同时观察下yarn,如果任务成功了,yarn上也有相应的application成功了,那就妥了
注:hive on spark任务是以每个spark session为单位提交到yarn的,每个yarn任务都有⼀次从hdfs加载spark-jars到容器中的过程,所以每次通过客户端执⾏命令时,第⼀次执⾏的速度会⽐较慢(因为加
载jars,⼤约有200M),后续就很快了。
常见问题:
1. java.lang.NoClassDefFoundError: org/apache/hadoop/hive/ql/exec/vector/ColumnVector
原因:spark-jars⾥少hive-storage-api-2.7.2.jar这个包
2. Could not load YARN classes. This copy of Spark may not have been compiled with YARN support.
原因:hiveserver2所在机器没有部署spark或spark⾮完整版,或spark版本与hive版本不对应
3. 各种各样的ClassNotFound,NoClassDefFoundError
原因:spark-jars不完整,⼀定要是去hive的完整版jar包(⼀般都是少hadoop的包)
此⽂章⾸发于博客园,作者榆天紫夏,希望能对⼤家有所帮助,如有遗漏或问题欢迎补充指正。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。