使用hadoop distcp将数据复制到s3块文件系统:指定的复制源大于复制源的最大允许大小

时间:2013-11-29 12:43:36

标签: hadoop amazon-s3

我正在尝试使用hadoop的distcp将数据从HDFS复制到S3(而不是S3N)。我的理解是使用s3://协议,Hadoop会将各个块存储在S3上,每个S3'文件'实际上都是HDFS块。

在Amazon EMR上运行的Hadoop版本为2.2.0。

但是,尝试执行简单的distcp,我收到以下错误:

Caused by: Status Code: 400, AWS Service: Amazon S3, AWS Request ID: 71C64ECE79FCC244, AWS Error Code: InvalidRequest, AWS Error Message: The specified copy source is larger than the maximum allowable size for a copy source: 5368709120, S3 Extended Request ID: uAnvxtrNolvs0qm6htIrKjpD0VFxzjqgIeN9RtGFmXflUHDcSqwnZGZgWt5PwoTy
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:619)
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:317)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:170)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:2943)
    at com.amazonaws.services.s3.AmazonS3Client.copyObject(AmazonS3Client.java:1235)
    at org.apache.hadoop.fs.s3native.Jets3tNativeFileSystemStore.copy(Jets3tNativeFileSystemStore.java:277)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:186)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
    at org.apache.hadoop.fs.s3native.$Proxy11.copy(Unknown Source)
    at org.apache.hadoop.fs.s3native.NativeS3FileSystem.rename(NativeS3FileSystem.java:1217)
    at org.apache.hadoop.tools.mapred.RetriableFileCopyCommand.promoteTmpToTarget(RetriableFileCopyCommand.java:161)
    at org.apache.hadoop.tools.mapred.RetriableFileCopyCommand.doCopy(RetriableFileCopyCommand.java:110)
    at org.apache.hadoop.tools.mapred.RetriableFileCopyCommand.doExecute(RetriableFileCopyCommand.java:83)
    at org.apache.hadoop.tools.util.RetriableCommand.execute(RetriableCommand.java:87)

我的部分源文件大于5GB。看看这个错误,似乎distcp试图盲目地将文件从HDFS复制到S3,好像它正在使用S3 Native文件系统。由于文件大于5GB,因此失败,因为S3不支持put请求> 5GB。

为什么会这样?我原以为distcp会尝试将各个块放到S3上,而这些块应该只有64MB(我的HDFS块大小)。

2 个答案:

答案 0 :(得分:0)

以下是来自wiki的示例:http://wiki.apache.org/hadoop/AmazonS3

% ${HADOOP_HOME}/bin/hadoop distcp hdfs://domU-12-31-33-00-02-DF:9001/user/nutch/0070206153839-1998 s3://123:456@nutch/

答案 1 :(得分:0)

为了编写大小为>的文件4GB - 必须使用多部分上传。这似乎已在Hadoop版本2.4.0中修复(请参阅:https://issues.apache.org/jira/browse/HADOOP-9454)。

这就是说 - 这是使用AWS本机Hadoop产品(如EMR和Qubole)有意义的原因之一。他们已经设置好处理这种特质。 (完全披露 - 我是@Qubole的创始人之一)。除了香草分段上传之外 - 我们还支持流式多部分上传 - 即使在生成文件时,文件也会以小块的形式不断上传到S3。 (在vanilla分段上传中 - 我们首先等待文件完全生成,然后才以块的形式上传到S3)。