SBT测试错误: java.lang.NoSuchMethodError: net.jpountz.lz4.LZ4BlockInputStream

17

当我在Windows上使用Scalatest为我的Spark Streaming代码执行单元测试时,使用以下命令会出现异常:

sbt testOnly <<ClassName>>

*
*
*
*
*
*

2018-06-18 02:39:00 ERROR Executor:91 - 在第3.0阶段的1.0任务(TID11)中发生异常: 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$2.apply(BlockStoreShuffleReader.scala:50) at org.apache.spark.shuffle.BlockStoreShuffleReader$$anonfun$2.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$12.nextCur(Iterator.scala:435) at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:441) at scala.collection.Iterator$$anon$11.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$11.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$10$$anon$1.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 后出现。

有什么建议吗?


第一条建议:请编辑您的问题的标题和格式,使其更易读。之后,您可能需要分享一些您使用过的代码行。 - Nico Haase
你能发布你的构建文件吗? - soote
当我运行一个具有Parquet输出的作业时,我遇到了相同的错误。添加以下属性后,它可以正常工作:--conf spark.io.compression.codec=snappy。 - Akash Tantri
2个回答

33

Kafka与Spark存在冲突依赖,这是导致我的问题的原因。

以下是如何在您的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)不应该出现这个问题。


4
在升级到Spark 2.3后,我遇到了问题,但是通过在org.apache.kafka:kafkaorg.apache.spark:spark-streaming-kafka-0-10上进行排除操作解决了这个问题。 - soote
4
这是我未解决的问题,以下是我对 build.sbt 文件所做的更改:name := "ABC123" scalaVersion := "2.11.11" val sparkVersion = "2.3.0"lazy val excludeJpountz = ExclusionRule(organization = "net.jpountz.lz4", name = "lz4")libraryDependencies ++= Seq( . . "org.apache.spark" %% "spark-streaming-kafka-0-10" % sparkVersion excludeAll(excludeJpountz), "org.apache.spark" %% "spark-sql-kafka-0-10" % sparkVersion excludeAll(excludeJpountz),) - KK2486
1
解决复杂构建的正确方法是安装 https://github.com/jrudolph/sbt-dependency-graph,然后使用 whatDependsOn net.jpountz.lz4 lz4 1.3.0 命令,它会给你展示所有依赖于此库的库的图形。您需要将相同的排除规则添加到所有这些库中。 - marios
将我的Kafka版本升级到1.1.0解决了这个问题。 - Sudheer Palyam
1
只是澄清一些最初让我们困惑的事情:net.jpountz.lz4:lz4 已被 org.lz4:lz4-java 取代,但它们保留了相同的包名称。因此,在您的打包中可能会同时出现这两个构件,如果不幸的话,类加载器可能会找到旧的版本而没有新的方法签名。 - jrg
显示剩余2条评论

3

这个工件“net.jpountz.lz4:lz4”已经被移动到: “org.lz4 » lz4-java”。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接