设备上没有剩余空间异常,亚马逊EMR中等实例和S3

6

我正在Amazon EMR上运行一个MapReduce作业,它创建了40个输出文件,每个文件大约130MB。最后的9个reduce任务失败,并显示“设备上没有剩余空间”的异常。这是否是集群配置错误的问题?如果输入文件少一些、输出文件少一些或者reducers数量减少一些,该作业就能成功运行。非常感谢任何帮助!谢谢!

以下是完整的堆栈跟踪:

Error: java.io.IOException: No space left on device
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:345)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
at java.security.DigestOutputStream.write(DigestOutputStream.java:148)
at com.amazon.ws.emr.hadoop.fs.s3n.MultipartUploadOutputStream.write(MultipartUploadOutputStream.java:135)
at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.write(FSDataOutputStream.java:60)
at java.io.DataOutputStream.write(DataOutputStream.java:107)
at org.apache.hadoop.io.compress.CompressorStream.compress(CompressorStream.java:83)
at org.apache.hadoop.io.compress.CompressorStream.finish(CompressorStream.java:92)
at org.apache.hadoop.io.compress.CompressorStream.close(CompressorStream.java:105)
at java.io.FilterOutputStream.close(FilterOutputStream.java:160)
at org.apache.hadoop.mapreduce.lib.output.TextOutputFormat$LineRecordWriter.close(TextOutputFormat.java:111)
at org.apache.hadoop.mapred.ReduceTask$NewTrackingRecordWriter.close(ReduceTask.java:558)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:637)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:390)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)

编辑

我做了进一步的尝试,但不幸的是我仍然遇到错误。我认为可能是因为下面评论中提到的副本因子导致我的实例上没有足够的内存,所以我尝试使用大型实例而不是到目前为止我一直在尝试的中型实例。但这次我又遇到了另一个异常:

Error: java.io.IOException: Error closing multipart upload
at com.amazon.ws.emr.hadoop.fs.s3n.MultipartUploadOutputStream.uploadMultiParts(MultipartUploadOutputStream.java:207)
at com.amazon.ws.emr.hadoop.fs.s3n.MultipartUploadOutputStream.close(MultipartUploadOutputStream.java:222)
at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.close(FSDataOutputStream.java:72)
at org.apache.hadoop.fs.FSDataOutputStream.close(FSDataOutputStream.java:105)
at org.apache.hadoop.io.compress.CompressorStream.close(CompressorStream.java:106)
at java.io.FilterOutputStream.close(FilterOutputStream.java:160)
at org.apache.hadoop.mapreduce.lib.output.TextOutputFormat$LineRecordWriter.close(TextOutputFormat.java:111)
at org.apache.hadoop.mapred.ReduceTask$NewTrackingRecordWriter.close(ReduceTask.java:558)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:637)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:390)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)
Caused by: java.util.concurrent.ExecutionException:       com.amazonaws.services.s3.model.AmazonS3Exception: The Content-MD5 you specified did not match what we received. (Service: Amazon S3; Status Code: 400; Error Code: BadDigest; 
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:188) 

结果是只有预期输出文件的大约70%被生产,其余减少任务失败。然后我尝试上传一个大文件到我的S3存储桶,以防内存不够,但这似乎不是问题所在。
我正在使用aws Elastic MapReduce服务。任何想法?
2个回答

2
问题意味着没有空间来存储您的MapReduce作业的输出(或临时输出)。
一些需要检查的事项包括:
- 您是否已从HDFS中删除了不必要的文件?运行hadoop dfs -ls /命令来检查存储在HDFS上的文件。(如果您使用回收站,请确保将其清空。) - 您是否使用压缩来存储作业的输出(或临时输出)? 您可以通过设置输出格式为SequenceFileOutputFormat,或通过设置setCompressMapOutput(true);来实现。 - 副本因子是多少?默认情况下,它设置为3,但如果有空间问题,您可以将其设置为2或1,以使程序运行。
也可能是由于一些reduce器输出的数据量比其他reduce器大很多,所以也请检查您的代码。

0

我在AMI 3.2.x上遇到了空间不足的错误,而在AMI 3.1.x上没有。尝试切换AMI,看看会发生什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接