并行正则采样排序算法及在 Mars 中的应用

简介: 相信大家对排序算法都非常熟悉了,快速排序、堆排序、归并排序等等。如果我们想在一个很大的数据集上进行排序,能利用上多核,甚至是分布式集群,有什么办法么? 本文就介绍一种并行排序算法:并行正则采样排序算法(Parallel Sorting by Regular Sampling),简称 PSRS 算法。

相信大家对排序算法都非常熟悉了,快速排序、堆排序、归并排序等等。如果我们想在一个很大的数据集上进行排序,能利用上多核,甚至是分布式集群,有什么办法么?

本文就介绍一种并行排序算法:并行正则采样排序算法(Parallel Sorting by Regular Sampling),简称 PSRS 算法。

PSRS 算法过程

image

PSRS 算法的整个过程分为四步,如图所示,我们拆解开来讲。

现在假设我们有一个数组,有 48 个元素,现在数据被分成4份,即有4个分区。

阶段1,每个分区分别排序,并正则采样

我们对每个分区的数据调用快速排序,这样每个分区都是排好的数据。接着,我们从排好序的数据里正则采样4个数据。所谓正则,即有规律的,这里我们就每隔4个元素采样一个元素。

阶段2,归并采样数据,选出关键点

前面四个分区产生了4份采样数据,收集之,然后调用归并排序让他们有序。接着,我们从中选出 p - 1 (p 是分区个数)个关键点,这里还是正则采样的方式。

阶段3,数据分区

此时将关键点数据广播给每个分区,每个分区就可以根据关键点,将数据分成4份,使得每个数据落在各自的范围内。

阶段4,合并数据,归并排序

最后一个阶段是一个 shuffle 阶段,即每个下游都依赖前面的所有上游。此时每个分区将上游分好的数据收集起来,最终再进行一个归并排序。这样,我们最终的结果就是整体排序的了。

整个过程中,阶段1、阶段3 和 阶段4 可以并行。

MPI 的实现可以参考这里

PSRS 算法在 Mars 中的应用

Mars 以并行和分布式化 Python 数据科学栈为目标,PSRS 算法能很好解决并行排序问题,因此,Mars 中和排序有关的操作都是基于 PSRS 算法实现的。

以张量排序为例。

首先我们通过 Numpy 创建 1 亿个元素的数组。

In [1]: import numpy as np                                                      

In [2]: a = np.random.rand(1_0000_0000)                                         

In [3]: a.nbytes                                                                
Out[3]: 800000000

我们来看看使用 Numpy 的排序需要多久。

In [4]: %time np.sort(a)                                                        
CPU times: user 10.8 s, sys: 394 ms, total: 11.2 s
Wall time: 9.4 s
Out[4]: 
array([1.05764619e-10, 5.86309734e-09, 1.76225879e-08, ...,
       9.99999976e-01, 9.99999983e-01, 9.99999998e-01])

接着,我们来看看基于 PSRS 算法的 Mars tensor 排序需要多长时间。

In [10]: t = mt.tensor(a, chunk_size=1500_0000)                                 

In [12]: %time mt.sort(t).execute()                                             
CPU times: user 18.7 s, sys: 7.03 s, total: 25.7 s
Wall time: 2.66 s

在我的笔记本上,可以看到 Numpy 的排序时长是 Mars 的 3.53 倍。

总结

本文介绍了并行正则排序算法,这个算法也在 Mars 项目里得到了广泛的使用。

如果对 Mars 感兴趣,可以关注 Mars 团队专栏,或者钉钉扫二维码加入 Mars 讨论群。

IMG_8215

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
26天前
|
机器学习/深度学习 存储 算法
sklearn应用线性回归算法
sklearn应用线性回归算法
24 0
|
1月前
|
存储 算法 测试技术
ArrayList集合的两个实例应用,有趣的洗牌算法与杨辉三角
ArrayList集合的两个实例应用,有趣的洗牌算法与杨辉三角
23 1
|
1月前
|
算法 前端开发 数据可视化
数据结构与算法在前端开发中的实际应用
本文将探讨数据结构与算法在前端开发中的实际应用,重点介绍在处理大规模数据、优化性能和提升用户体验方面的具体场景和解决方案。
|
1月前
|
机器学习/深度学习 算法 数据库
KNN和SVM实现对LFW人像图像数据集的分类应用
KNN和SVM实现对LFW人像图像数据集的分类应用
34 0
|
8天前
|
数据采集 算法 数据可视化
R语言聚类算法的应用实例
R语言聚类算法的应用实例
85 18
R语言聚类算法的应用实例
|
8天前
|
算法 数据可视化 数据挖掘
R语言社区主题检测算法应用案例
R语言社区主题检测算法应用案例
12 0
|
1月前
|
存储 算法 安全
数据安全之道:加密算法在现代网络通信中的应用
本文将深入探讨加密算法在现代网络通信中的重要性和应用。通过介绍对称加密、非对称加密和哈希算法等加密技术,帮助读者了解数据安全保障的关键技术,并探讨其在保护数据完整性和隐私方面的作用。
|
2月前
|
存储 前端开发 算法
加密算法在网络通信中的应用及优势分析
本文将探讨加密算法在网络通信中的重要性,以及不同加密算法的应用和优势。通过对前端、后端、Java、Python、C、PHP、Go等多种技术的分析,我们将了解在日益增长的网络威胁下,加密算法对于确保数据安全和隐私保护的必要性。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习疆界:探索基本原理与算法,揭秘应用力量,展望未来发展与智能交互的新纪元
深度学习疆界:探索基本原理与算法,揭秘应用力量,展望未来发展与智能交互的新纪元
35 0
|
3月前
|
人工智能 算法 机器人
【Python数据结构与算法】--- 递归算法的应用 ---[乌龟走迷宫] |人工智能|探索扫地机器人工作原理
【Python数据结构与算法】--- 递归算法的应用 ---[乌龟走迷宫] |人工智能|探索扫地机器人工作原理
32 0