IllegalAccessError to guava's StopWatch from org.apache.hadoop.mapreduce.lib.input.FileInputFormat.



我正在尝试运行小型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)

相关等级相关性部分:

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 }

hadoop:hadoop-mapreduce-client-core2.6.2版本不能与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

注意:存在两个CCD_ 14包:公地io:公地io(这里是我们的),以及org.apache.commons:commons-io(旧版本,2007年)。一定要包括正确的。

我们刚刚在使用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客户端2.6.5。

最快的解决方案是强制番石榴库升级到15.0版本(SBT)

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

我刚把番石榴的版本从19.0改为15.0,效果很好。我目前使用的是spark 2.2 版本

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

我在Spark 1.6.1中遇到了这个问题,因为我们的一个附加依赖项驱逐了Guava 14.0.1,并将其替换为18.0。Spark对hadoop客户端的基本依赖性是2.2。参见[Maven Repo](https://mvnrepository.com/artifact/org.apache.spark/spark-core_2.10/1.6.1)

有效的解决方案是向sbt libraryDependencies添加以下内容:"org.apache.hadoop" % "hadoop-client" % "2.7.2"

听起来Guava版本不匹配。

你的代码库中有一些东西试图调用Stopwatch构造函数,但在Guava 17.0中删除了构造函数,取而代之的是在Guava 15.0中添加的静态工厂方法(createStarted()createUnstarted())。

您应该更新任何试图使用构造函数的代码,以使用静态工厂方法。

在我的情况下,由于添加guava 21.0导致错误。

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

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

解决方案

  1. guava.jar文件的多个版本由于传递依赖关系而发生冲突,这导致了此异常
  2. 识别冲突的版本并在pom.xml中添加为排除项将解决此问题
  3. 在我的案例中,添加pmml评估器1.4.1版本依赖项后导致了此异常
  4. 通过依赖层次结构确定并添加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>
    

问题似乎来自依赖库。

基本上,当您试图将数据放入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>,现在问题已经解决了。

如果你想在不重新构建Spark的情况下解决这个问题,例如使用Spark的预构建分发版,那么我发现以下内容在Apache Spark 2.3.0上有效(即使用预构建的:"Spark-2.3.0-bin-without-hadoop"):

  1. 从Spark"jars"目录中重命名或删除"hadoop-mapreduce client core"jar文件的错误版本(在我的案例中,这是"hadoop-mapreduce client-core-2.6.5.jar")
  2. 将"Hadoop mapreduce client core"jar的兼容版本(从Hadoop安装)复制(或软链接)到Spark"jars"目录中

也可以通过更改类路径来强制使用所需的"hadoop mapreduce client core"jar文件(这样Spark就可以从hadoop中找到版本,而不是与Spark一起分发的版本)。

spark版本=2.4.8

scala版本=2.12.12

我添加了以下3个依赖

libraryDependencies+=";com.google.guava"%"番石榴"%"15.0〃;

libraryDependencies+=";org.apache.hadoop"%"hadoop mapreduce客户端核心"%"3.3.4";

libraryDependencies+=";org.apache.hadoop"%"hadoop公共"%"3.3.4";

它对我有效

最新更新