web-dev-qa-db-fra.com

Comment accéder aux fichiers s3a: // d'Apache Spark?

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?

46
tribbloid

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:

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

  2. 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é.

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

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

44
cfeduke

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
    

dans 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

16
mrsrinivas

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.

13
ChromeHearts

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.

9
Kyle Burke

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

  • Le correcteur de sortie directe est parti de Spark 2.0 en raison du risque/de l’expérience de corruption des données.
  • Certains paramètres du FileOutputCommitter permettent de réduire le nombre de renommage, mais de ne pas les éliminer.
  • Je travaille avec des collègues pour faire un O(1), en s’appuyant sur Apache Dynamo pour nous donner la cohérence dont nous avons besoin.
  • Pour utiliser S3a, procurez-vous le bon chemin de classes.
  • Et soyez sur Hadoop 2.7.z; 2.6.x avait quelques problèmes qui avaient été résolus à ce moment-là HADOOP-11571 .
  • Sous SPARK-7481, il existe un RP pour tout mettre dans une distro spark que vous construisez vous-même. Sinon, demandez à celui qui fournit les binaires de faire le travail.
  • Hadoop 2.8 va ajouter des améliorations majeures à la performance HADOOP-11694 .

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.

7
Steve Loughran

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.

4
richvt2k

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

4
chutium

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

3
Sam Malayek

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
2
raul ferreira