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>
/usr/local/hadoop/share/hadoop/tools/lib/
dossierspark-defaults.conf
- uniquement ce qui a été envoyé en ligne de commandeLes 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?
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
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)