web-dev-qa-db-fra.com

Comment accéder à S3 / S3n à partir d'une installation Hadoop 2.6 locale?

J'essaie de reproduire un cluster Amazon EMR sur ma machine locale. À cet effet, j'ai installé la dernière version stable de Hadoop à ce jour - 2.6. . Maintenant, je voudrais accéder à un compartiment S3, comme je le fais à l'intérieur du cluster EMR.

J'ai ajouté les informations d'identification aws dans core-site.xml:

<property>
  <name>fs.s3.awsAccessKeyId</name>
  <value>some id</value>
</property>

<property>
  <name>fs.s3n.awsAccessKeyId</name>
  <value>some id</value>
</property>

<property>
  <name>fs.s3.awsSecretAccessKey</name>
  <value>some key</value>
</property>

<property>
  <name>fs.s3n.awsSecretAccessKey</name>
  <value>some key</value>
</property>

Remarque: Comme il y a des barres obliques sur la clé, je les ai échappées avec% 2F

Si j'essaie de lister le contenu du seau:

hadoop fs -ls s3://some-url/bucket/

Je reçois cette erreur:

ls: pas de système de fichiers pour le schéma: s3

J'ai de nouveau édité core-site.xml et ajouté des informations relatives au fs:

<property>
  <name>fs.s3.impl</name>
  <value>org.Apache.hadoop.fs.s3.S3FileSystem</value>
</property>

<property>
  <name>fs.s3n.impl</name>
  <value>org.Apache.hadoop.fs.s3native.NativeS3FileSystem</value>
</property>

Cette fois, j'obtiens une erreur différente:

-ls: Fatal internal error
Java.lang.RuntimeException: Java.lang.ClassNotFoundException: Class org.Apache.hadoop.fs.s3.S3FileSystem not found
        at org.Apache.hadoop.conf.Configuration.getClass(Configuration.Java:2074)
        at org.Apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.Java:2578)
        at org.Apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.Java:2591)

D'une certaine manière, je soupçonne que la distribution Yarn n'a pas les pots nécessaires pour pouvoir lire S3, mais je ne sais pas où les obtenir. Tout pointeur dans cette direction serait grandement apprécié.

31
doublebyte

Pour une raison quelconque, le pot hadoop-aws-[version].jar qui contient l'implémentation de NativeS3FileSystem n'est pas présent dans le classpath de hadoop par défaut dans les versions 2.6 & 2.7. Essayez donc de l'ajouter au chemin de classe en ajoutant la ligne suivante dans hadoop-env.sh qui se trouve dans $HADOOP_HOME/etc/hadoop/hadoop-env.sh:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/tools/lib/*

En supposant que vous utilisez Apache Hadoop 2.6 ou 2.7

Au fait, vous pouvez vérifier le chemin de classe de Hadoop en utilisant:

bin/hadoop classpath
53
Ashrith
import os
os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.amazonaws:aws-Java-sdk:1.10.34,org.Apache.hadoop:hadoop-aws:2.6.0 pyspark-Shell'

import pyspark
sc = pyspark.SparkContext("local[*]")

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

hadoopConf = sc._jsc.hadoopConfiguration()
myAccessKey = input() 
mySecretKey = input()
hadoopConf.set("fs.s3.impl", "org.Apache.hadoop.fs.s3native.NativeS3FileSystem")
hadoopConf.set("fs.s3.awsAccessKeyId", myAccessKey)
hadoopConf.set("fs.s3.awsSecretAccessKey", mySecretKey)

df = sqlContext.read.parquet("s3://myBucket/myKey")
8
ksindi

@ La réponse d'Ashrith a fonctionné pour moi avec une modification: j'ai dû utiliser $HADOOP_PREFIX Plutôt que $HADOOP_HOME Lors de l'exécution de la v2.6 sur Ubuntu. C'est peut-être parce qu'il semble que $HADOOP_HOME Est obsolète ?

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:${HADOOP_PREFIX}/share/hadoop/tools/lib/*

Cela dit, aucun n'a fonctionné pour moi sur mon Mac avec la v2.6 installée via Homebrew. Dans ce cas, j'utilise cette exportation extrêmement maladroite:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$(brew --prefix hadoop)/libexec/share/hadoop/tools/lib/*

3
Matt K

Pour résoudre ce problème, j'ai essayé tout ce qui précède, qui a échoué (pour mon environnement de toute façon).

Cependant, j'ai pu le faire fonctionner en copiant les deux pots mentionnés ci-dessus à partir du répertoire tools et dans common/lib.

A bien fonctionné après cela.

2
null

Si vous utilisez HDP 2.x ou supérieur, vous pouvez essayer de modifier la propriété suivante dans les paramètres de configuration de MapReduce2 dans Ambari.

mapreduce.application.classpath

Ajoutez la valeur suivante à la fin de la chaîne existante:

/usr/hdp/${hdp.version}/hadoop-mapreduce/*

1