web-dev-qa-db-fra.com

Hadoop 2.9.2, Spark 2.4.0 accès au compartiment AWS s3a

Cela fait quelques jours mais je n'ai pas pu télécharger depuis Amazon Bucket public en utilisant Spark :(

Voici spark-Shell commande:

spark-Shell  --master yarn
              -v
              --jars file:/usr/local/hadoop/share/hadoop/tools/lib/hadoop-aws-2.9.2.jar,file:/usr/local/hadoop/share/hadoop/tools/lib/aws-Java-sdk-bundle-1.11.199.jar
              --driver-class-path=/usr/local/hadoop/share/hadoop/tools/lib/hadoop-aws-2.9.2.jar:/usr/local/hadoop/share/hadoop/tools/lib/aws-Java-sdk-bundle-1.11.199.jar

L'application a démarré et Shell attend l'invite:

   ____              __
  / __/__  ___ _____/ /__
 _\ \/ _ \/ _ `/ __/  '_/
/___/ .__/\_,_/_/ /_/\_\   version 2.4.0
   /_/

Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_191)
Type in expressions to have them evaluated.
Type :help for more information.

scala> val data1 = sc.textFile("s3a://my-bucket-name/README.md")

18/12/25 13:06:40 INFO MemoryStore: Block broadcast_0 stored as values in memory (estimated size 242.1 KB, free 246.7 MB)
18/12/25 13:06:40 INFO MemoryStore: Block broadcast_0_piece0 stored as bytes in memory (estimated size 24.2 KB, free 246.6 MB)
18/12/25 13:06:40 INFO BlockManagerInfo: Added broadcast_0_piece0 in memory on hadoop-Edge01:3545 (size: 24.2 KB, free: 246.9 MB)
18/12/25 13:06:40 INFO SparkContext: Created broadcast 0 from textFile at <console>:24
data1: org.Apache.spark.rdd.RDD[String] = s3a://my-bucket-name/README.md MapPartitionsRDD[1] at textFile at <console>:24

scala> data1.count()

Java.lang.NoClassDefFoundError: org/Apache/hadoop/fs/StorageStatistics
at Java.lang.Class.forName0(Native Method)
at Java.lang.Class.forName(Class.Java:348)
at org.Apache.hadoop.conf.Configuration.getClassByNameOrNull(Configuration.Java:2134)
at org.Apache.hadoop.conf.Configuration.getClassByName(Configuration.Java:2099)
at org.Apache.hadoop.conf.Configuration.getClass(Configuration.Java:2193)
at org.Apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.Java:2654)
at org.Apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.Java:2667)
at org.Apache.hadoop.fs.FileSystem.access$200(FileSystem.Java:94)
at org.Apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.Java:2703)
at org.Apache.hadoop.fs.FileSystem$Cache.get(FileSystem.Java:2685)
at org.Apache.hadoop.fs.FileSystem.get(FileSystem.Java:373)
at org.Apache.hadoop.fs.Path.getFileSystem(Path.Java:295)
at org.Apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.Java:97)
at org.Apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodes(TokenCache.Java:80)
at org.Apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.Java:206)
at org.Apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.Java:315)
at org.Apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:204)
at org.Apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:253)
at org.Apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251)
at scala.Option.getOrElse(Option.scala:121)
at org.Apache.spark.rdd.RDD.partitions(RDD.scala:251)
at org.Apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:49)
at org.Apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:253)
at org.Apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251)
at scala.Option.getOrElse(Option.scala:121)
at org.Apache.spark.rdd.RDD.partitions(RDD.scala:251)
at org.Apache.spark.SparkContext.runJob(SparkContext.scala:2126)
at org.Apache.spark.rdd.RDD.count(RDD.scala:1168)
... 49 elided
Caused by: Java.lang.ClassNotFoundException: 
org.Apache.hadoop.fs.StorageStatistics
  at Java.net.URLClassLoader.findClass(URLClassLoader.Java:382)
  at Java.lang.ClassLoader.loadClass(ClassLoader.Java:424)
  at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:349)
  at Java.lang.ClassLoader.loadClass(ClassLoader.Java:357)
  ... 77 more

scala>
  1. Toutes les clés AWS, les clés secrètes ont été définies dans hadoop/core-site.xml comme décrit ici: module Hadoop-AWS: intégration avec Amazon Web Services
  2. Le bucket est public - tout le monde peut le télécharger (testé avec curl -O)
  3. Tous les .jars comme vous pouvez le voir ont été fournis par Hadoop lui-même à partir de /usr/local/hadoop/share/hadoop/tools/lib/ dossier
  4. Il n'y a pas de paramètres supplémentaires dans spark-defaults.conf - uniquement ce qui a été envoyé en ligne de commande
  5. Les deux pots ne fournissent pas cette classe:

    jar tf /usr/local/hadoop/share/hadoop/tools/lib/hadoop-aws-2.9.2.jar | grep org/Apache/hadoop/fs/StorageStatistics
    (no result)
    
    jar tf /usr/local/hadoop/share/hadoop/tools/lib/aws-Java-sdk-bundle-1.11.199.jar | grep org/Apache/hadoop/fs/StorageStatistics
    (no result)
    

Que devrais-je faire ? Ai-je oublié d'ajouter un autre pot? Quelle est la configuration exacte de hadoop-aws et aws-Java-sdk-bundle? versions?

6
Jasper

Mmmm .... J'ai trouvé le problème, enfin ..

Le problème principal est Spark que j'ai) est préinstallé pour Hadoop. avec elle ci-dessus. En fait Spark livré avec version différente des pots hadoop. La liste de:/usr/local/étincelle/pots/montre qu'il a:

hadoop-common-2.7.3.jar
hadoop-client-2.7.3.jar
....

il ne manque que: hadoop-aws et aws-Java-sdk. J'ai creusé un peu dans le référentiel Maven: hadoop-aws-v2.7. et sa dépendance: aws-Java-sdk-v1.7.4 et le tour est joué! Téléchargé ces jar et envoyer eux comme paramètres à Spark. Comme ça:

étincelle-Shell
- fil maître
- v
- fichier jars: /home/aws-Java-sdk-1.7.4.jar, fichier: /home/hadoop-aws-2.7.3.jar
- driver-class-path =/home/aws-Java-sdk-1.7.4.jar: /home/hadoop-aws-2.7.3.jar

A fait le travail !!!

Je me demande simplement pourquoi tous les pots de Hadoop (et je les envoie tous en tant que paramètre à --jars et --driver-class-path) n'ont pas rattrapé leur retard. Spark choisissez en quelque sorte automatiquement les pots et non ce que j'envoie

14
Jasper

Je vous conseille de ne pas faire ce que vous avez fait. Vous exécutez une version pré-construite spark with hadoop 2.7.2 pots sur hadoop 2.9.2 et vous avez ajouté au chemin de classe d'autres fichiers jar pour travailler avec s3 à partir du hadoop 2.7.3 version pour résoudre le problème.

Ce que vous devriez faire, c'est travailler avec un "hadoop free" spark version - et fournir le fichier hadoop par configuration comme vous pouvez le voir dans le lien suivant - https: // spark .Apache.org/docs/2.4.0/hadoop-provided.html

Les parties principales:

dans conf/spark-env.sh

Si hadoop binaire est sur votre PATH

export SPARK_DIST_CLASSPATH=$(hadoop classpath)

Avec un chemin explicite vers hadoop binaire

export SPARK_DIST_CLASSPATH=$(/path/to/hadoop/bin/hadoop classpath)

Passer un répertoire de configuration Hadoop

export SPARK_DIST_CLASSPATH=$(hadoop --config /path/to/configs classpath) 
4
zszohar stiro