来自S3的Hadoop distcp副本:签名与错误不匹配

时间:2013-08-05 16:02:02

标签: hadoop amazon-web-services amazon-s3 hdfs

我正在尝试将文件从S3复制到我在Amazon EC2上的hadoop HDFS。

我使用的命令是:

bin/hadoop distcp s3://<awsAccessKeyId>:<awsSecretAccessKey>@<bucket_name>/f1 hdfs://user/root/
  • f1是文件的名称
  • 我也将它改为s3n,看它是否有效,但事实并非如此。
  • 我用%2F
  • 替换了我的秘密访问密钥中的正斜杠

我得到的错误是:SignatureDoesNotMatch

org.jets3t.service.S3ServiceException: S3 GET failed for '/%2Ff1'

<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>

<StringToSignBytes>...</StringToSignBytes>

<RequestId>...</RequestId>

<HostId>..</HostId>

<SignatureProvided>NsefW5en6P728cc9llkFIk6yGc4=\
    </SignatureProvided>

<StringToSign>GETMon, 05 Aug 2013 15:28:21 GMT/<bucket_name>/%2Ff1</StringToSign>

<AWSAccessKeyId><MY_ACCESS_ID><\ /AWSAccessKeyId></Error>

我只有一个AWS访问密钥ID和密钥。我检查了我的AWS账户,他们是一样的。我使用相同的AWS Access Key和密钥登录我的EC2集群。我也尝试过使用core-site.xml,但这也没有帮助。

谢谢, 拉吉夫

2 个答案:

答案 0 :(得分:1)

重新生成我的AWS Key和Secret,以便我的秘密中没有正斜杠为我工作。 参考:https://issues.apache.org/jira/browse/HADOOP-3733

答案 1 :(得分:1)

重新生成对我有用的密钥的另一种方法是在运行distcp时使用-Dfs.s3n.awsAccessKeyId = -Dfs.s3n.awsSecretKccess = flags。

实施例: hadoop distcp -Dfs.s3n.awsAccessKeyId = -Dfs.s3n.awsSecretAccessKey = s3n:// path / to / log / dir hdfs:// hdfs-node:8020 / logs /

请注意使用s3n,其文件限制为5GB:Difference between Amazon S3 and S3n in Hadoop

编辑:不要对秘密访问密钥进行url编码,因此斜杠&#34; /&#34;和加号&#34; +&#34;应该按原样通过!