论文部分内容阅读
MapReduce作为一种分布式编程模型,被广泛应用于大规模和高维度数据集的处理,在海量数据处理中显示出较好的并行性以及扩展性。其采用简单通用的Hash函数对数据进行划分,当数据分布不均匀时,常会出现数据倾斜的问题。现有的解决数据倾斜方法多是增添一轮采样操作,确定key值频率再重新执行数据分区。但是增加的采样作业会延迟原作业的运行,例如基于MapReduce实现的并行聚类算法需要进行多次迭代运算,且对于各轮计算,reducer的数据分布情况不尽相同,现有的方法将增加多轮采样作业。针对该问题,本文提出一种动态分区策略,当发生数据倾斜时,更改剩余数据分区函数以解决数据划分的不均衡。首先,在Map运行过程中增加计数器,统计经Hash法分到各reducer的数据量或记录数,并将这些消息通过心跳机制发送到Job Trackcr;然后,Job Trackcr根据全局的分区信息建立数据倾斜模型,得出各reducer负载情况用以判断存在数据倾斜的reducer;最后,Job Trackcr计算倾斜reducer与负载较轻reducer的hash差值,即分区偏移值,并将它发送到Partitioner用来在分区过程中动态修改原分区函数。该函数中剩余分区的hash结果将加上其对应的偏移值,倾斜数据就会发送到负载较轻的reducer上处理,使各节点的负载达到均衡。此外,本文考虑集群中节点的软硬件异构性,在数据倾斜模型中加入各reducer性能参数,使本文方法在异构的集群环境中也能较好地均衡集群负载。将本文动态分区策略和Hash方法以及现有的动态采样方法对比,通过在符合词频分布规律的数据集上运行Word Count程序,验证本文方法的有效性;在真实数据集上运行改进的k-means++算法,比较三种方法平衡数据分区后MapReduce的执行效率。实验结果证明本文策略解决了MapReduce作业中的数据倾斜问题,且在稳定性与执行时间上优于Hash和基于采样的动态分区法。