我看到火花通过其中一个hadoop依赖(假设)传递Guava 16.0.1但是在我的Maven项目中我还需要cassandra-unit来强制Guava 21.0然后在我尝试用文件读取文件时打破火花sparkSession.sparkContext.textfile
方法。我想知道是否有其他人遇到过类似的问题以及你是如何解决的?这是堆栈跟踪:
*** RUN ABORTED ***
java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.mapred.FileInputFormat
at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:312)
at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:194)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:250)
at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250)
at scala.Option.getOrElse(Option.scala:121)
...
更新:正如评论中所建议的那样,这可能与another stackoverflow question重复。我尝试强制版本2.7.2和2.9.0 hadoop-mapreduce-client-core
和hadoop-common
。我不认为你可以做到这一点虽然因为这打破了其他地方:java.lang.NoClassDefFoundError: org/apache/commons/configuration/Configuration
这是一个超级旧的1.10版commons-configuration
中的一个类,显然其他东西依赖。这就是恶性循环......
更新:最初我的代码使用的是一个使用SparkContext
api来调用sparkSession.sparkContext.textfile
方法的库。当我使用SparkSession
切换到sparkSession.read
api时,问题不再明显。