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

Kat*_* A. 6 storage hadoop amazon-s3 amazon-web-services emr

我在 Amazon EMR 上运行 MapReduce 作业,它创建 40 个输出文件,每个文件大约 130MB。最后 9 个减少任务失败,并显示“设备上没有剩余空间”异常。这是集群错误配置的问题吗?作业运行没有问题,输入文件更少,输出文件更少,reducer 更少。任何帮助都感激不尽。谢谢!完整的堆栈跟踪如下:

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)
Run Code Online (Sandbox Code Playgroud)

编辑

我做了一些进一步的尝试,但不幸的是我仍然遇到错误。我认为由于下面评论中提到的复制因子,我的实例可能没有足够的内存,所以我尝试使用大型而不是迄今为止我一直在试验的中型实例。但这次我又遇到了一个例外:

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) 
Run Code Online (Sandbox Code Playgroud)

结果是只生成了大约 70% 的预期输出文件,其余的 reduce 任务失败。然后我尝试将一个大文件上传到我的 S3 存储桶,以防那里没有足够的内存,但这似乎不是问题。

我正在使用 aws Elastic MapReduce 服务。有任何想法吗?

vef*_*hym 2

该问题意味着没有空间来存储 MapReduce 作业的输出(或临时输出)。

需要检查的一些事项是:

  • 您是否从 HDFS 中删除了不需要的文件?运行hadoop dfs -ls /命令检查HDFS上存储的文件。(如果您使用垃圾箱,请确保也将其清空。)
  • 您是否使用压缩来存储作业的输出(或临时输出)?您可以通过将 SequenceFileOutputFormat 设置为输出格式来实现此目的,或者通过设置setCompressMapOutput(true);
  • 什么是复制因子?默认情况下,它设置为 3,但如果存在空间问题,您可能会冒险将其设置为 2 或 1,以使程序运行。

您的某些减速器输出的数据量明显多于其他减速器,这可能是一个问题,因此也要检查您的代码。