J'essaie de lancer une petite application d'étincelle et j'obtiens l'exception suivante:
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)
la section relative aux dépendances de niveaux:
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 }
la version 2.6.2
de hadoop:hadoop-mapreduce-client-core
ne peut pas être utilisée avec les nouvelles versions de guava
(j'ai essayé 17.0
- 19.0
) car le constructeur de guava
's StopWatch
ne peut pas être consulté (ce qui cause la précédente IllegalAccessError
)
en utilisant la dernière version de hadoop-mapreduce-client-core
- 2.7.2
(dans lequel ils n'utilisent pas guava
'StopWatch
dans la méthode ci-dessus, ils utilisent plutôt org.Apache.hadoop.util.StopWatch
) résolvent le problème, avec deux dépendances supplémentaires requises:
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
note: il y a deux paquets org.Apache.commons.io
: commons-io: commons-io (le nôtre ici), et org.Apache.commons: commons-io (ancien , 2007). assurez-vous d'inclure le bon.
Je viens de changer ma version de goyave de 19.0 à 15.0 et cela a fonctionné. J'utilise actuellement la version spark 2.2
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>15.0</version>
</dependency>
J'ai eu ce problème avec Spark 1.6.1 parce qu'une de nos dépendances supplémentaires a expulsé Guava 14.0.1 et l'a remplacé par 18.0. Spark a la dépendance de base pour hadoop-client de 2.2. Voir [Repo Maven] ( https://mvnrepository.com/artifact/org.Apache.spark/spark-core_2.10/1.6.1 )
La solution qui a fonctionné consiste à ajouter à sbt libraryDependencies
ce qui suit: "org.Apache.hadoop" % "hadoop-client" % "2.7.2"
On dirait que vous avez une incompatibilité de version Guava.
Quelque chose dans votre base de code tente d’appeler le constructeur Stopwatch
, mais les constructeurs ont été supprimés de Guava 17.0 au profit des méthodes fabriques statiques (createStarted()
et createUnstarted()
) ajoutées à Guava 15.0.
Vous devez mettre à jour le code qui tente d'utiliser les constructeurs pour utiliser plutôt les méthodes de fabrique statique.
Dans mon cas, en raison de l'ajout de guava 21.0
, une erreur s'est produite.
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
Après cela, j'utilise guava 15.0
ou supprime la dépendance ci-dessus. Mon code fonctionne bien.
Solution
Identifié via la hiérarchie des dépendances et les exclusions Maven ajoutées ont résolu ce problème.
<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>
Il semble que le problème vienne de bibliothèques dépendantes.
En gros, vous aurez le problème lorsque vous essayez de placer les données dans la table hbase.
Au départ, j'avais utilisé <dependency> <groupId>org.Apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.1.2</version> </dependency>
J'ai eu le même problème que vous et plus tard, j'ai changé pour <dependency> <groupId>org.Apache.hbase</groupId> <artifactId>hbase-shaded-client</artifactId> <version>1.1.2</version> </dependency>
et maintenant le problème a été résolu.
Si vous souhaitez contourner ce problème sans reconstruire Spark, en utilisant par exemple une distribution prédéfinie de Spark, je trouvais que les solutions suivantes fonctionnaient sous Apache Spark 2.3.0 (c'est-à-dire que nous utilisions la préconfiguration suivante: 'spark-2.3.0 -bin-sans-hadoop '):
Il est également possible de forcer l’utilisation du fichier jar "hadoop-mapreduce-client-core" souhaité en modifiant votre chemin de classe (de sorte que Spark trouve la version de Hadoop plutôt que celle distribuée avec Spark).
Nous venons de vivre la même situation avec IntelliJ et Spark.
Lors de l'utilisation
libraryDependencies += "org.Apache.spark" %% "spark-core" % "2.3.1"
libraryDependencies += "org.Apache.spark" %% "spark-sql" % "2.3.1"
com.google.guava 20.0 est téléchargé et le client Hadoop 2.6.5 est téléchargé.
La solution la plus rapide serait de forcer la bibliothèque de goyave à la version 15.0 (SBT)
dependencyOverrides += "com.google.guava" % "guava" % "15.0"