【hive和spark】hive on spark和spark读取hive metastore配置

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的安装包 apachehive ,官网中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.jarparquet-hadoop-bundle-1.8.0.jarparquet-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

相关推荐
武子康6 小时前
大数据-257 离线数仓 - 数据质量监控 监控方法 Griffin架构
java·大数据·数据仓库·hive·hadoop·后端
NiNg_1_2346 小时前
Spark常用的转化操作和动作操作详解
大数据·ajax·spark
莹雨潇潇6 小时前
Hadoop完全分布式环境部署
大数据·hadoop·分布式
岑梓铭11 小时前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
学计算机的睿智大学生12 小时前
Hadoop集群搭建
大数据·hadoop·分布式
Data跳动1 天前
Spark内存都消耗在哪里了?
大数据·分布式·spark
lucky_syq1 天前
流式处理,为什么Flink比Spark Streaming好?
大数据·flink·spark
清平乐的技术专栏1 天前
Hive SQL 查询所有函数
hive·hadoop·sql