6

我有一大堆 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 作为一个也不起作用的标志。我已经读过如何明确地传递凭据不是一个好习惯,所以也许这只是一些以其他方式做的 gentil 建议?

应该如何使用 distcp 传递 S3 凭据?有谁知道?

4

3 回答 3

12

自上一版本以来,凭据标志的格式似乎发生了变化。以下命令有效:

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
于 2017-11-23T13:33:49.407 回答
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] 
于 2021-03-01T18:01:19.730 回答
0

如果有人在使用时遇到相同的错误-D hadoop.security.credential.provider.path,请确保您的凭据存储(jceks 文件)位于分布式文件系统(hdfs)中,因为 distcp 从节点管理器节点之一开始,以便它可以访问相同的。

于 2018-12-19T06:24:26.990 回答