我发现了类似的问题,但没有一个回答我的问题:在使用hadoop distcp或s3-dist-cp在Hadoop和S3之间移动文件时,我应该在哪里存储凭据?
我创建了一个新的Amazon EMR集群,现在我想从S3存储桶中复制文件。以下方法不起作用:
hadoop distcp
我在网址中对凭据进行了编码:hadoop distcp s3n://<awsaccesskey>:<awssecrectkey>@<backetname>/path hdfs://<path>
但似乎软件无法处理包含+
或/
的aws密钥,这种情况经常发生。使用url encode对密钥进行编码不起作用,但会产生另一个错误,如:java.lang.IllegalArgumentException:不得将存储桶名称格式化为IP地址
或
java.lang.IllegalArgumentException:存储桶名称不应包含大写字符
如果凭据包含特殊字符,我如何对凭据进行编码或在何处存储凭据?我也尝试了ENV变量(例如AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY)但没有成功。一些教程提到core-site.xml
文件,但没有位置。所以我搜索了它并且有多个匹配。教程说,将这些文件复制到所有节点是必须的,但为什么呢?
答案 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>