9

我正在尝试使用distcp. 这项distcp工作似乎成功了,但在 S3 上没有正确创建文件。有两个问题:

  1. 不会复制文件名和路径。所有文件最终都block_<some number>位于存储桶的根目录。
  2. 它在 S3 上创建了一堆带有一些元数据和日志的额外文件。

我找不到任何文档/示例。我错过了什么?我该如何调试?

以下是更多细节:

$ 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/
…&lt;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
4

4 回答 4

15

您应该使用 s3n 而不是 s3。

s3n 是本机文件系统实现(即常规文件),使用 s3 对文件施加 hdfs 块结构,因此如果不通过 h​​dfs 库就无法真正阅读它们。

因此:

hadoop distcp hdfs://file/1 s3n://bucket/destination
于 2012-05-10T23:19:14.117 回答
3

Amazon 创建了一个 distcp 版本,该版本针对 hdfs 和 s3 之间的传输进行了优化,他们恰当地称为 s3distcp。您可能也想检查一下。它旨在与 Amazon EMR 一起使用,但 jar 在 s3 中可用,因此您可以在 EMR 作业流之外使用它。

http://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html

于 2012-05-25T06:34:20.877 回答
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

或者

使用“下一代”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

于 2016-02-22T20:30:07.723 回答
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 上运行,这就是您应该使用的。

提高使用对象存储的 distcp 可靠性和性能仍然是一项正在进行的工作......一如既往地欢迎贡献。

于 2016-09-02T12:50:26.450 回答