Hadoop 2.6 ne prend pas en charge s3a, alors j'ai essayé une série de solutions et de correctifs, notamment:
deploy avec hadoop-aws et aws-Java-sdk => impossible de lire la variable d'environnement pour les informations d'identification ajouter hadoop-aws dans maven => divers conflits de dépendance transitive
Quelqu'un at-il réussi à faire les deux travail?
Après avoir constaté en pratique que la différence entre s3a et s3n - 7,9 Go de données transférées sur s3a était d’environ 7 minutes, alors que 7,9 Go de données sur s3n prenaient 73 minutes [us-est-1 à us-ouest-1 malheureusement dans les deux cas; Redshift et Lambda étant us-east-1 à l’heure actuelle], c’est un élément très important de la pile pour bien faire les choses et cela en vaut la peine.
Voici les éléments clés, à compter de décembre 2015:
Votre cluster Spark nécessite une version 2.x ou supérieure de Hadoop. Si vous utilisez les scripts de configuration Spark EC2 et que vous l’avez peut-être manquée, le commutateur permettant autre que 1.0 est à spécifier --hadoop-major-version 2
(qui utilise CDH 4.2 à ce jour).
Vous devrez inclure ce qui peut sembler être une bibliothèque SDK AWS obsolète (construite en 2014 sous la version 1.7.4) pour les versions de Hadoop à la version 2.7.1 (stable): aws-Java-sdk 1.7 .4. Autant que je sache, l’utilisation de cette option avec les fichiers JAR AWS SDK spécifiques pour 1.10.8 n’a rien de cassé.
Vous aurez également besoin du fichier JAR hadoop-aws 2.7.1 sur le chemin de classe. Ce fichier JAR contient la classe org.Apache.hadoop.fs.s3a.S3AFileSystem
.
Dans spark.properties
vous voulez probablement des réglages qui ressemblent à ceci:
spark.hadoop.fs.s3a.impl=org.Apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.access.key=ACCESSKEY
spark.hadoop.fs.s3a.secret.key=SECRETKEY
J'ai détaillé cette liste plus en détail sur un message que j'ai écrit au fur et à mesure que je progressais dans ce processus. En outre, j'ai couvert tous les cas d'exception que j'ai rencontrés en cours de route et ce que je pense être la cause de chacun et la façon de les résoudre.
J'écris cette réponse pour accéder aux fichiers avec S3A à partir de Spark 2.0.1 sur Hadoop 2.7.
Copiez les fichiers AWS (hadoop-aws-2.7.3.jar
et aws-Java-sdk-1.7.4.jar
) fourni par défaut avec Hadoop
Indice: Si l'emplacement des pots est incertain? exécuter la commande find en tant qu'utilisateur privilégié peut être utile, les commandes peuvent être ..
find / -name hadoop-aws*.jar
find / -name aws-Java-sdk*.jar
into spark classpath qui contient tous les spark jars
Indice: Nous ne pouvons pas indiquer directement l'emplacement (il doit être dans le fichier de propriétés) car je souhaite donner une réponse générique aux distributions et aux types de Linux. spark classpath peut être identifié par la commande find ci-dessous
find / -name spark-core*.jar
spark-defaults.conf
Indice: (La plupart du temps, il sera placé dans /etc/spark/conf/spark-defaults.conf
)
#make sure jars are added to CLASSPATH
spark.yarn.jars=file://{spark/home/dir}/jars/*.jar,file://{hadoop/install/dir}/share/hadoop/tools/lib/*.jar
spark.hadoop.fs.s3a.impl=org.Apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.access.key={s3a.access.key}
spark.hadoop.fs.s3a.secret.key={s3a.secret.key}
#you can set above 3 properties in hadoop level `core-site.xml` as well by removing spark prefix.
in spark submit inclure des bocaux (aws-Java-sdk
et hadoop-aws
) dans --driver-class-path
si besoin.
spark-submit --master yarn \
--driver-class-path {spark/jars/home/dir}/aws-Java-sdk-1.7.4.jar \
--driver-class-path {spark/jars/home/dir}/hadoop-aws-2.7.3.jar \
other options
Note:
Assurez-vous que l'utilisateur Linux disposant des privilèges de lecture, avant d'exécuter la commande
find
, évite les erreurs . Autorisation refusée
Je l’ai obtenu en utilisant le Spark 1.4.1 binaire pré-construit avec hadoop 2.6. Assurez-vous de définir les deux spark.driver.extraClassPath
et spark.executor.extraClassPath
pointant vers les deux fichiers jar (hadoop-aws et aws-Java-sdk) Si vous exécutez sur un cluster, assurez-vous que vos exécuteurs ont accès aux fichiers jar du cluster.
Nous utilisons spark 1.6.1 avec Mesos et nous avons eu beaucoup de problèmes en écrivant sur S3 à partir de spark. Je remercie Céduke pour la réponse. Le léger changement que j’ai apporté consiste à ajouter des coordonnées maven Pour configurer spark.jar dans le fichier spark-defaults.conf, j’ai essayé avec hadoop-aws: 2.7.2 mais je continuais à avoir beaucoup d’erreurs, nous sommes donc revenus à la version 2.7.1. conf qui travaillent pour nous:
spark.jars.packages net.Java.dev.jets3t:jets3t:0.9.0,com.google.guava:guava:16.0.1,com.amazonaws:aws-Java-sdk:1.7.4,org.Apache.hadoop:hadoop-aws:2.7.1
spark.hadoop.fs.s3a.impl org.Apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.access.key <MY ACCESS KEY>
spark.hadoop.fs.s3a.secret.key <MY SECRET KEY>
spark.hadoop.fs.s3a.fast.upload true
Merci cfeduke d'avoir pris le temps de rédiger ton message. C'était très utile.
Voici les détails d'octobre 2016, tels qu'ils sont présentés à l'adresse Spark Summit EU: Apache Spark et magasins d'objets .
Points clés
Placement de produit: le côté performance de lecture du HADOOP-11694 est inclus dans HDP2.5; Les documentation Spark et S pourraient présenter un intérêt, en particulier les options de réglage.
Avec Spark 1.4.1 pré-construit avec Hadoop 2.6, je peux faire en sorte que s3a: // fonctionne lors du déploiement sur un cluster Spark autonome en ajoutant les fichiers jar hadoop-aws et aws-Java-sdk de la distribution Hadoop 2.7.1 (situés sous $ HADOOP_HOME/share/hadoop/tools/lib de Hadoop 2.7.1) dans ma variable d'environnement SPARK_CLASSPATH dans mon répertoire $ SPARK_HOME/conf/fichier spark-env.sh.
comme vous l'avez dit, Hadoop 2.6 ne prend pas en charge s3a, et le dernier spark, la version 1.6.1 ne prend pas en charge Hadoop 2.7, mais spark 2.0 n'est certainement pas problème avec hadoop 2.7 et s3a.
for spark 1.6.x, nous avons fait du sale tour, avec le pilote s3 de EMR ... vous pouvez jeter un oeil à cette doc: https://github.com/ zalando/spark-appliance # emrfs-support
si vous voulez toujours essayer d'utiliser s3a dans spark 1.6.x, reportez-vous à la réponse ci-dessous: https://stackoverflow.com/a/37487407/5630352
Vous pouvez également ajouter les dépendances S3A au chemin de classe en utilisant spark-defaults.conf
.
Exemple:
spark.driver.extraClassPath /usr/local/spark/jars/hadoop-aws-2.7.5.jar
spark.executor.extraClassPath /usr/local/spark/jars/hadoop-aws-2.7.5.jar
spark.driver.extraClassPath /usr/local/spark/jars/aws-Java-sdk-1.7.4.jar
spark.executor.extraClassPath /usr/local/spark/jars/aws-Java-sdk-1.7.4.jar
Ou juste:
spark.jars /usr/local/spark/jars/hadoop-aws-2.7.5.jar,/usr/local/spark/jars/aws-Java-sdk-1.7.4.jar
Assurez-vous simplement de faire correspondre votre version du kit SDK AWS à la version de Hadoop. Pour plus d'informations à ce sujet, consultez la réponse suivante: Impossible d'accéder aux données S3 avec Spark 2.2
Voici une solution pour pyspark (éventuellement avec proxy):
def _configure_s3_protocol(spark, proxy=props["proxy"]["Host"], port=props["proxy"]["port"], endpoint=props["s3endpoint"]["irland"]):
"""
Configure access to the protocol s3
https://sparkour.urizone.net/recipes/using-s3/
AWS Regions and Endpoints
https://docs.aws.Amazon.com/general/latest/gr/rande.html
"""
sc = spark.sparkContext
sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.Apache.hadoop.fs.s3a.S3AFileSystem")
sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", os.environ.get("AWS_ACCESS_KEY_ID"))
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", os.environ.get("AWS_SECRET_ACCESS_KEY"))
sc._jsc.hadoopConfiguration().set("fs.s3a.proxy.Host", proxy)
sc._jsc.hadoopConfiguration().set("fs.s3a.proxy.port", port)
sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", endpoint)
return spark