在分布式系统的实现中,shuffle是一个非常关键的操作,直接决定算法在分布式环境下执行的可行性。shuffle被称为数据混洗,它在某些并行系统中被称作exchange。shuffle最简单的实现方式就是对数据做某种策略上的切分(比如说哈希切分,比如说范围切分),然后可以选择切分之后的数据直接传输或者将数据持久化供容错,我们比较一下这两种方式。1,直接传输:当数据切分之后马上传输,会不经过磁盘,直接从内存中向另一个节点的内存中传,当然这可以使网络达到最大速度,但是没法容错,除非你设计的系统就天天跑个位数的机器(个人观点),否则你作业稍微一错,重跑。分布式下的作业一般涉及较多数据和长时间执行,我们可以计算一下trade-off,显然不划算。2,持久化之后传输虽然慢,但你的容错有保障,因为数据在磁盘上呢,不过你只能得到最多1/2的网络带宽极限(个人实现证明)。
空谈都是虚的,直接看shuffle的简单实现,我们就以压磁盘的情况来讨论,在经典的mapreduce理论中,可以分为两个节点,一个map阶段,一个reduce阶段,map节点端会容错,也就是压磁盘。我们在此分为上端和下端,因为数据位拉取策略,从执行拓扑的根节点开始执行,reduce端为上端,map端为下端:
说先上端会将其所在位置的执行子树发送到下端(我们首先考虑上端的情况),注意这一步我们需要做什么?因为要传输到远程节点执行。我们从最本源的地方说起,传输就涉及到网络,网络在C++/C中你可以选择库,但是为了挑战一