小标
2019-02-20
来源 :
阅读 2808
评论 0
摘要:本文主要向大家介绍了【云计算】JAVA 并行计算中的外部排序,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。
本文主要向大家介绍了【云计算】JAVA 并行计算中的外部排序,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

(1)将数据拆分到每个节点上【如何拆分】
(2)每个节点并行的计算结果【什么结果】
(3)将结果汇总 【如何汇总】
(1)扩展的归并排序
将数据分为左右两半,分别归并排序,再把两个有序数据归并
如何归并:
【1,3,6,7】,【1,2,3,5】 -> 左边的1,这样稳定 (1)
【3,6,7】,【1,2,3,5】 -> 右边的1 (1,1)
【3,6,7】,【2,3,5】 -> 2 (1,1,2)
【3,6,7】,【3,5】 -> 左边的3 (1,1,2,3)
..............
(2)回到问题上来,将10G元素切成若干份相同的段,每段送一个排序节点进行排序(快速排序或归并排序),
此时每个节点上都是有序的序列,再把这些节点里的数据同时送往一个归并节点,由归并节点进行排序。
(3)k路归并,若此时数据量为10G,送往10台计算机进行归并排序,则此时k=10。
此时产生问题,若此时k很多,则归并节点选取最小的数产生困难性,如何解决呢?
【1】使用数据结构中的堆
<1>堆是一棵完全二叉树
<2>根节点是整个树中最小的数
<3>一般工作中不使用这种方式
【2】使用PriorityQueue,优先队列
<1>将元素不断psuh进Q中,mei每次运算量都是log(k),k为push前Q中已经存在的元素个数
<2>不断pop出最小的数
(4)此时还是存在问题,最后依然要将10G的数据量送给归并节点,内存依然不够,那到底放入多少的数据量
在归并节点中呢?
【1】将每个排序节点最小的那一批数据放入归并节点中,当一个节点的那一批最小的数据全部被归并后,再次读取
这个排序节点的同样大小的一批最小的数据
(5)实现这个归并程序非常难,怎么用代码实现呢?
【1】使用Iterable
【2】归并节点的入口为
<1>每个排序节点都是Iterable
传给归并节点,归并节点仍然传出Iterable
<2>对于每个数据源形成的Iterable
然后pop出一个元素,此时这个元素是当前最小的元素。
<3>重复进行<2>的步骤,直到某个Iterable
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号