web-dev-qa-db-fra.com

IllegalAccessError au chronomètre Stop de la goyave de org.Apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus

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 }
10
Lika

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.

31
Lika

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>
7
HadoopEvangelist

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"

4
ekrich

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.

3

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. 

3
VanThaoNguyen

Solution

  1. Plusieurs versions de fichiers guava.jar sont en conflit en tant que dépendances transitives, ce qui provoque cette exception.
  2. Identifiez la version en conflit et ajoutez-le en tant qu'exclusion dans pom.xml pour résoudre ce problème.
  3. Dans mon cas, après l’ajout de pmml-evaluator version 1.4.1 dependency a provoqué cette exception.
  4. 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>
    
1

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.

0
Ram Jaddu

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 '):

  1. Renommez ou supprimez la version erronée du fichier jar "hadoop-mapreduce-client-core" (dans mon cas, il s'agissait de "hadoop-mapreduce-client-core-2.6.5.jar") du répertoire "jar" de Spark.
  2. Copiez (ou créez un lien symbolique) la version compatible (à partir de votre installation Hadoop) du fichier jar "hadoop-mapreduce-client-core" dans le répertoire "jars" de Spark.

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).

0
B. Tolley

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"
0
Carlos David Peña