为了依旧将来回答面试官的问题
这个图片就是mapreduce的流程图
然后是map:
首先我们应该知道默认情况下map的数量是由inputsplit(就是输入分片)的数量决定,然后一个map对应一个环形缓冲区,缓冲区的大小默认是100M然后阈值时80%,到达阈值的时候需要溢写到磁盘,在溢写前需要进行分区,然后对每个分区的数据进行排序,排序后这时combiner的话会进行该操作,对于溢写的数据会有很多小文件,最后map读取完之后会将这些小文件进行合并,到此map端任务结束:
然后如何获得分区数?是由getPartition来的返回值是:
return (key.hashcode() & Inter.MAX_VERLUE) % numReduce)意思就数量是一个key的coude值对reduce的数据进行取余,这样得到的分区数就和reduce的数量一致了
reduce任务端:
在Reduce端,shuffle主要分为复制Map输出、排序合并两个阶段。
Reduce任务通过HTTP向各个Map任务拖取它所需要的数据。
reduce维护几个copier线程,并行地从map任务机器提取数据。默认情况下有5个copy线程,可以通过mapreduce.reduce.shuffle.parallelcopies配置。
如果map输出的数据足够小,则会被拷贝到reduce任务的JVM内存中。mapreduce.reduce.shuffle.input.buffer.percent配置JVM堆内存的多少比例可以用于存放map任务的输出结果。如果数据太大容不下,则被拷贝到reduce的机器磁盘上。