将文件从Amazon s3复制到hadoop

时间:2016-04-10 09:52:49

标签: hadoop amazon-s3

我发现了类似的问题,但没有一个回答我的问题:在使用hadoop distcp或s​​3-dist-cp在Hadoop和S3之间移动文件时,我应该在哪里存储凭据?

我创建了一个新的Amazon EMR集群,现在我想从S3存储桶中复制文件。以下方法不起作用:

  1. 使用hadoop distcp 我在网址中对凭据进行了编码:hadoop distcp s3n://<awsaccesskey>:<awssecrectkey>@<backetname>/path hdfs://<path>但似乎软件无法处理包含+/的aws密钥,这种情况经常发生。使用url encode对密钥进行编码不起作用,但会产生另一个错误,如:
  2.   

    java.lang.IllegalArgumentException:不得将存储桶名称格式化为IP地址

      

    java.lang.IllegalArgumentException:存储桶名称不应包含大写字符

    1. 使用s3-dist-cp 所以我用了#34;更好的&#34;方法,但结果相同。
    2. 如果凭据包含特殊字符,我如何对凭据进行编码或在何处存储凭据?我也尝试了ENV变量(例如AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY)但没有成功。一些教程提到core-site.xml文件,但没有位置。所以我搜索了它并且有多个匹配。教程说,将这些文件复制到所有节点是必须的,但为什么呢?

2 个答案:

答案 0 :(得分:0)

您是否尝试使用特殊字符对密钥进行URL编码?

答案 1 :(得分:0)

尝试以下方法:

AWS_ACCESS_KEY_ID=<awsaccesskey>
AWS_SECRET_ACCESS_KEY=<awssecrectkey>
hadoop distcp -Dfs.s3a.access.key="${AWS_ACCESS_KEY_ID}" -Dfs.s3a.secret.key="${AWS_SECRET_ACCESS_KEY}" s3a://<bucketname>/<path> <hdfs_path>