illegalaccesserror to guava's stopwatch from org.apache.hadoop.mapreduce.lib.input.fileinputformat.liststatus

4szc88ey  于 2021-06-02  发布在  Hadoop
关注(0)|答案(9)|浏览(311)

我正在尝试运行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 }
eanckbw9

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分发的版本)。

7eumitmz

7eumitmz2#

我们刚刚用intellij和spark遇到了同样的情况。
使用时

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.1"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.3.1"

下载com.google.guava 20.0和hadoop client 2.6.5。
最快的解决方案是将guava库强制为15.0版(sbt)

dependencyOverrides += "com.google.guava" % "guava" % "15.0"
xzv2uavs

xzv2uavs3#

就我而言,因为 guava 21.0 导致错误。

<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>21.0</version>
 </dependency>

之后,我用 guava 15.0 或删除以上依赖项。我的代码运行良好。

xmd2e60i

xmd2e60i4#

我刚把我的Guava版本从19.0改成了15.0,它成功了。我目前使用的是spark 2.2版

<dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>15.0</version>
      </dependency>
ztigrdn8

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> 现在问题解决了。

tquggr8v

tquggr8v6#

我在Spark1.6.1中遇到了这个问题,因为我们的一个附加依赖项驱逐了Guava14.0.1,并用18.0替换了它。spark对hadoop客户机具有2.2的基本依赖性。见maven回购
有效的解决方案是添加到sbt中 libraryDependencies 以下内容: "org.apache.hadoop" % "hadoop-client" % "2.7.2"

n53p2ov0

n53p2ov07#

解决方案
guava.jar文件的多个版本由于可传递依赖关系而发生冲突,这导致了此异常。
在pom.xml中标识冲突的版本并添加为排除项将解决此问题。
在我的例子中,添加pmml evaluator version 1.4.1依赖项之后导致了这个异常。
通过依赖层次结构识别并添加maven排除解决了这个问题。

<dependency>
    <groupId>org.jpmml</groupId>
    <artifactId>pmml-evaluator</artifactId>
    <version>1.4.1</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </exclusion>
    </exclusions>
   </dependency>
9lowa7mx

9lowa7mx8#

听起来你有Guava的版本不匹配。
您的代码库中有东西试图调用 Stopwatch 构造函数,但是构造函数在Guava17.0中被移除,取而代之的是静态工厂方法( createStarted() 以及 createUnstarted() )在Guava15.0中添加的。
您应该更新任何试图使用构造函数的代码,以改用静态工厂方法。

tktrz96b

tktrz96b9#

版本 2.6.2hadoop:hadoop-mapreduce-client-core 不能与一起使用 guava 的新版本(我试过 17.0 - 19.0 )自 guavaStopWatch 无法访问构造函数(导致以上错误) IllegalAccessError )
使用 hadoop-mapreduce-client-core 的最新版本- 2.7.2 (他们不使用 guavaStopWatch 在上述方法中,他们使用 org.apache.hadoop.util.StopWatch )解决了这个问题,需要两个附加的依赖项:

compile('org.apache.hadoop:hadoop-mapreduce-client-core:2.7.2') {force = true}

compile('org.apache.hadoop:hadoop-common:2.7.2') {force = true} // required for org.apache.hadoop.util.StopWatch  

compile('commons-io:commons-io:2.4') {force = true} // required for org.apache.commons.io.Charsets that is used internally

注:有两种 org.apache.commons.io 包:commons io:commons io(这里是我们的),以及org.apache。commons:commons-io (旧的,2007年)。确保包括正确的一个。

相关问题