一种基于负载代价的MapReduce等值连接优化算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一种基于负载代价的MapReduce等值连接优化算法
郑钤;向军
【摘要】MapReduce并行计算模型在大规模分布式数据处理中应用广泛,但该模型不能很好地支持连接操作,特别是面对倾斜数据时,原有的分区算法容易造成处理节点间的负载不均衡.针对这一问题,提出一种基于key代价的负载均衡等值连接算法,对Map端中间结果进行采样,根据采样结果计算每一key值的负载代价,并在此基础上,设计一种动态划分函数,对不同的key值按照负载代价均匀划分到各个计算节点,实现了负载均衡.实验结果表明,在同构集群下,提出的算法在负载均衡方面具有较好的效果.
【期刊名称】《湖北民族学院学报(自然科学版)》
【年(卷),期】2018(036)003
【总页数】6页(P342-347)
【关键词】MapReduce;负载均衡;等值连接;key代价
【作者】郑钤;向军
【作者单位】湖北民族学院信息工程学院,湖北恩施445000;湖北民族学院信息工程学院,湖北恩施445000
【正文语种】中文
【中图分类】TP311
MapReduce是Google在2004年提出的一种编程模型,用于大规模数据集的并
行计算[1].MapReduce的主要思想,是从函数式编程语言借鉴而来,主要分为“map(映射)”和“redu ce(规约)”两个步骤,map函数将一组键值对映射成另一组新的键值对,reduce函数对具有相同键的键值对进行处理,输出最终结果.虽然MapReduce模型在并行数据处理方面取得了巨大成功,但是在需要进行如连接、聚集等复杂计算的场景中,MapReduce的性能并不能尽如人意.数据倾斜是严重影响MapReduce性能的因素之一.数据倾斜多发生在Reduce端,在Reduce端的数据倾斜常常源于MapReduce的默认分区方案,倾斜的数据按照默认的哈希分区容易导致reduce任务处理数据的不均匀,造成某一些Reduce任务执行时间远远大于其它Reduce任务,使整体运行效率降低[2].连接查询是海量数据处理中的核心操作,被广泛应用于日志分析、联机分析处理等场景中.
基于传统MapReduce框架的连接优化研究中,常用的二路连接算法有半连接(Simi-Join)、广播连接(Broadcast Join)、重分区(Repartition Join)、分片半连接等[3].文献[4]对MapReduce编程模型进行扩展,通过增加Merge阶段设计了Map-Merge-Reduce编程模型,在Reduce端做笛卡尔积运算时更为方便.文献[5]将索引结构引入到Map-Reduce-Merge计算框架上,提高了系统的性能,但这种索引的建立有一定难度,而且可扩展性不强.文献[6]设计了Map-Join-Reduce编程模型,可通过一轮MapReduce作业完成多表连接操作,但当节点数和数据量增加时,I/O量和网络传输量也会大量增加.文献[7]通过MapReduce 为用户提供的自定义函数构建索引,提出了Hadoop++系统,通过寄宿索引的技术实现表之间的连接,不过其不足之处是索引的构建代价过高.文献[8]借用列存储技术对MapReduce框架进行优化,设计了Llama系统.不过文献[3-8]都没有充分考虑负载均衡问题对连接操作性能的影响.文献[9]基于对等值连接键值的统计信息,用范围分割方法来优化连接算法,均衡了集群负载,减小了数据倾斜的影响.但其范围分割方法只单纯地按记录数量进行统计而没有对连接过程中的计算倾斜做
进一步分析,而且需要重新开启MapReduce作业,消耗一定的时间和资源.文献[10]采用key值分区的方式来解决数据处理中的倾斜问题,将传统分区与Reduce 一对一的关系调整为多对一的关系.该策略同样只是根据统计的记录数量对分区进
行划分.文献[11]针对基于MapReduce的连接查询操作在数据分布不均匀时的性
能瓶颈,提出了基于组合分割平衡分区优化策略的改进型连接查询算法.文献[12]
提出的MR-LSP负载均衡机制在作业执行前,对源数据抽样分析源数据分布特征,采取动态负载均衡分区策略,并在作业运行期间实时监控节点负载,进一步优化分区策略,有效缓解了MapReduce中数据倾斜问题.文献[13]基于统计倾斜和轮询
分区这两个思想,设计了基于数据倾斜的统计倾斜轮询分区连接算法.
现有的基于MapReduce的连接查询优化算法大都从集群方面进行考虑,对于MapReduce连接操作中更细粒度的倾斜问题缺少进一步的研究.本文主要研究如
何有效的均衡集群中各Reducer节点的负载,提出基于key代价的负载均衡等值连接算法,该算法充分考虑了连接操作中数据的网络传输代价和本地磁盘I/O代价,建立了负载均衡代价模型,可确保每个Reducer节点的负载代价近似相等,
以获得更好的平均响应时间,提升MapReduce整体性能.
本文第1部分介绍了国内外关于MapReduce连接查询优化技术现状,引出本文
研究内容;第2部分介绍了现有的MapReduce相关分区算法;第3部分分析了MapReduce连接操作中负载代价并给出本文算法步骤;第4部分给出了实验结
果分析;第5部分总结全文.
1 相关技术
1.1 哈希分区算法
在MapReduce中,Map产生的中间结果主要通过一定分发策略分配到Reducer 节点上,Hadoop默认的哈希分区是采用哈希散列的方式,用key的哈希值对Reducer的个数求模,会得到一个Reducer序号,这样一来,具有相同key值的
键值对就会被分配到同一个Reducer,但又不能保证每个Reducer具有相同的负载[14-15].在这个过程中,如果出现key的倾斜现象,就会造成某些Reducer处理的数据量过大,使该任务执行时间更长,降低了集群效率.所以当遇到数据分布不均匀的情况时,往往通过重新制定分配方案的方法来解决.
1.2 基于key分区算法
基于key分区算法分区处理对象与原来的机制一样,都是把key值作为一个处理对象,与原机制的不同之处在于Reducer与分区的索引建立和key与Reducer的多对一关系.Key分区策略在Mapper阶段新增一个统计函数,统计每个key值和其对应的键值对数目并记录下来,作为对于数据分布信息的描述,在Mapper阶段完成后合并为若干个key分区,每个key值对应一个分区.Master节点在将各个Mapper统计的信息汇总后,计算出所有键值对数目,制定合理的分区分配方案把所有key分区的数据平均分配到每个Reducer. Key分区在Map端产生的分区数量不是等于而是多于Reducer的个数,这些分区在Reduce端会被合并成新的分区,也就是把分区与Reducer的一对一关系改为多对一关系[9].通过以上步骤可以很好保证Reducer的负载均衡.
2 基于key代价的负载均衡策略
文献[10]中基于key值分区策略通过新增counter()函数对输入数据集进行统计,分析计算全部数据集的分布情况并决定怎样把key分区的数据分配到每个Reduce 上.这种方式对实际业务中处理海量数据会有很大性能提升.可以看出,该策略在处理同一计算复杂度的MapReduce数据计算时其设计思路非常巧妙且很有效果,但对于复杂计算如两表连接任务,这种策略便不再适用,如针对不同的key,由于每个key具有不同的处理效率,就会影响到Reduce计算节点工作量的均衡性.基于key分区策略机制可以实现Reduce 任务中记录数目大致相等,但不能保证其计算量的均衡.例如,对于关系R和S的等值连接中,分区C1和C2中各有100
条记录,其中C1中有10条记录来自于数据集R,90条记录来自于数据集S,C2中来自于数据集R和S中的记录数均为50,这样处理C1的Reduce任务将会输
出900条连接记录,而处理C2的Reduce任务则会输出2500条连接记录,显然,处理C2的Reduce任务要花费更多时间.数据倾斜问题的解决取决于各个处理区
间负载代价的均衡程度,因此本文在基于key值分区策略的基础上提出基于key
值代价的两表等值连接负载均衡策略.来保证Reduce Task的工作量的均等性而不是单纯数量上的均等.系统在原来的基础上增加了key值代价计算模块,在统计过
程中不单纯地按数量进行统计,而是通过key值代价的计算来确定key分区与Reduce的映射关系.
2.1 key代价的定义
为充分反映节点的负载情况,通过计算key分区代价值,从key分区代价值的角
度进行负载均衡调整.由于数据倾斜问题发生在reduce阶段,具体来讲,key代价的计算主要包括输入数据的网络传输代价、CPU处理代价和连接结果输出到HDFS的代价.因为CPU任务主要基于内存和寄存器的比较和计数,占整体处理时间的比例很小,所以CPU的代价可以忽略不计.
给出两个同时拥有A字段的数据集S和T,考虑基于A字段的等值连接(S.A=T.A).定义连接属性a∈A的负载代价如下.
定义1 单个属性值的负载代价:连接属性a∈A的负载代价(costa)是指该属性值
在连接操作中的代价,其计算方式如公式(1)所示:
costa=sa+ta+sa*ta
(1)
其中:sa、ta分别为数据集S和T中包含属性值a的数据条数,sa+ta为输入数
据网络I/O代价,sa*ta为数据输出到HDFS的代价.
2.2 基于抽样估计的key代价计算
表1 系统参数表Tab.1 Table of system parameter系统参数参数含义keyi第i 个连接属性keykeyi_numkeyi类型键值对的数目keyi_tabkeyi类型键值对的数据源costkeyikeyi的代价值loop所有总代价和reduceNumReducer任务个数keyNum连接属性key的种类数Rj编号为j的Reducer
本文提出基于抽样估计的key代价计算,对Mapper输出的中间结果进行采样,由于每一个连接属性key可能对应两个不同的数据集,我们需要对每个key值进行采样,计算出每个key的代价值.
首先在Mapper阶段新增一个采样方法Counter,用来采集原始数据集的记录信息.各个Mapper读取两个文件Customer和Order中的数据.Mapper输出中间结果的key值为连接属性值,在value中标记数据是来自于Customer还是Order.采用<key, value>对的形式输出,对中间结果进行采样,统计出各key值和每个key值出现的频率,作为描述处理数据分布的统计信息记录下来,再将统计信息以(keyi,keyi_num,keyi_tab)的形式发送给作业处理器JobTracker,JobTracker汇总各个Mapper节点的统计信息,根据公式(1)计算出每个key值的代价,最后制定出负载均衡的数据划分方案.若全部的key值总代价和为loop,最理想的情况下,每个Reducer的处理代价为avg=loop/reduceNum.
2.3 制定分区方案
等Mapper完成后先采用key分区的方法,将中间结果集按照key值合并为若干个key分区,每个key值对应一个key分区.在官方分区方法中确定各类型的键值对数据对应的分区号一般都使用哈希取余的方法,即Hash(key)%reduceNum. key分区的关键是在建立<key, value>的分区号时Hash(key)%reduceNum中reduceNum的确定,这个值由Map产生的<key, value>中key的类型数目确定.也就是采用Hash(key)%keyNum的形式,这样,经过Hash(key)%keyNum所计算得到的分区号就不再与Reduce任务号一一对应.在JobTracker中保存了每个
key分区的代价信息,每个key分区的代价值为costkeyi,本文采用一种近似的贪心算法,每次选择key代价最高的分区,将其分配给当前包含key代价最少的Reducer,直到将所有的key分区分配完为止.
分区分配算法最终会返回集合R0,R1,…,RreduceNum,我们可以得到key分区与Reducer的对应函数f(keyi)=Rj.
算法1 分区算法核心伪代码
输入:key cost information<keyi,costkeyi>
输出:the set of all Reducers R0,R1,…,RreduceNum
Sort<keyi,costkeyi> from big to small bycostkeyi
Set R0,R1,…,Rr-1 to empty
For i=0 to keyNum-1
If Rj is the task that currently contains the least key cost
Add<keyi,costkeyi> to Rj
Return R0,R1,…,RRnum
图1 key代价算法在Hadoop-1.2.2系统上的实现Fig.1 The key cost algorithm in Hadoop-1.2.2 system
3 系统实现
本设计在原架构上增加了3个功能模块来实现基于key代价的分区策略,如图1所示,在原系统的map task中加入采样模块(Sample),JobTracker中加入筛选分配分区模块(Choose and Distribute Partition),reduce task类中加入获取分区模块(Gain Partition).Map端获取中间结果中各key的信息后,将其传递到到作业处理器JobTracker中,作业处理器根据汇总的key分布信息制定分区方案并将分区方案发送到每个Reduce节点,在得到分区方案文件后,各个Reduce任务从Map端获取相应的数据做连接操作.
首先,在各个Map任务的线程中添加一个抽样函数Counter,统计各个Map()函数处理的各key的信息将其保存到本地的LocalCounter模块中.采用心跳机制将LocalCounter中的数据上传到JobTracker的GlobalCounter模块中.同时在
Map任务运行结束后将产生的数据写到本地磁盘,将各key分区的分区号写入MapOutPutFile模块,这样做的目的是使Reduce能快速锁定其所对应的分区并
获取分区中的数据.
JobTracker汇总来自于各个Map端的统计结果并制定分区方案,GlobalCounter中汇总了各个Map端的LocalCounter里的数据,由JobTracker类中新增加的Choose and Distribute Partition模块实现分区分配算法,首先计算各个key分区的代价值,并确定动态划分函数f,将分配方案上传到GlobalDistributePlan模块中,等决策结束后,再把GlobalDistributePlan中的
信息通过心跳机制heartbeat发送到每一个Reduce节点.
JobTracker通过心跳机制将key分区信息发送到每个Reduce任务,Reduce任
务将分区信息写入GainPartition,MapOutLocations里存放着key分区的存储
路径,readPartition模块从GainPartition中读取分区信息并根据MapOutLocations来获取key分区中的数据.在Reduce任务把所有的数据获取
到之后进连接运算,把最后输出数据写入HDFS中,完成全部任务.
4 实验结果与分析
4.1 实验设置
实验在由3个节点组成的Hadoop集群上运行,节点之间通过百兆网络连接.每个节点内存为8GB,硬盘为500G,CPU为intel©CoreTM2 Quad CPU
************4核,操作系统为CentOS64bit.其中一台机器为Master节点,2台机器为Slave节点.运行的Hadoop版本为2.4.1,代码编译采用JAVA
JDK1.6.
实验数据采用TPC-H数据集作为测试基准,测试本文算法连接查询性能,选取其中的CUSTOMER和ORDERS两个数据表作为连接测试数据集.连接率设为100%,CUSTOMER中的记录数固定为3千万条,ORDERS中的记录数分别取1亿、2
亿和4亿.实验将ORDERS数据倾斜率设定为不同值,评价标准为不同倾斜率下几种算法的时间性能和Reduce端的负载均衡性能.另外,考虑到采样比例对实验结
果的影响,我们还设计了不同采样率对算法性能的实验.数据集选取如表2所示.
表2 实验数据集Tab.2 Experimental data set数据表数据集1数据集2数据集
3CUSTOMER3千万行3千万行3千万行ORDERS1亿行2亿行4亿行
图2 不同倾斜率下三种算法时间性能比较Fig.2 Comparison of time and performance on two algorithms under different skew rates
4.2 实验分析
将本文提出的基于key代价的负载均衡等值连接算法(简写为key-cost partition),与文献[9]中的范围分割算法(rangepartition)以及标准两表连接算法(IRJ)进行对比实验,以验证该算法在集群负载均衡及算法的整体运行时间方面要更加高效.通过
3组实验分析在不同倾斜率(α)时的算法效率.默认采样率设为70%,在不同倾斜率下的实验结果如图2所示.横轴表示倾斜率取值,纵轴表示整个作业运行总时间.系统自动确定的Reducer数目为5,从图2可以看出,当数据分布接近均匀时,
key-cost partition算法和rangepartition算法相对于IRJ算法时间性能不是很明显;而当倾斜率增加到一定程度,key-cost partition算法和rangepartition算
法拥有非常好的时间性能,算法稳定性较好.而IRJ算法的执行时间增长很快.这是
因为当数据分布接近均匀时,key-cost partition算法和rangepartition算法相
对于IRJ算法较为复杂,其负载均衡策略带来的时间优势不是很明显,导致执行稍慢.而随着数据倾斜率的上升,IRJ分区算法因负载不均衡导致性能下降很快,而key-cost partition算法的时间优势则越来越明显.
对倾斜率α=1时不同reduce上的数据处理量进行统计,结果如图3所示.从该图能看出key-cost partition算法各个reduce上的负载量基本相同,而rangepartition算法与IRJ算法各个reduce上的数据负载量相差太多,增加了整个作业的运行时间.
本文所提出的key-cost分区算法在原系统的基础上增加了采样和代价计算模块,在时间与资源上增加了消耗,因此采样比例的变化对系统性能会产生一定影响,如图4所示,倾斜率不变时,当采样率从50%增加到70%时,查询时间显著降低,而当采样率从70%增加到90%时,查询时间反而增加.这是因为,通过对数据的采样而制定的划分方案能更好地指导Reduce分区,使系统负载均衡,效率提高.而
当采样比例增大到一定程度,对样本统计和key代价计算的时间也相应增加,制
定出划分函数的时间更晚,Map端产生中间结果后,还要等待JobTracker返回
划分函数后再对中间结果进行划分,延迟了Reduce任务的执行,时间性能反而
下降.
图3 三种分区算法各Reduce上数据量Fig.3 Three partitioning algorithms
on the amount of data on each Reduce图4 不同采样比例对key-cost算法的影响Fig.4 Influence of different sampling rates on the performance of
key-cost algorithm
针对由数据倾斜引起的MapReduce连接查询中Reducer节点负载不均衡问题,本文设计的基于key代价的负载均衡等值连接算法可以有效解决这个问题.但从实
验结果可以发现,本文所提算法在具有一定倾斜度的大数据的连接操作中具有较好的负载均衡效果,充分发挥MapReduce框架并行计算能力,提升连接操作性能.
5 结束语
本文针对连接操作中的负载不均衡问题,对Reducer节点的负载代价进行了分析,提出一种基于key代价的负载均衡等值连接算法.通过采样技术获取原始数据的分
布情况按照key值建立key分区,并计算各key分区代价,根据key代价信息确定动态划分函数,指导reduce分区.实验结果表明,我们的方法在大规模数据集连接操作上能够实现更好的负载均衡,具有更高的处理效率.本文主要考虑集群中数据的负载均衡程度,对于额外增加的计算量没有做进一步的分析,下一步我们将对MapReduce连接查询优化做更全面的研究.
参考文献:
【相关文献】
[1] DEAN J,GHEMAWAT S.MapReduce:Simplified data processing on large
clusters[J].Communications of the ACM,2008,51(1):107-113.
[2] 梁俊杰,何利民.基于MapReduce的数据倾斜连接算法[J].计算机科学,2016,43(9):27-31.
[3] BLANAS S,PATEL J M,ERCEGOVAC V,et al.A comparison of join algorithms for log processing in MaPreduce[C]// Proc.2010 International Conference on Management of Data,New York,NY,USA.2010:975-986.
[4] YANG H C,DASDAN A,HSIAO R L,et al.Map-reduce-merge:simplified relational data processing on large clusters[C]// ACM SIGMOD International Conference on Management of Data.ACM,2007:1029-1040.
[5] YANG H,PARKER D S.Traverse:Simplified Indexing on Large Map-Reduce-Merge Clusters[C]// Database Systems for Advanced Applications,International Conference,DASFAA 2009,Brisbane,Australia,April 21-23,2009.Proceedings.DBLP,2009:308-322.
[6] JIANG D,TUNG A K H,CHEN G.MAP-JOIN-REDUCE:Toward Scalable and Efficient Data Analysis on Large Clusters[J].IEEE Transactions on Knowledge & Data
Engineering,2011,23(9):1299-1311.
[7] DITTRICH J,JINDAL A,KARGIN Y,et al.Hadoop++:making a yellow elephant run like a cheetah (without it even noticing)[J].Proceedings of the Vldb Endowment,2010,3(1/2):515-529.
[8] LIN Y,AGRAWAL D,CHEN C,et al.Llama:leveraging columnar storage for scalable join processing in the MapReduce framework[J].IEEE Transactions on Systems Man & Cybernetics Systems,2011,45(11):1-1.
[9] 翟红敏,刘国华,赵威,等.MapReduce中连接负载均衡优化研究[J].计算机工程与科
学,2014,36(10):1860-1865.
[10] 罗永青.基于Key值解决MapReduce中Reduce负载不均衡算法[D].淮南:安徽理工大学,2017.
[11] 张敬伟,尚宏佳,钱俊彦,等.非均匀数据分布下的MapReduce连接查询算法优化[J].计算机科学与探索,2017,11(5):752-767.
[12] 陶永才,丁雷道,石磊,等.MapReduce在线抽样分区负载均衡研究[J].小型微型计算机系
统,2017,38(2):238-242.
[13] 周娅,魏夏飞,熊晗,等.CSPRJ:基于数据倾斜的MapReduce连接查询算法[J].小型微型计算机系统,2018(2):367-371.
[14] LMMEL R.Google’s MapReduce programming model—Revisited[J].Science of Computer Programming,2008,70(1):1-30.
[15] ARMBRUST,MICHAEL,FOX,et al.Above the Clouds:A Berkeley View of Cloud Computing[J].Eecs Department University of California Berkeley,2009,53(4):50-58.。