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

2019-06-04 11:26:15 浏览数 (1)

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

Fayson的github: https://github.com/fayson/cdhproject

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

1

文档编写目的

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

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

1.在CDH5中安装Spark1.6的Thrift服务,参考《0079-如何在CDH中启用Spark Thrift》

2.在CDH5中安装Spark2.1的Thrift服务,参考《0280-如何在Kerberos环境下的CDH集群部署Spark2.1的Thrift及spark-sql客户端》

从Spark2.2开始到最新的Spark2.4,因为变化较大,不能够采用上述两种办法直接替换jar包的方式实现,更多的依赖问题导致需要重新编译或者修改更多的东西才能在CDH5中使用最新的Spark2.4的Thrift。在CDH5基于网易开源的工具Kyuubi实现的Spark2.4 Thrift功能,参考《0644-5.16.1-如何在CDH5中使用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环境下进行部署尝试。

代码语言:javascript复制
http://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.3/spark-2.4.3-bin-hadoop2.7.tgz

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

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

代码语言:javascript复制
java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.session.SessionState.reloadAuxJars()V), serverProtocolVersion:null)

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

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

代码语言:javascript复制
 “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.”

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版本的代码下载到本地进行编译

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

代码语言:javascript复制
./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
代码语言:javascript复制
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到本地

代码语言:javascript复制
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

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

代码语言:javascript复制
./build/mvn -Pyarn -Phive -Phive-thriftserver -DskipTests clean package -e

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

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

2.4

Intellij编译CDH的Spark源码

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

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

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

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

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

2.5

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

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

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

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

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

2.6

Gateway上使用hive1的依赖包方式

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

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

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

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

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

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

5.启动服务通过beeline访问

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

总结:由于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:

参考:

代码语言:javascript复制
https://issues.apache.org/jira/browse/SPARK-23534

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

参考:

代码语言:javascript复制
https://issues.apache.org/jira/browse/SPARK-27402

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

代码语言:javascript复制
https://github.com/apache/spark/pull/24628

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

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

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

0 人点赞