Hadoop distcp未提供AWS凭据

Hadoop distcp未提供AWS凭据,hadoop,amazon-s3,distcp,s3distcp,Hadoop,Amazon S3,Distcp,S3distcp,我有一大堆S3文件,我想放在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]

我有一大堆S3文件,我想放在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凭据?有人知道吗?

自上一版本以来,凭据标志的格式似乎已更改。以下命令起作用:

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

如果有人使用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] 

不应在
-D
之后使用空格,但也不应通过命令行传递空格。为什么那些不在您的core-site.xml中,或者不被定义为环境变量?这种格式是什么意思
-D
是一个标准的Java标志,空格被当作单独的参数。不管是-D标志,我是从一些糟糕的文档站点上得到的,这显然是一个误导。旧标志的格式为Dfs.s3n.awsAccessKeyId和Dfs.s3n.awsSecretAccessKey。显然现在是Dfs.s3a.access.key和Dfs.s3a.secret.key