[关闭]
@duguyiren3476 2015-03-18T07:22:06.000000Z 字数 1018 阅读 535

hadoop二次排序原理

hadoop mapreduce 二次排序


同关系型数据库一样,在数据的驱动下,有需要根据一条记录中的多个列进行升序过降序的排列业务,那么我们需要明白hadoop中的二次排序的原理:二次排序是指根据多列进行排序,类似sql中的 order by a1 desc,a2 功能.
mapreduce的执行原理如下:
根据输入路径或文件,获得分片splits,每个split分片对应一个map task,每个split中的每条记录对应调用一次map()函数;每个Map对应一个回环缓冲区,默认缓冲区大小为100M内存空间,每调用一次map()函数,则会将一条记录经过逻辑处理后写入到回环缓冲区中,当回环缓冲区的使用率超过100M的80%时,则进行一次spill操作,空间释放,将数据写入task节点的本地磁盘,如果回环缓冲区写满,则会阻塞map函数的写入操作,直到一次spill执行完毕,同时写入前会先执行sort排序,排序的范围即为100M*80%的数据量,并对每条数据贴标签(确定本条记录该到那个reduce执行)如果制定了combineReduce操作,则进行本地的初步合并; map阶段执行完毕,会将本地所有的spill文件合并为一个大的spill文件,并建立索引,完成之后,通知master节点,本task map完成,随之master会通知等待队列中的reduce节点用http方式从task map节点远程copy数据,copy过程中,每个reduce从索引文件中遍历出所属自己的数据条目,然后远程copy; reduce将数据copy到reduce节点的过程依然使用回环缓冲区的原理,并进行分组和排序,默认根据map的输出key进行分组,相同key的数据会聚合成为reduce函数中的第二个参数:数据数组,切是根据key升序字典排序数组; 待虽有map任务都已经完成并切数据已经分发到各个reduce后, reduce做最后的分组排序, 每一个redece中的每个key转换成数组后,即会调用一次reduce函数进行输出.
以上为大体的mapreduce过程,那么二次排序 最终要做的就是控制在reduce端的分组和排序过程做自定义操作, 控制reduce的分组和排序操作有两种方式:
1.在自定义map输出key中做的函数compareto中做二次排序的算法,此方式选相对容易
2.在group中做分组 并在比较函数中做二次排序算法,次方式相对复杂

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注