我正在尝试运行小型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-core
的2.6.2
版本不能与guava
的新版本一起使用(我尝试了17.0
-19.0
),因为guava
的StopWatch
构造函数无法访问(导致IllegalAccessError
以上)
使用hadoop-mapreduce-client-core
的最新版本2.7.2
(在上面的方法中,他们没有使用guava
的StopWatch
,而是使用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
或删除上面的依赖项。我的代码运行良好。
解决方案
- guava.jar文件的多个版本由于传递依赖关系而发生冲突,这导致了此异常
- 识别冲突的版本并在pom.xml中添加为排除项将解决此问题
- 在我的案例中,添加pmml评估器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>
问题似乎来自依赖库。
基本上,当您试图将数据放入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"):
- 从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一起分发的版本)。
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";
它对我有效