HIVE ON SPARK 和 SPARK READ HIVE METASTORE
具体hadoop 和 hive单机版本安装请参考单节点搭建hadoop和hive
此文是基与这篇基础上升级而来。
零、版本说明:
本例使用的版本,hive和spark版本对标Cloudera 公司的 cdh6.2.0 版本,hdfs图省事就没对标cdh的3.0.0版本:
hadoop: 2.10.2
hive: 2.1.1
spark: 2.4.0
从官网下载bin的安装包 apache 和 hive ,官网中spark的源码和安装包的版本比较全
hive的版本只有大版本最新的,需要其他版本的要去github上apache/hive仓库找需要版本对应的tag标签找是否有源码包或安装包下载。
官网中:
有bin
的就是编译完整的安装文件,linux环境直接解压tar -xvf *.tar.gz
即可。
spark-2.4.0-bin-without-hadoop.tgz
(一般使用without-hadoop版本) apache-hive-3.1.3-bin.tar.gz
有src
的就是源码了。
修改 hive-site.xml
:
xml
<!--Spark依赖位置(注意:端口号9000/8020必须和namenode的端口号一致)for hive on spark -->
<property>
<name>spark.yarn.jars</name>
<value>hdfs://hdp:9000/spark-jars/*</value>
</property>
<!--Hive执行引擎 for hive on spark -->
<property>
<name>hive.execution.engine</name>
<value>spark</value>
</property>
<!-- 元数据存储授权 for spark read hive metastore -->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
修改spark-env.sh
,添加:
使spark可以使用hadoop
shell
export SPARK_DIST_CLASSPATH=$(/opt/hadoop-2.10.2/bin/hadoop classpath)
修改 spark-defaults.conf
,添加:
conf
spark.sql.hive.metastore.version 2.1.1
spark.sql.hive.metastore.jars /opt/hive-2.1.1/lib/*
配置linux环境变量:
bash
export HADOOP_HOME=...
export HADOOP_CONF_DIR=...
export HIVE_HOME=...
export HIVE_CONF_DIR=...
export SPARK_HOME=...
export PATH=HADOOP_HOME/bin:HIVE_HOME/bin:SPARK_HOME/bin
# 如果服务器之前配置过其他版本hadoop,请使用linux env命令检查是否有残余环境变量如下几个:
# 如果有残余 ,请使用unset命令,如 "unset HADOOP_COMMON_HOME",清除干扰的环境变量。
HADOOP_COMMON_HOME
HADOOP_HDFS_HOME
HADOOP_MAPRED_HOME
HADOOP_YARN_HOME
一、hive 和 spark 版本兼容方案(不编译源码),失败率低
spark使用的hive版本较复杂可以逐个查询官网,或者github查询源码。
spark文档
主要内容是检查jar包是否全面,是否有冲突。
查看HIVE_HOME/lib for hive on spark
将spark的jar包复制到 HIVE_HOME/lib 下:
bash
# spark-client-2.1.1.jar 注:此包是hive的
spark-core_2.11-2.4.0.jar
spark-kvstore_2.11-2.4.0.jar
spark-launcher_2.11-2.4.0.jar
spark-network-common_2.11-2.4.0.jar
spark-network-shuffle_2.11-2.4.0.jar
spark-tags_2.11-2.4.0.jar
spark-unsafe_2.11-2.4.0.jar
将 HIVE_HOME/lib 包复制至 SPARK_HOME/jars 下
bash
hive-beeline-2.1.1.jar
hive-cli-2.1.1.jar
hive-common-2.1.1.jar
hive-exec-2.1.1.jar
hive-jdbc-2.1.1.jar
hive-llap-client-2.1.1.jar
hive-llap-common-2.1.1.jar
hive-llap-tez-2.1.1.jar
hive-metastore-2.1.1.jar
hive-orc-2.1.1.jar
hive-serde-2.1.1.jar
hive-service-rpc-2.1.1.jar
hive-storage-api-2.1.1.jar
jline-2.14.6.jar # 不加会报错。
如果测试中出现类找不到,不兼容等错误就需要自己编译源码了,别无他法。
二、hive 和 spark 版本不兼容方案(需编译源码),编译失败率高
过程可能很痛苦,几个小时不一定就能搞定。
编译步骤:
- 1、 分别下载 spark 和 hive 源码
- 2、 清除本地maven仓库关于spark和hive的jar目录
- 3、 修改 spark 和 hive 相互依赖的版本号,同时将parquet和orc的版本号也修改成一致的。
- 4、 编译:
注意:必须mvn install
也就是必须将编译的包安装到本地maven仓库。
spark和hive是相互依赖的,切记
,可以参考如下顺序:hive install -> spark install -> hive install -> spark install
。反正多交叉install就对了。
idea 编译bug多多,中间有编译错误但idea不显示错误,可清理idea缓存文件: idea 里file 下的invalidate cacheches
。
每次编译install前可将本地maven仓库中的hive/spark目录直接删掉再编译hive/spark,保证mvn install成功。
此编译后spark和hive相互依赖的jar包都会包含在各自的lib/jars目录下。就不用手动复制了。
parquet-hadoop-bundle-版本.jar
包中也含有parquet包,一定要注意版本
和想要的版本一致。比如编译spark时候由于idea内存依旧加载的hive所依赖的parquet老版本信息,会出现parquet-hadoop-bundle-1.6.0.jar
和parquet-hadoop-bundle-1.8.0.jar
和parquet-hadoop-bundle-1.10.0.jar
同时在SPARK_HOME/jars目录下的情况。
具体hive install:
hive可能支持win环境安装,即win下就能生成linux的bin目录结构
bash
mvn package "-Dmaven.test.skip=true" "-Pdist"
具体spark install:
spark可能不支持win环境编译出完整bin目录结构
通过-P
指定profile,具体profile可在pom.xml <profile><id> profile的id </id></profile>
查看。
bash
# win下编译:
# 在mvnrepository.com下载到同版本的spark-core-*.jar在此文件的根目录找到spark-version-info.properties。
# 添加spark-version-info.properties文件至:core/resources目录
mvn package "-Dmaven.test.skip=true" "-Phadoop-2.10" "-Pscala-2.11" "-Phive" "-Pyarn" "-Phive-thriftserver"
# linux下编译:
./dev/make-distribution.sh --name spark-2.4.0 --tgz -Pscala-2.11 -Pyarn -Phadoop-2.10 -Phive -Phive-thriftserver
其中spark-version-info.properties
文件linux编译由shell自动生成的,win下需要自己创建。
properties
version=2.4.0
user=
revision=
branch=
date=2018-10-29T07:31:41Z
url=
注意:
spark 在 win 编译由于不会生成相应的目录结构,需要官网找到对应版本的安装包,解压到linux后,再将自己编译jar包 (在assembly模块下assembly/target/scala-2.11/jars
)都复制过去。
spark 每次覆盖linux的jars,记得将spark.yarn.jars
hdfs 目录所有文件都刷新下,最好hdfs rm -r -f 目录
。
hive 也需要这注意linux下HIVE_HOME/hcatalog和jdbc也需要将jar覆盖下。
三、测试
3.1 先测试spark读取hive metastore
spark-sql:(1)创建表 (2)insert into 数据 (3)select key,count(1) from 表 group key;
此三项目基本可以确认是否ok。
3.2 再测试 hive on spark(报错可能性高)
beeline连接hive server2 后实际会启动一个任务运行在yarn上的。所以日志也都在yarn上。缺少类信息会在类中展示。
hive执行和spark相同的测试即可。
(1)Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/JavaSparkListener
如下报错,是因为hive 2.1.1使用spark 1.*编译的。即编译hive时候要确认spark 版本选择正确。
(2)出现spark RDD类如:JavaRDDLike
incompatible 不兼容类问题
是hive编译使用的spark版本和实际放到 HIVE_HOME/lib 版本或者和spark.yarn.jars
hdfs 目录jar包版本不一致造成的。hive编译import spark类的包都在spark-client-*.jar
中。
四、参考文章
Hive on spark 已测,完美搭建
寻找hadoop、hive、spark对应版本
Neither spark.yarn.jars nor spark.yarn.archive is set