我有一大堆S3files,我想放在HDFS上。鉴于涉及的文件数量,我首选的解决方案是使用“分布式副本”。但是出于某种原因,我无法使用hadoop distcp来获取我的Amazon S3凭据。我使用的命令是:
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 :(得分:4)
自上一版本以来,凭证标志的格式似乎已更改。以下命令有效:
def bprop(self, inputs, outputs, grads_wrt_outputs):
m,n = grads_wrt_outputs.shape[:2]
o = inputs.shape[2]
p = inputs.shape[3]
return (self.mask.reshape(m,n,2,2,2,2)*grads_wrt_outputs[:,:,:,None,:,None]).reshape(m,n,o,p)
答案 1 :(得分:0)
如果使用-D hadoop.security.credential.provider.path
导致某些错误,请确保您的凭据存储(jceks文件)位于分布式文件系统(hdfs)中,因为distcp从节点管理器节点之一启动,因此它可以访问相同的内容。
答案 2 :(得分:0)
Koen 的回答对我有帮助,这是我的版本。
hadoop distcp \
-Dfs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider \
-Dfs.s3a.access.key=[accesskey] \
-Dfs.s3a.secret.key=[secretkey] \
-Dfs.s3a.session.token=[sessiontoken] \
-Dfs.s3a.fast.upload=true \
hdfs:///some/path s3a://[bucket]/[folder]/[filename]