SBT 测试错误:java.lang.NoSuchMethodError:net.jpountz.lz4.LZ4BlockInputStream
Posted
技术标签:
【中文标题】SBT 测试错误:java.lang.NoSuchMethodError:net.jpountz.lz4.LZ4BlockInputStream【英文标题】:SBT Test Error: java.lang.NoSuchMethodError: net.jpountz.lz4.LZ4BlockInputStream 【发布时间】:2018-11-27 04:18:57 【问题描述】:当我尝试使用 scalatest 在 SBT 窗口上对我的 spark 流代码执行单元测试时遇到异常。
sbt testOnly <<ClassName>>
* * * * * *
2018-06-18 02:39:00 错误执行程序:91 - 阶段 3.0 (TID 11) 中的任务 1.0 异常 java.lang.NoSuchMethodError: net.jpountz.lz4.LZ4BlockInputStream.(Ljava/io/InputStream;Z)V 在 org.apache.spark.io.LZ4CompressionCodec.compressedInputStream(CompressionCodec.scala:122) 在 org.apache.spark.serializer.SerializerManager.wrapForCompression(SerializerManager.scala:163) 在 org.apache.spark.serializer.SerializerManager.wrapStream(SerializerManager.scala:124) 在 org.apache.spark.shuffle.BlockStoreShuffleReader$$anonfun$2.apply(BlockStoreShuffleReader.scala:50) 在 org.apache.spark.shuffle.BlockStoreShuffleReader$$anonfun$2.apply(BlockStoreShuffleReader.scala:50) 在 org.apache.spark.storage.ShuffleBlockFetcherIterator.next(ShuffleBlockFetcherIterator.scala:417) 在 org.apache.spark.storage.ShuffleBlockFetcherIterator.next(ShuffleBlockFetcherIterator.scala:61) 在 scala.collection.Iterator$$anon$12.nextCur(Iterator.scala:435) 在 scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:441) 在 scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:409) 在 org.apache.spark.util.CompletionIterator.hasNext(CompletionIterator.scala:32) 在 org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:37) 在 scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:409) 在 org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.sort_addToSorter$(未知来源) 在 org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(未知来源) 在 org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) 在 org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$10$$anon$1.hasNext(WholeStageCodegenExec.scala:614) 在 org.apache.spark.sql.execution.GroupedIterator$.apply(GroupedIterator.scala:29) 在 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 后才看到这个问题
有什么建议吗?
【问题讨论】:
第一个建议:请编辑问题的标题和格式,使其更具可读性。之后,您可能应该分享您使用过的一些代码行 你能发布你的构建文件吗? 我在运行添加了 parquet 输出的作业时遇到了同样的错误,它工作正常,--conf spark.io.compression.codec=snappy 【参考方案1】: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) 应该不会有这个问题。
【讨论】:
这解决了我升级到 spark 2.3 后的问题。我不得不在org.apache.kafka:kafka
和org.apache.spark:spark-streaming-kafka-0-10
上排除它。
感谢更新soote,它很可能也有相同的依赖关系。
仍然没有为我解决,这是我对 build.sbt 名称所做的更改:= "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),** )
对于复杂的构建解决这个问题的正确方法是安装https://github.com/jrudolph/sbt-dependency-graph
和使用whatDependsOn net.jpountz.lz4 lz4 1.3.0
它会给你一个图表,你拥有依赖于此的所有库。您需要为所有这些添加相同的排除规则。
只是为了澄清一些最初让我们感到困惑的事情:net.jpountz.lz4:lz4
已被人工制品 org.lz4:lz4-java
取代,但它们保留了相同的包名称。因此,您最终可以在包装中同时使用这两种人工制品,如果您不走运,ClassLoader 会找到没有新方法签名的旧人工制品。【参考方案2】:
此工件“net.jpountz.lz4:lz4”已移至: "org.lz4 » lz4-java"
通过使用; libraryDependencies += "org.lz4" % "lz4-java" % "1.7.1",问题已解决。
【讨论】:
以上是关于SBT 测试错误:java.lang.NoSuchMethodError:net.jpountz.lz4.LZ4BlockInputStream的主要内容,如果未能解决你的问题,请参考以下文章
SBT 测试错误:java.lang.NoSuchMethodError:net.jpountz.lz4.LZ4BlockInputStream