Combine output records和Reduce input records不相等。
Reduce input records表示从map端获取的记录总数,按道理讲这两个数应该相等,但通过日志发现不相等。
经过多次实验,这是由于combiner引起的。
combiner调用几次,何时调用,都是不可控的。
combiner可能在两个地方调用:
①是spill到磁盘文件时,实际上日志统计的是这个combiner的数据;
②是小文件merge到大文件时,这个调用需要满足一定条件,即“min.num.spill.for.combine”对应数值(默认是3)要小于spill的文件数,此处的combiner的数据未被统计,所以导致了二者的不同。
证明步骤一:如果不使用combiner,则效果如下,reduce的输入就是map的输出数。
证明步骤二:调整参数,让merge时不要combiner
如果分片数小于“min.num.spill.for.combine”,则不会触发merge时的combiner。
-
第一种思路,把“min.num.spill.for.combine”调大,但不起作用。
-
第二种思路,把分片变小,让spill次数为1,如下配置控制分片最大为30M,不配置的话则为hdfs默认block大小128M,如果分片大小为128M,大于环形缓冲区的大小80M,可能会多次溢出。
conf.set(“mapreduce.input.fileinputformat.split.maxsize”,“34108884”);
通过这个参数将分片变下,远小于环形缓冲区的大小(80M),则每个map task只会溢出一次,也只会在溢出时combiner。这样调整之后发现,reduce的输入数和combiner的输出数相等了。