前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >0645-6.2.0-为什么我在CDH6上使用Spark2.4 Thrift失败了

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

作者头像
Fayson
发布2019-06-04 11:26:15
3.3K0
发布2019-06-04 11:26:15
举报
文章被收录于专栏:Hadoop实操Hadoop实操

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

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干货,欢迎转发和分享。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
专用宿主机
专用宿主机(CVM Dedicated Host,CDH)提供用户独享的物理服务器资源,满足您资源独享、资源物理隔离、安全、合规需求。专用宿主机搭载了腾讯云虚拟化系统,购买之后,您可在其上灵活创建、管理多个自定义规格的云服务器实例,自主规划物理资源的使用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档