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

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

推荐关注微信公众号:“Hadoop实操”,ID:gh_c4c535955d0f

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环境下进行部署尝试。

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包

在这里插入图片描述
进行部署测试,报如下错误提示找不到方法:

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数据库,报如下错误:

 “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版本进行编译

./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

在这里插入图片描述

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

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

./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:

在这里插入图片描述

参考:

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
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值