在运行Map Reduce程序时,包括mapper,combiner和reducer,终端显示Spilled failed错误,但是当我单独使用mapper运行程序时,它没有任何溢出。
15/09/02 13:56:27 INFO mapred.JobClient:TaskIdattempt_201508260430_0030_m_000001_0,状态:未通过 java.io.IOException:在org.apache.hadoop.mapred.MapTask $ MapOutputBuffer.collect(MapTask.java:1007)atorg.apache.hadoop.mapred.MapTask $ NewOutputCollector.write(MapTask.java:689)处的溢出失败
答案 0 :(得分:1)
当您使用reducer运行作业时,地图输出的中间数据将被放入一个进程中,然后将其溢出到本地磁盘中。有一个后台进程/线程可以对您的数据进行排序,并根据reducer的数量将数据写入不同的分区。您的工作问题是,运行map任务的tasktracker没有足够的本地内存空间来保存您的中间数据。但是当你只运行一个map map时,sort和shuffle不会发生,它会直接将你的输出写入HDFS。尝试压缩中间地图输出并根据文件大小设置压缩编解码器。我通常喜欢活泼的。
<property>
<name> mapreduce.map.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>