2017-11-23 21 views
0

HDFS에 넣으려고하는 거대한 양의 S3files 버킷이 있습니다. 관련된 파일의 양을 감안할 때 필자가 선호하는 솔루션은 '분산 복사본'을 사용하는 것입니다. 그러나 어떤 이유로 든 hadoop distcp로 나의 Amazon S3 자격증을 가질 수 없습니다. 내가 사용하는 명령은 다음과 같습니다.Hadoop distcp 제공되는 AWS 인증 정보 없음

hadoop distcp -update s3a://[bucket]/[folder]/[filename] hdfs:///some/path/ -D fs.s3a.awsAccessKeyId=[keyid] -D fs.s3a.awsSecretAccessKey=[secretkey] -D fs.s3a.fast.upload=true 

그러나 '-D'인수가없는 것처럼 작동합니다.

ERROR tools.DistCp: Exception encountered 
java.io.InterruptedIOException: doesBucketExist on [bucket]: com.amazonaws.AmazonClientException: No AWS Credentials provided by BasicAWSCredentialsProvider EnvironmentVariableCredentialsProvider SharedInstanceProfileCredentialsProvider : com.amazonaws.SdkClientException: Unable to load credentials from service endpoint 

내가 hadoop distcp 문서를 살펴 봤지만 왜 이것이 작동하지 않는지에 대한 해결책을 찾을 수 없습니다. 나는 -Dfs.s3n.awsAccessKeyId를 작동하지 않는 플래그로 시도했다. 나는 명시 적으로 자격 증명을 전달하는 것이 좋은 습관이 아니라는 것을 읽었습니다. 어쩌면 이것이 다른 방법으로 할 수있는 좋은 제안 일 수 있습니까?

distcp와 함께 S3 자격 증명을 전달하는 방법은 무엇입니까? 누구?

+0

'-D' 다음에 공백을 사용하지 말아야하지만 명령 줄을 통해 공백을 전달해서는 안됩니다. core-site.xml에있는 것이거나 환경 변수로 정의 된 이유는 무엇입니까? –

답변

1

자격 증명 플래그의 형식이 이전 버전 이후 변경된 것으로 보입니다. 다음 명령어가 작동합니다 :

hadoop distcp \ 
    -Dfs.s3a.access.key=[accesskey] \ 
    -Dfs.s3a.secret.key=[secretkey] \ 
    -Dfs.s3a.fast.upload=true \ 
    -update \ 
    s3a://[bucket]/[folder]/[filename] hdfs:///some/path 
+0

형식이란 무엇입니까? '-D'는 표준 Java 플래그이고 공백은 별도의 인수로 사용됩니다. –

+1

-D 플래그를 신경 쓰지 마십시오. 잘못된 설명서 사이트에서 가져온 것이므로 분명히 빨간 청어였습니다. 이전 플래그의 형식은 Dfs.s3n.awsAccessKeyId 및 Dfs.s3n.awsSecretAccessKey입니다. 지금은 Dfs.s3a.access.key 및 Dfs.s3a.secret.key입니다. –