java面试题网站:www.javaoffers.com
对于这个错误我想吐血,网上都说scala的版本不对,我首先查看spark集群使用的Scala版本是多少?
执行spark-shell:
可以查看spark集群使用的Scala版本,为2.10.5,
再看我idea使用:也是2.10.5
并且在idea上spark程序运行正常,就是拷贝到spark集群后就报错,然后我
怀疑idea中的spark依赖和spark集群不一致,所以 我查看一下:
spark集群的版本为:
idea中的spark依赖为:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>1.6.1</version>
</dependency>
版本是相同:所以排除
然后接着看报错信息:
关键点: at kafka.api.RequestKeys$.<init>(RequestKeys.scala:39)程序在执行这一行的时候报错的,说明与kafka依赖有关,怀疑kafka的依赖的Scala版本过高或者过低, 查看kafka依赖:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka_2.10</artifactId>
<version>1.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>1.0.0</version>
</dependency>
但是 spark-streaming-kafka_2.10和kafka-clients 都是低版本是scala 2.10版本,再次回想spark程序在idea(Scala2.10环境)中是可以正常运行的。说明不是kafka的问题那就是打包的问题:查看包
Scala文件夹中存在Predef$ArrowAssoc。
现在怀疑存在Scala包导致,也就是说打包的时候把Scala2.10打包进去了,但是我们提交到spark集群他会和spark集群的Scala2.10 冲突,猜测是这个的原因:就把jar包中的Scala文件夹删除,然后再次提交到spark集群并且没有报错 正常运行,在这记录一下自己踩得坑。