vlambda博客
学习文章列表

0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

Fayson的github:

https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢


1

文档编写目的


Fayson在前面的文章中介绍过什么是Spark Thrift,Spark Thrift的缺陷,以及Spark Thrift在CDH5中的使用情况,参考《》。


在CDH5中通过自己单独安装的方式运行Thrift服务现在已经调通并在使用的是如下版本组合:

1.在CDH5中安装Spark1.6的Thrift服务,参考《》

2.在CDH5中安装Spark2.1的Thrift服务,参考《》



从Spark2.2开始到最新的Spark2.4,因为变化较大,不能够采用上述两种办法直接替换jar包的方式实现,更多的依赖问题导致需要重新编译或者修改更多的东西才能在CDH5中使用最新的Spark2.4的Thrift。在CDH5基于网易开源的工具Kyuubi实现的Spark2.4 Thrift功能,参考《》。本文主要描述在CDH6.2基于的Spark2.4安装Thrift服务的所有尝试。


  • 测试环境:

1.Redhat7.4

2.CDH6.2

3.集群未启用Kerberos

4.Spark2.4.0.cloudera2-1


2

在CDH6中使用Spark Thrift

2.1

Spark原生Thrift部署


通过使用Spark官网提供的原生Thrift包在C5和C6环境下进行部署尝试。


http://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.3/spark-2.4.3-bin-hadoop2.7.tgz


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


1.在CDH5.16.1环境下使用原生的spark-hive-thriftserver_2.11-2.4.3.jar包


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


进行部署测试,报如下错误提示找不到方法:


java.lang.NoSuchMethodErrororg.apache.hadoop.hive.ql.session.SessionState.reloadAuxJars()V), serverProtocolVersion:null)


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


2.在CDH6.1.1环境下使用原生的spark-hive-thriftserver_2.11-2.4.3.jar包


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


完成Thrift的部署后,通过日志可以看到已成功连接了Hive2的Metastore,但后续又尝试连接本地的Derby数据库,报如下错误:


 “org.datanucleus.exceptions.ClassNotPersistableException: The class "org.apache.hadoop.hive.metastore.model.MDatabase" is not persistable. This means that it either hasnt been en
hanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data/annotations for the class are not found.”


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了

0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


3.总结

通过使用Spark原生的Thrift包在CDH5.16.1和CDH6.1.1环境下部署均失败了,由于原生Thrift包与C5和C6中hive包的兼容性导致无法部署成功。


2.2

编译Spark官网源码方式


在经过2.1章节使用Spark原生Thrift部署失败后,尝试使用Spark源码的方式编译Thrift。

1.在github上将发布的Spark2.4.2版本的代码下载到本地进行编译


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


2.通过指定Hive和Hadoop版本进行编译


./build/mvn -Pyarn -Phive -Phive-thriftserver -Phadoop-3.0 -Dhadoop.version=3.0.0-cdh6.2.0 -Dhive.version=2.1.1-cdh6.2.0 -Dhive.group=org.apache.hive -DskipTests clean package -e


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


git clone https://github.com/apache/spark.git
git fetch origin v2.4.2:v2.4.2
git checkout v2.4.2


2.3

编译CDH的Spark源码方式


通过编译Spark源码的方式任然没有成功,接下来直接下载CDH Github上的Spark源码进行编译。


1.在命令行执行如下命令将CDH的Spark代码clone到本地


git clone https://github.com/cloudera/spark.git
git fetch origin cdh6.2.0-release:cdh6.2.0-release #获取指定分支代码到本地分支
git checkout cdh6.2.0-release #切换分支
git merge cdh6.2.0-release #将cdh6.2.0-release分支合并至Master


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


2.cdh6.2.0-release代码,默认的已配置为CDH6版本的依赖,所以这里不需要执行Hadoop和Hive的版本,执行如下命令进行编译


./build/mvn -Pyarn -Phive -Phive-thriftserver -DskipTests clean package -e


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


