spark使用kafka报NoSuchMethodError

运行spark任务消费kafka时,报了如下的异常:

使用的spark版本是1.6.1,kafka版本是0.8.2.1。

根据异常信息猜测应该是scala版本导致的问题。

查看了一下依赖的spark和kafka的配置为:

依赖项直接copy自mvnrepository网站。

使用gradle dependencies指令查看了依赖详情:kafka依赖的scala的版本是2.11.5,spark依赖的scala版本是2.11.6。而spark集群服务器部署的scala版本是2.11.8。

照说都是在2.11.*范围内,不应该报错的。

反复测试了几次之后忽然想到spark集群使用的scala版本也许不是2.11.8,也就是说spark集群的scala版本和服务器scala环境的版本也许不一致,我之前的意识是错误的。

需要测试一下,依稀有些印象可以使用2.10.4版本的scala进行编译,所以得先把依赖调整一下:

kafka和spark依赖的name后面的数字,如“kafka_2.10”中的2.10指的是采用scala 2.10.*编译打包的。

打包上传后,测试通过,不再报那个异常了。

该如何确认spark集群使用的scala的版本呢。第一个思路是看spark集群lib目录下的依赖是不是会有相关的提示。看了一下比较失望:

就这么几个包,一点儿信息都没有。

不死心,用vi查看了一下。在spark-1.6.1-yarn-shuffle.jar的DEPENDENCIES文件中找到些许证明:

提示了spark-network-common_2.10是用scala 2.10编译的。

又查了一些资料,可以简单进行判断:

如果是spark1,用的scala版本通常是2.10,spark2则通常对应2.11版的scala。

就这样。

########

发表评论