【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

相关推荐
Gent_倪6 小时前
Hadoop生态组件介绍
大数据·hadoop
DolphinScheduler社区6 小时前
DolphinScheduler 3.3.2 如何调用 DataX 3.0 + SeaTunnel 2.3.12?附 Demo演示!
java·spark·apache·海豚调度·大数据工作流调度
YaBingSec9 小时前
玄机网络安全靶场:Hadoop YARN ResourceManager 未授权 RCE WP
大数据·数据库·hadoop·redis·笔记·分布式·web安全
Leo.yuan9 小时前
数据仓库是什么?数据仓库和大数据平台、数据湖、数据中台、湖仓一体有什么区别?
大数据·数据仓库·spark
heiqizero9 小时前
Spark RDD动作算子
spark
heiqizero11 小时前
Spark RDD转换算子02
spark
heiqizero1 天前
Spark RDD转换算子01
spark
曹牧1 天前
Java Web 开发:servlet-mapping‌
java·数据仓库·hive·hadoop
菜鸟小码2 天前
HDFS 数据块(Block)机制深度解析:从原理到实战
大数据·hadoop·hdfs
早睡早起早日毕业2 天前
大数据管理与应用系列丛书《大数据平台架构》之第4章 Hadoop 分布式文件系统 (HDFS)
大数据·hadoop·架构