2015-01-19 13 views
24

Sto cercando di riprodurre un cluster Amazon EMR sul mio computer locale. A tal fine, ho installato il latest stable version of Hadoop as of now - 2.6.0. Ora vorrei accedere a un bucket S3, come faccio nel cluster EMR.Come posso accedere a S3/S3n da un'installazione Hadoop 2.6 locale?

ho aggiunto le credenziali AWS in 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> 

Nota: Dal momento che ci sono alcuni tagli sulla chiave, li ho fuggito con% 2F

Se io cerco di elencare il contenuto del secchio:

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

ottengo questo errore:

01.235.164,106174 millions

ls: No filesystem per schema: s3

ho modificato core-site.xml di nuovo, e ha aggiunto informazioni relative ai 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> 

Questa volta ottengo un errore diverso:

In qualche modo sospetto che la distribuzione del filato non abbia i vasi necessari per poter leggere S3, ma non ho idea di dove trovarli. Qualsiasi suggerimento in questa direzione sarebbe molto apprezzato.

risposta

44

Per qualche ragione, il vaso hadoop-aws-[version].jar che contiene l'implementazione di NativeS3FileSystem non è presente nel classpath di hadoop di default nella versione 2.6 & 2.7. Quindi, cercare e aggiungerlo al classpath aggiungendo la seguente riga nel hadoop-env.sh che si trova nella $HADOOP_HOME/etc/hadoop/hadoop-env.sh:

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

Assuming you are using Apache Hadoop 2.6 or 2.7

A proposito, si potrebbe verificare il classpath di Hadoop utilizzando:

bin/hadoop classpath 
+3

Grazie per la risposta: questo è stato davvero il problema, e spero che aiuti gli utenti successivi che affrontano lo stesso problema. Lasciatemi correggere l'esportazione, aggiungendo il percorso $ HADOOP_HOME, prima del percorso della libreria: export 'HADOOP_CLASSPATH = $ HADOOP_CLASSPATH: $ HADOOP_HOME/share/hadoop/tools/lib/*' – doublebyte

3

@ La risposta di Ashrith ha funzionato per me con una modifica: ho dovuto utilizzare $HADOOP_PREFIX anziché $HADOOP_HOME quando eseguo v2.6 su Ubuntu. Forse perché sembra che $HADOOP_HOME sia deprecated?

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

Detto questo, nessuno ha lavorato per me sul mio Mac con v2.6 installato tramite Homebrew. In tal caso, sto usando questa esportazione estremamente cludgy:

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

1

Se si utilizza HDP 2.x o superiore si può provare a modificare la seguente proprietà nelle impostazioni di configurazione MapReduce2 in Ambari.

mapreduce.application.classpath

Aggiungere il seguente valore alla fine della stringa esistente:

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

2

Per risolvere questo problema ho provato tutte le sopra, che ha fallito (comunque per il mio ambiente).

Tuttavia, sono riuscito a farlo funzionare copiando i due jar menzionati sopra dalla directory tools e in common/lib.

Ha funzionato bene dopo.

5
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") 
+0

l'elenco dei pacchetti funziona per me. '--packages com.amazonaws: aws-java-sdk: 1.10.34, org.apache.hadoop: hadoop-aws: 2.6.0'. mentre 'HADOOP_CLASSPATH' no – d2207197