我有一个我想放在HDFS上的巨大的S3files。鉴于涉及的文件量我首选的解决方案是使用"分布式副本"。但是,由于某种原因,我无法获得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凭据?有人知道吗?
以来,凭据标志的格式自上一个版本以来已更改。以下命令有效:
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
如果某人使用-D hadoop.security.credential.provider.path
出现相同错误的情况,请确保您的凭据存储(JCEKS文件)位于分布式文件系统(HDFS)中,因为DISTCP启动了一个节点之一经理节点可以访问相同的节点。
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]