论文部分内容阅读
随着海量数据时代的到来,能够有效的存储和处理大规模数据的平台受到越来越广泛的关注。这些平台大多利用了集群的分布式处理和节点的多核并行计算能力。其中以MapReduce编程模型为基础的处理框架尤为突出。这些平台从宏观的角度关注资源的有效使用,衡量集群的负载均衡。但是MapReduce是一个阶段并行模型,它按序执行的特点会造成某一时间点节点资源使用的不均衡,所以从微观角度看,MapReduce系统并未在任何时刻都有效地利用节点的各种资源。同时这种按序执行也对数据依赖型作业组产生影响,由于依赖作业不能提前调度,使得节点IO和CPU资源处于空闲。
目前大多数系统为克服MapReduce的严格按序执行而提出的策略主要是以数据流为基础的并行,即任务之间通过使用数据流水线而达到任务的提前执行。由于没有从资源的角度进行考虑,会造成资源使用的冲突。而且非固化的数据流会使错误恢复变得复杂。而对于依赖作业支持方面,大多数系统只是在MapReduce之上封装了一些可以表示依赖作业的接口,或是一些数据结构,但是真正MapReduce的核心调度层还是无法区分普通作业和依赖作业组。
基于大规模数据处理的重要性以及目前系统对节点资源有效使用的解决方案的不完善性,本文提出了以流水线方式为基础的局部动态并行化技术,并将该技术运用到开源的MapReduce框架badoop上。
局部动态并行化技术从两方面展开:同种任务内的并行化和数据依赖犁作业间的并行化。任务内的并行化采用的是资源流水线思想:首先将一个任务划分成具有不同资源使用倾向的子阶段,之后通过动态的改变slot的数量使得任务可以提前执行,实现同一时刻资源使用的互补。数据依赖型作业间的并行化采用的是数据流水线的思想:在两个依赖的作业之间开设一个数据缓冲池,当部分数据产生时,就可以开始调度下一个作业对应的Map任务。虽然以上两种并行化技术可以使资源互补使用,但是由于每一个子阶段执行时间的不同仍然可能会造成资源的冲突。本文通过系统的资源配置设定一些限制从而决定何时动态的启动任务或何时任务可以进入下一阶段。这些限制在任务内的并行技术中主要体现在代表资源的多种slot的设置上,在依赖作业间主要体现在根据Reduce任务执行数量变化的实时调度上。最后本文基于以上两种流水线技术总结出多阶段并行模型,从而指导并行框架的调度。
本文对并行化技术和模型进行了实现并做了实验验证。实验证明任务内的并行化技术可以使节点的资源使用率得到6%至10%的提升,执行时间获得5%到15%的平均提升。而作业间的并行化技术也使依赖作业组执行时间降低。