2015-01-19 3 views
24

Я пытаюсь воспроизвести кластер Amazon EMR на моей локальной машине. Для этой цели я установил latest stable version of Hadoop as of now - 2.6.0. Теперь я хотел бы получить доступ к ведро S3, как и в кластере EMR.Как я могу получить доступ к S3/S3n из локальной установки Hadoop 2.6?

Я добавил AWS учетные данные в ядро-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> 

Примечание: Поскольку некоторые косые на ключ, я бежал их с% 2F

If I Попробуем перечислить содержимое ведра:

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

Я получаю эту ошибку:

лс Нет FileSystem для схемы: s3

я снова отредактирован ядро-site.xml, и добавил информацию, относящуюся к фс:

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

На этот раз я получаю другую ошибку:

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

Как-то я подозреваю, что в распределении пряжи нет необходимых банок, чтобы читать S3, но я понятия не имею, где их получить. Любые указатели в этом направлении были бы весьма признательны.

ответ

44

По некоторым причинам, банка hadoop-aws-[version].jar, который содержит реализацию для NativeS3FileSystem нет в classpath из Hadoop по умолчанию в версии 2.6 & 2.7. Итак, попробуйте и добавьте его путь к классам, добавив следующую строку в hadoop-env.sh, который расположен в $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

Кстати, вы можете проверить путь к классам Hadoop с помощью:

bin/hadoop classpath 
+3

Спасибо за ответ: это действительно проблема, и я надеюсь, что это поможет последующим пользователям столкнуться с одной и той же проблемой. Позвольте мне исправить ваш экспорт, добавив путь $ HADOOP_HOME до пути к библиотеке: export 'HADOOP_CLASSPATH = $ HADOOP_CLASSPATH: $ HADOOP_HOME/share/hadoop/tools/lib/*' – doublebyte

3

@ Ответ Ашрита работал для меня с одной модификацией: мне пришлось использовать $HADOOP_PREFIX, а не $HADOOP_HOME при запуске v2.6 на Ubuntu. Возможно, это потому, что это звучит так: $HADOOP_HOME is deprecated?

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

не Сказав, что ни работал для меня на моем Mac с v2.6 установленной с помощью Homebrew. В этом случае, я использую этот чрезвычайно cludgy экспорт:

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

1

Если вы используете HDP 2.x или больше, вы можете попробовать модифицировать следующее свойство в параметрах конфигурации MapReduce2 в Ambari.

mapreduce.приложение.Путь к классам

Append следующее значение к концу существующей строки:

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

2

Чтобы решить эту проблему, я попробовал все выше, что не удалось (для моей среды в любом случае).

Однако я смог заставить его работать, скопировав два упомянутых выше баночки из инструментов dir и в common/lib.

Работал хорошо после этого.

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

список пакетов работает для меня. '--пакеты com.amazonaws: aws-java-sdk: 1.10.34, org.apache.hadoop: hadoop-aws: 2.6.0'. в то время как 'HADOOP_CLASSPATH' не – d2207197