论文部分内容阅读
Spark作为分布式计算框架的典型代表,得到了不断发展和普及,已成为Apache基金会顶级开源项目之一。Spark通过基于内存的高效运算,减少数据传输时间,解决了传统MapReduce计算模型在迭代计算上的不足。Shuffle阶段是MapReduce框架中介于Map阶段和Reduce阶段之间的重要阶段,涉及大量磁盘读写和网络传输,直接影响整个系统的性能和任务的执行效率。Shuffle fetch在拉取数据的过程当中,由于中间数据分布不均,使得不同Reduce task处理的数据大小存在较大差异,造成数据倾斜问题,进而影响作业效率。本文根据Map task输出数据的分布特征,提出基于数据存储位置的分区策略,减少shuffle过程中数据的传输量,进而提高shuffle过程整体性能。具体完成了以下工作:1.针对Map task输出结果过于集中,造成不同节点网络负载不均的问题,提出一种优化的shuffle均衡调度策略。在Map阶段,根据task本地性等级额外启动少量task来分散中间数据在集群中的分布,并在shuffle fetch阶段根据Map节点的网络负载来选择数据。通过与现有调度策略进行对比实验,实验结果表明本文提出的调度策略能够平衡节点间的网络负载,提高shuffle效率,减少任务执行时间。2.针对shuffle过程数据倾斜问题,提出基于本地性的分区策略。在进行平衡分区过程当中,充分考虑数据的存储位置。通过与原有Hash分区策略进行对比实验,结果表明,基于本地性的分区策略能够减少shuffle过程中数据的传输量,平衡各个Reduce task处理分区的大小,缓解数据倾斜问题。综上所述,由于Spark集群中shuffle机制存在网络节点负载不均、数据倾斜问题,本文从任务调度最大本地化思想出发,研究和改进Map task重启策略和分区策略,能够显著平衡节点间的网络负载,减轻数据倾斜,提高shuffle过程效率。