前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mapreduce中shuffle中两种排序算法

mapreduce中shuffle中两种排序算法

作者头像
Flink实战剖析
发布2022-04-18 11:09:27
6500
发布2022-04-18 11:09:27
举报
文章被收录于专栏:Flink实战剖析Flink实战剖析

shuffle阶段分为

1. map shuffle也称为shuffle writer, 每个map 处理分配的split, 然后写入到环形缓冲区中,当缓冲区中的数据达到 一定比率,就会开启线程将缓冲区中的数据写入文件,称为spill, spill 同时会对数据进行分区、排序、合并操作,然后写入到文件,这是一个边写缓冲区,边spill的过程,中间可能会产生多个文件,只到map 读取数据完毕会将spill 的所有小文件进行分区、排序、合并成为最终一个数据文件一个索引文件。

2. reduce shuffle 也称为shuffle reader, 待map阶段执行完成,每个reducer开启若干线程 从所有的map阶段输出的索引文件与数据文件获取对应的分区数据,若内存足够则存放在内存中,否则输出到磁盘,在这个过程中还会同时对内存、 磁盘数据进行合并(merge)、排序,最终形成一个有序的大文件,提供给reduce执行。

在shuffle writer 与shuffle reader阶段都发生按照数据的key进行排序,spill 过程对内存缓冲区的数据进行快速排序,map最终合并小文件并归排序,shuffle reader 拉取map端的数据并归排序。用到两种排序算法:快速排序与并归排序。

快速排序:将一串无序的数据使用分而治之的思想排成有序的数据,最终使数据有序,初始选择数组array的下标start,end(start<=end),选取该下标范围内的一个数据,通常是tmp=array[start], 每一次遍历找到tmp在数组中的位置m使得,数组左边的数据小于等于tmp,右边的数据大于tmp, 然后将数组分为[start,m-1],[m+1,end]两部分,然后分别遍历,如此递归下去最终使array有序。遍历方法:选取的tmp=array[start]作为一个新的空缺位,先从右至左遍历,找到一个小于等于tmp的数据,然后将该数据赋填充到start位置, 那么此时新的end位置空缺,然后从左志右遍历,找到一个大于tmp的数据,然后将该数据填充到新的end位置,依次反复交替直到start=end, 此时的start位置便是数据tmp的位置。示例图如下:

代码实现:

并归排序:将多个有序数组,合并成为一个有序的数组。先考虑将两个有序数组排序思路:分别遍历两组有序数据,a1,a2 ,起始位置都是0, 比较a1[0]与a2[0]的大小关系,将较大的数据存放在空数组c[0]中,若a1[0]>a2[0],则c[0]=a2[0], 然后比较a2[1]与a1[0]的大小关系,依次交替比较,只到其中一个数组取完,将未取完的数组的剩下部分依次存放在c后面。示例图如下:

实现代码:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Flink实战剖析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档