版权所有:内蒙古大学图书馆 技术提供:维普资讯• 智图
内蒙古自治区呼和浩特市赛罕区大学西街235号 邮编: 010021
作者单位:西安电子科技大学
学位级别:硕士
导师姓名:李雁妮;孟涛
授予年度:2020年
学科分类:12[管理学] 1201[管理学-管理科学与工程(可授管理学、工学学位)]
主 题:本地化 Spark SQL 数据倾斜 MDP 动态绑定
摘 要:数据倾斜指大数据平台下经常出现的某一个分区数据量远大于其他分区数据量,导致分配不均的情况。如果分配给每个节点的数据不均匀,那么执行过程中会出现某些task的执行时间远大于其他task的现象,不仅严重影响程序执行的性能,而且过多占用资源可能会使系统崩溃。论文选题来源于企业实际开发特性,主要针对Spark生产环境中出现的数据倾斜现象进行研究。此现象普遍发生于Spark的实时处理和两表连接场景。其中,对于Spark实时处理场景,消息队列Kafka分区数据的随机分配和某个Executor或者同一本地化级别上待执行任务的堆积都很容易造成倾斜现象;而在Spark两表连接的过程中也暴露出几个容易导致倾斜的问题:Shuffle过程中Hash分配的弊端、物理算子树采用统一的Reducer数目引发的资源利用率低和错误估计数据量导致选择带Shuffle操作的执行方式。因此,上述两种场景的倾斜问题已经成为了Spark分布式计算和性能提升的瓶颈。本文结合Spark数据倾斜场景的业务需求,并根据当前倾斜问题解决方案的国内外现状,通过对Spark Streaming和Spark SQL相关源码的研究与分析,设计实现了一个具有普遍适用性的解决方案。具体工作如下:1)针对Kafka不同版本的本地化差异,通过现有的取模运算实现有次序的动态绑定和兼顾本地化的动态绑定来改变数据随机分配的方式,并基于动态绑定方式,借助Spark的反压机制控制执行的消费速率以解决实时处理场景的数据堆积问题;2)内核代码引入自定义的本地化率计算公式让Spark实时处理系统自行判断降级操作,减少用户自行设置本地化级别等待时间带来的误差;3)通过自定义的倾斜度计算公式和重度倾斜分区切分来确定Reducer数目,并在SQL语句执行过程中根据Stage输出数据量动态选择合适的执行方式,以此来达到最佳的执行计划;4)采取Map端数据部分读取多次join的方式,并提出基于MDP的分区重组算法实现Reducer端分区数据的最优组合以解决两表连接场景Hash分配弊端带来的性能问题;5)对两种场景的功能性需求和非功能性需求进行全方位测试并对比分析,证明本文提出的解决方案确实能提高Spark在数据倾斜场景下处理数据的吞吐量和性能。当前数据倾斜场景解决方案代码以非侵入式的思想合入到公司自研发产品的内核代码,为防止对原有代码产生影响,只有相关配置项开启时优化方案才能生效,基本解决了日常运维人员发现的数据倾斜问题,并应用于许多使用此产品的业务场景,但目前随着数据量的不断增加和涵盖场景的多样性,可能未考虑到一些特殊的数据倾斜场景,需要不断寻求改进。