2015-01-19 2 views
24

로컬 컴퓨터에서 Amazon EMR 클러스터를 재현하려고합니다. 이를 위해 latest stable version of Hadoop as of now - 2.6.0을 설치했습니다. 이제 EMR 클러스터 내부에서 수행하는 것처럼 S3 버킷에 액세스하고 싶습니다.로컬 Hadoop 2.6 설치에서 S3/S3n에 어떻게 액세스합니까?

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

참고 :

나는 코어를 site.xml의 AWS 자격 증명을 추가 한 키에 일부 슬래시가 있기 때문에, 나는 %의 2 층

내가 만약 그들을 탈출 버킷의 내용을 나열 해보십시오

:

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

나는이 오류

LS : 계획 없음 파일 시스템 : S3 나는 FS 관련 정보를 다시 코어 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

, NativeS3FileSystem의 구현을 포함하는 JAR hadoop-aws-[version].jar는 버전 2.6 & 2.7 기본적 하둡의 classpath 존재하지 않는다. 그래서 시도하고 $HADOOP_HOME/etc/hadoop/hadoop-env.sh에 위치한 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

을, 당신은 사용 하둡의 클래스 경로를 확인할 수 있습니다 :

bin/hadoop classpath 
+3

답변 주셔서 감사합니다. 그게 실제로 문제 였고, 후속 사용자가 동일한 문제에 직면 할 수 있기를 바랍니다. 'HADOOP_HASP_HOME/share/hadoop/tools/lib/*' – doublebyte

3

@ Ashrith의 답변이 한 가지 수정으로 저에게 효과적이었습니다. 우분투에서 v2.6을 실행할 때 $HADOOP_HOME이 아닌 $HADOOP_PREFIX을 사용해야했습니다. 아마도 $HADOOP_HOMEdeprecated 인 것 같기 때문일 수 있습니다.

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

는 말했다 아니하며 브루 통해 설치 V2.6 내 Mac에서 나를 위해 일한 데. 이 경우, 나는이 매우 cludgy 수출을 사용하고 있습니다 :

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

1

당신이 HDP 2.x 또는 당신이 Ambari에서 MapReduce2 구성 설정에 다음과 같은 속성을 수정 시도 할 수 이상을 사용하는 경우.

mapreduce.application.

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

2

내가 모든 노력이 문제를 해결하려면 : 클래스 경로

는 기존 문자열의 끝에 다음 값을 추가 위의, 어떤 실패 (내 환경 어쨌든).

그러나 나는 위에서 언급 한 두 개의 jar를 도구 디렉토리에서 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

패키지 목록이 나에게 적합합니다. $ HADOOP_HOME 경로를 라이브러리 경로 앞에 추가하여 내보내기를 수정하십시오 : export HADOOP_CLASSPATH = $ HADOOP_CLASSPATH : $ HADOOP_HOME/share/hadoop/tools/lib/* --packages com.amazonaws : aws-java-sdk : 1.10.34, org.apache.hadoop : hadoop-aws : 2.6.0'. 'HADOOP_CLASSPATH'는 그렇지 않습니다. – d2207197