我正在尝试使用distcp
将数据从HDFS移动到S3。 distcp
作业似乎成功,但在S3上,文件未正确创建。有两个问题:
block_<some number>
在存储桶的根目录。我找不到任何文档/示例。我错过了什么?我怎么调试?
以下是一些更多细节:
$ hadoop version
Hadoop 0.20.2-cdh3u0
Subversion -r
Compiled by diego on Sun May 1 15:42:11 PDT 2011
From source with checksum
hadoop fs –ls hdfs://hadoopmaster/data/paramesh/
…<bunch of files>…
hadoop distcp hdfs://hadoopmaster/data/paramesh/ s3://<id>:<key>@paramesh-test/
$ ./s3cmd-1.1.0-beta3/s3cmd ls s3://paramesh-test
DIR s3://paramesh-test//
DIR s3://paramesh-test/test/
2012-05-10 02:20 0 s3://paramesh-test/block_-1067032400066050484
2012-05-10 02:20 8953 s3://paramesh-test/block_-183772151151054731
2012-05-10 02:20 11209 s3://paramesh-test/block_-2049242382445148749
2012-05-10 01:40 1916 s3://paramesh-test/block_-5404926129840434651
2012-05-10 01:40 8953 s3://paramesh-test/block_-6515202635859543492
2012-05-10 02:20 48051 s3://paramesh-test/block_1132982570595970987
2012-05-10 01:40 48052 s3://paramesh-test/block_3632190765594848890
2012-05-10 02:20 1160 s3://paramesh-test/block_363439138801598558
2012-05-10 01:40 1160 s3://paramesh-test/block_3786390805575657892
2012-05-10 01:40 11876 s3://paramesh-test/block_4393980661686993969
答案 0 :(得分:15)
您应该使用s3n而不是s3。
s3n是本机文件系统实现(即 - 常规文件),使用s3对文件强制执行hdfs块结构,因此如果不通过hdfs库就无法真正读取它们。
因此:
hadoop distcp hdfs://file/1 s3n://bucket/destination
答案 1 :(得分:3)
亚马逊创建了一个distcp版本,该版本针对hdfs和s3之间的传输进行了优化,他们称之为s3distcp。您可能也想检查一下。它适用于Amazon EMR,但jar在s3中可用,因此您可以在EMR作业流程之外使用它。
http://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html
答案 2 :(得分:3)
如果您的HDFS文件大于5GB,您将在distcp作业中遇到如下错误:
Caused by: org.jets3t.service.S3ServiceException: S3 Error Message. -- ResponseCode: 400, ResponseStatus: Bad Request, XML Error Message: <?xml version="1.0" encoding="UTF-8"?><Error><Code>EntityTooLarge</Code><Message>Your proposed upload exceeds the maximum allowed size</Message><ProposedSize>23472570134</ProposedSize><MaxSizeAllowed>5368709120</MaxSizeAllowed><RequestId>5BDA6B12B9E99CE9</RequestId><HostId>vmWvS3Ynp35bpIi7IjB7mv1waJSBu5gfrqF9U2JzUYsXg0L7/sy42liEO4m0+lh8V6CqU7PU2uo=</HostId></Error> at org.jets3t.service.S3Service.putObject(S3Service.java:2267) at org.apache.hadoop.fs.s3native.Jets3tNativeFileSystemStore.storeFile(Jets3tNativeFileSystemStore.java:122) ... 27 more Container killed by the ApplicationMaster. Container killed on request. Exit code is 143 Container exited with a non-zero exit code 143
要解决此问题,请使用s3n
文件系统作为@matthew-rathbone建议,但使用-Dfs.s3n.multipart.uploads.enabled=true
表示:
hadoop distcp -Dfs.s3n.multipart.uploads.enabled=true hdfs://file/1 s3n://bucket/destination
OR
使用&#34;下一代&#34; s3文件系统,s3a
喜欢:
hadoop distcp -Dfs.s3a.endpoint=apigateway.us-east-1.amazonaws.com hdfs://file/1 s3a://bucket/destination
这些实时的选项和文档:https://hadoop.apache.org/docs/stable/hadoop-aws/tools/hadoop-aws/index.html
答案 3 :(得分:2)
为Apache Hadoop 2.7+更新此内容,并忽略Amazon EMR,因为他们已在那里更改了内容。
提高与对象存储一起工作的distcp可靠性和性能仍然是一项持续的工作......一如既往地欢迎贡献。
答案 4 :(得分:0)
试试这个solution。至少它对我有用。 (我用30Gb文件移动了dir。)