从HDFS到Amazon S3的Hadoop distcp问题

时间:2012-05-10 06:26:30

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

我正在尝试使用distcp将数据从HDFS移动到S3。 distcp作业似乎成功,但在S3上,文件未正确创建。有两个问题:

  1. 不复制文件名和路径。所有文件最后都是block_<some number>在存储桶的根目录。
  2. 它在S3上创建了大量额外文件,包含一些元数据和日志。
  3. 我找不到任何文档/示例。我错过了什么?我怎么调试?

    以下是一些更多细节:

    $ 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
    

5 个答案:

答案 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,因为他们已在那里更改了内容。

  1. 如果您使用的是Hadoop 2.7或更高版本,请使用s3a而不是s3n。这也适用于最新版本的HDP和AFAIK,CDH。
  2. 这支持5 + GB文件,具有其他不错的功能等。阅读文件时效果更好 - 并且只会随着时间的推移而变得更好。
  3. Apache s3://应被视为已弃用 - 您不再需要它,也不应该使用它。
  4. Amazon EMR使用“s3://”来引用自己的,自定义的,绑定到S3。如果你在EMR上运行,那就是你应该使用的。
  5. 提高与对象存储一起工作的distcp可靠性和性能仍然是一项持续的工作......一如既往地欢迎贡献。

答案 4 :(得分:0)

试试这个solution。至少它对我有用。 (我用30Gb文件移动了dir。)