Hadoop distcp 未提供 AWS 凭证

Hadoop distcp No AWS Credentials provided

我有一大桶 S3 文件要放在 HDFS 上。考虑到涉及的文件数量,我的首选解决方案是使用 'distributed copy'。但是由于某种原因,我无法让 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 作为一个标志,但也没有用。我读过明确传递凭据不是一个好习惯,所以也许这只是一些用其他方式做的 gentil 建议?

如何使用 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]