SBT Test Error: java.lang.NoSuchMethodError: net.jpountz.lz4.LZ4BlockInputStream

SBT Test Error: java.lang.NoSuchMethodError: net.jpountz.lz4.LZ4BlockInputStream

当我尝试使用 scalatest 在 SBT windows 上对我的 spark 流代码执行单元测试时出现异常。

sbt testOnly <<ClassName>>

*
*
*
*
*
*

2018-06-18 02:39:00 ERROR Executor:91 - Exception in task 1.0 in stage 3.0 (TID 11) java.lang.NoSuchMethodError: net.jpountz.lz4.LZ4BlockInputStream.(Ljava/io/InputStream;Z)V at org.apache.spark.io.LZ4CompressionCodec.compressedInputStream(CompressionCodec.scala:122) at org.apache.spark.serializer.SerializerManager.wrapForCompression(SerializerManager.scala:163) at org.apache.spark.serializer.SerializerManager.wrapStream(SerializerManager.scala:124) at org.apache.spark.shuffle.BlockStoreShuffleReader$$anonfun.apply(BlockStoreShuffleReader.scala:50) at org.apache.spark.shuffle.BlockStoreShuffleReader$$anonfun.apply(BlockStoreShuffleReader.scala:50) at org.apache.spark.storage.ShuffleBlockFetcherIterator.next(ShuffleBlockFetcherIterator.scala:417) at org.apache.spark.storage.ShuffleBlockFetcherIterator.next(ShuffleBlockFetcherIterator.scala:61) at scala.collection.Iterator$$anon.nextCur(Iterator.scala:435) at scala.collection.Iterator$$anon.hasNext(Iterator.scala:441) at scala.collection.Iterator$$anon.hasNext(Iterator.scala:409) at org.apache.spark.util.CompletionIterator.hasNext(CompletionIterator.scala:32) at org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:37) at scala.collection.Iterator$$anon.hasNext(Iterator.scala:409) at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.sort_addToSorter$(Unknown Source) at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(Unknown Source) at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$$anon.hasNext(WholeStageCodegenExec.scala:614) at org.apache.spark.sql.execution.GroupedIterator$.apply(GroupedIterator.scala:29) at org.apache.spark.sql.execution.streaming.FlatMapGroupsWithStateExec$StateStoreUpdater.updateStateForKeysWithData(FlatMapGroupsWithStateExec.scala:176)**

尝试了一些方法来排除 net.jpountz.lz4 jar(根据其他帖子的建议),但在输出中再次出现同样的错误。

目前使用spark 2.3,scalatest 3.0.5,Scala 2.11版本。我只在升级到 spark 2.3 和 scalatest 3.0.5 后才看到这个问题

有什么建议吗?

Kafka 与 Spark 的依赖关系存在冲突,这就是导致我出现此问题的原因。

这就是你 exclude sbt 文件中的依赖关系

lazy val excludeJpountz = ExclusionRule(organization = "net.jpountz.lz4", name = "lz4")

lazy val kafkaClients = "org.apache.kafka" % "kafka-clients" % userKafkaVersionHere excludeAll(excludeJpountz) // add more exclusions here

当您使用此 kafkaClients 依赖项时,它现在会排除有问题的 lz4 库。


更新: 这似乎是 Kafka 0.11.x.x 和更早版本的问题。从 1.x.x 开始,Kafka 似乎已经不再使用有问题的 net.jpountz.lz4 库。因此,使用最新的 Kafka (1.x) 和最新的 Spark (2.3.x) 应该不会有这个问题。

此工件“net.jpountz.lz4:lz4”已移至: "org.lz4 » lz4-java"

通过使用; libraryDependencies += "org.lz4" % "lz4-java" % "1.7.1", 问题已解决