运行spark任务消费kafka时,报了如下的异常:
1 2 3 4 5 6 7 8 |
java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Object; at kafka.consumer.FetchRequestAndResponseMetrics.<init>(FetchRequestAndResponseStats.scala:32) at kafka.consumer.FetchRequestAndResponseStats.<init>(FetchRequestAndResponseStats.scala:46) at kafka.consumer.FetchRequestAndResponseStatsRegistry$$anonfun$2.apply(FetchRequestAndResponseStats.scala:59) at kafka.consumer.FetchRequestAndResponseStatsRegistry$$anonfun$2.apply(FetchRequestAndResponseStats.scala:59) at kafka.utils.Pool.getAndMaybePut(Pool.scala:61) at kafka.consumer.FetchRequestAndResponseStatsRegistry$.getFetchRequestAndResponseStats(FetchRequestAndResponseStats.scala:63) at kafka.consumer.SimpleConsumer.<init>(SimpleConsumer.scala:39) |
使用的spark版本是1.6.1,kafka版本是0.8.2.1。
根据异常信息猜测应该是scala版本导致的问题。
查看了一下依赖的spark和kafka的配置为:
1 2 3 |
compile group: 'org.apache.kafka', name: 'kafka_2.11', version: '0.8.2.1' compileOnly group: 'org.apache.spark', name: 'spark-core_2.11', version: '1.6.1' compileOnly group: 'org.scala-lang', name: 'scala-compiler', version: '2.11.6' |
依赖项直接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进行编译,所以得先把依赖调整一下:
1 2 3 |
compile group: 'org.apache.kafka', name: 'kafka_2.10', version: '0.8.2.1' compileOnly group: 'org.apache.spark', name: 'spark-core_2.10', version: '1.6.1' compileOnly group: 'org.scala-lang', name: 'scala-compiler', version: '2.10.4' |
kafka和spark依赖的name后面的数字,如“kafka_2.10”中的2.10指的是采用scala 2.10.*编译打包的。
打包上传后,测试通过,不再报那个异常了。
该如何确认spark集群使用的scala的版本呢。第一个思路是看spark集群lib目录下的依赖是不是会有相关的提示。看了一下比较失望:
1 2 3 4 5 6 |
datanucleus-api-jdo-3.2.6.jar datanucleus-core-3.2.10.jar datanucleus-rdbms-3.2.9.jar spark-1.6.1-yarn-shuffle.jar spark-assembly-1.6.1-hadoop2.6.0.jar spark-examples-1.6.1-hadoop2.6.0.jar |
就这么几个包,一点儿信息都没有。
不死心,用vi查看了一下。在spark-1.6.1-yarn-shuffle.jar的DEPENDENCIES文件中找到些许证明:
1 2 3 4 5 |
From: 'The Apache Software Foundation' (http://www.apache.org/) - Spark Project Networking (http://spark.apache.org/) org.apache.spark:spark-network-common_2.10:jar:1.6.1 License: Apache 2.0 License (http://www.apache.org/licenses/LICENSE-2.0.html) - Spark Project Shuffle Streaming Service (http://spark.apache.org/) org.apache.spark:spark-network-shuffle_2.10:jar:1.6.1 License: Apache 2.0 License (http://www.apache.org/licenses/LICENSE-2.0.html) |
提示了spark-network-common_2.10是用scala 2.10编译的。
又查了一些资料,可以简单进行判断:
如果是spark1,用的scala版本通常是2.10,spark2则通常对应2.11版的scala。
就这样。
########
发表评论