我正在尝试运行small spark应用程序,遇到以下异常:
Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.mapreduce.lib.input.FileInputFormat
at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:262)
at org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat.getSplits(CombineFileInputFormat.java:217)
at org.apache.spark.rdd.NewHadoopRDD.getPartitions(NewHadoopRDD.scala:95)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:219)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:217)
at scala.Option.getOrElse(Option.scala:120)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:217)
at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:32)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:219)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:217)
at scala.Option.getOrElse(Option.scala:120)
相关gradle dependencies部分:
compile('org.apache.spark:spark-core_2.10:1.3.1')
compile('org.apache.hadoop:hadoop-mapreduce-client-core:2.6.2') {force = true}
compile('org.apache.hadoop:hadoop-mapreduce-client-app:2.6.2') {force = true}
compile('org.apache.hadoop:hadoop-mapreduce-client-shuffle:2.6.2') {force = true}
compile('com.google.guava:guava:19.0') { force = true }
9条答案
按热度按时间eanckbw91#
如果您想在不重新构建spark的情况下解决这个问题,例如使用spark的预构建发行版,那么我发现以下内容适用于apachespark2.3.0(即使用预构建的:“spark-2.3.0-bin-without-hadoop”):
从spark'jars'目录中重命名或删除错误版本的'hadoop-mapreduce-client-core'jar文件(在我的例子中,这个文件是'hadoop-mapreduce-client-core-2.6.5.jar')。
将“hadoop mapreduce client core”jar的兼容版本(从hadoop安装)复制到spark“jars”目录中(或软链接)。
也可以通过改变类路径来强制使用所需的“hadoop mapreduce client core”jar文件(以便spark从hadoop中找到版本,而不是spark分发的版本)。
7eumitmz2#
我们刚刚用intellij和spark遇到了同样的情况。
使用时
下载com.google.guava 20.0和hadoop client 2.6.5。
最快的解决方案是将guava库强制为15.0版(sbt)
xzv2uavs3#
就我而言,因为
guava 21.0
导致错误。之后,我用
guava 15.0
或删除以上依赖项。我的代码运行良好。xmd2e60i4#
我刚把我的Guava版本从19.0改成了15.0,它成功了。我目前使用的是spark 2.2版
ztigrdn85#
问题似乎来自于依赖库。
基本上,当您尝试将数据放入hbase表时,您会遇到问题。
起初我用
<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.1.2</version> </dependency>
我遇到了和你类似的问题,后来我改成<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-shaded-client</artifactId> <version>1.1.2</version> </dependency>
现在问题解决了。tquggr8v6#
我在Spark1.6.1中遇到了这个问题,因为我们的一个附加依赖项驱逐了Guava14.0.1,并用18.0替换了它。spark对hadoop客户机具有2.2的基本依赖性。见maven回购
有效的解决方案是添加到sbt中
libraryDependencies
以下内容:"org.apache.hadoop" % "hadoop-client" % "2.7.2"
n53p2ov07#
解决方案
guava.jar文件的多个版本由于可传递依赖关系而发生冲突,这导致了此异常。
在pom.xml中标识冲突的版本并添加为排除项将解决此问题。
在我的例子中,添加pmml evaluator version 1.4.1依赖项之后导致了这个异常。
通过依赖层次结构识别并添加maven排除解决了这个问题。
9lowa7mx8#
听起来你有Guava的版本不匹配。
您的代码库中有东西试图调用
Stopwatch
构造函数,但是构造函数在Guava17.0中被移除,取而代之的是静态工厂方法(createStarted()
以及createUnstarted()
)在Guava15.0中添加的。您应该更新任何试图使用构造函数的代码,以改用静态工厂方法。
tktrz96b9#
版本
2.6.2
的hadoop:hadoop-mapreduce-client-core
不能与一起使用guava
的新版本(我试过17.0
-19.0
)自guava
的StopWatch
无法访问构造函数(导致以上错误)IllegalAccessError
)使用
hadoop-mapreduce-client-core
的最新版本-2.7.2
(他们不使用guava
的StopWatch
在上述方法中,他们使用org.apache.hadoop.util.StopWatch
)解决了这个问题,需要两个附加的依赖项:注:有两种
org.apache.commons.io
包:commons io:commons io(这里是我们的),以及org.apache。commons:commons-io (旧的,2007年)。确保包括正确的一个。