3.最终在编译到Hive Thrift Server模块时报错,提示如下异常


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


在命令行指定-Phive-thriftserver参数后会编译失败,在CDH的Spark版本默认是不编译Thrift模块的,所以在命令行无法正常编译。


2.4

Intellij编译CDH的Spark源码


在本地将CDH的Github的代码下载至本地切换至Spark2.4.2版本,将Hive的依赖包修改为Hive2的依赖包。


1.Spark Thrift模块的Hive代码修改为Hive2的代码


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


2.通过修改代码中Hive2 API接口调用的差异,最终完成编译


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


3.将编译好的spark-hive-thriftserver_2.11-2.4.0-cdh6.1.1.jar进行部署测试


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


通过部署测试发现, 可以通过beeline访问Thrift Server服务,在执行SQL命令时无法正常读取Hive上的库和表。通过后台也会报错


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


2.5

Intellij编译CDH的Spark源码(依赖Hive1)


下载CDH的Spark源码在Intellij中将源码中依赖的Hive包替换为Hive1后,能够成功的编译Spark2 Thrift包。


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


下载CDH的Spark源码在Intellij中将源码中依赖的Hive包替换为Hive1后,能够成功的编译Spark2 Thrift包。


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


将编译成功的spark-hive-thriftserver_2.11-2.4.0.cloudera2.jar包部署至CDH5和CDH6集群中均包如下错误:


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


总结:由于CDH5和CDH6和编译时Spark Thrift依赖的Hive版本有差异导致无法Thrift服务无法正常运行。


2.6

Gateway上使用hive1的依赖包方式


通过在C6上使用C5的依赖包的方式部署Kyuubi测试是否能够正常部署使用Thrift Server.

1.将C5的/opt/cloudera/parcels拷贝至Gateway节点


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


2.配置环境变量使Gateway节点能够正常执行hadoop命令


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


3.将CDH6环境下的/etc/hadoop 、hive、Spark配置目录拷贝至该Gateway节点


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


需要将spark目录修改为spark2,因为CDH5的Spark版本为Spark2方式命名。


4.将CDH6的/opt/cloudera/parcels/CDH/lib/spark/jars目录下的jar包上传至hdfs的/tmp/spark2jars目录下


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


5.启动服务通过beeline访问


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


可以正常的查看到所有的库和表,但是执行count等操作时报错


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


总结:由于Spark的版本与CDH5中Spark2版本的包冲突问题导致,进行count或查询有数据的表是异常。


3

总结


本次Fayson在CDH6中进行Spark2.4 Thrift服务安装,尝试了很多种方法,具体参考本文第二章,包括但不限于:


1.直接使用公网的mvn仓库下载Spark2.4.3的thrift jar包并且包含相应的hive依赖放到CDH,启动失败。

2.使用Spark官网的方式选择hadoop版本,hive版本,使用mvn编译,编译失败。

3.使用cdh的Spark2.4的pom文件引入thrift依赖,使用mvn编译,失败。

4.使用IntelliJ IDEA,下载thrift包源码,修改Hive相关依赖为CDH的hive,编译通过,但是测试Spark任务有问题。

5.搭建独立于集群外的Gateway,将thrift服务以及相应的Hive依赖都独立出去,服务可以启动,提交任务失败。

6.使用网易开源的Kyuubi,也失败,主要是因为Kyuubi还没支持Hadoop3+Hive2。


失败的原因主要是因为Apache Spark社区对于Spark2.4还没有支持Hadoop3+Hive2:


0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了


参考:

https://issues.apache.org/jira/browse/SPARK-23534


而Spark2.4对于Hadoop3的支持是不包含Thrift模块的,参考:


参考:

https://issues.apache.org/jira/browse/SPARK-27402

Spark社区有个PR正在跟进这个事,进行中:

https://github.com/apache/spark/pull/24628


提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。


推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。