专利名称:一种hdfs运行时数据块平衡方法
一种HDFS运行时数据块平衡方法技术领域
本发明属于计算机技术领域,涉及一种数据块平衡方法,尤其是一种云计算环境下HDFS (Hadoop Distributed File System)在运行过程中数据块平衡方法。
背景技术:
Hadoop是由Apache开源组织开发的一个高可靠性和高可扩展性的存储与分布式并行计算平台,最早是作为开源搜索引擎项目Nutch的基础平台而开发的,之后从Nutch项目中独立出来,成为典型的开源云计算平台之一。Hadoop核心实现了按块存储的分布式文件系统(Hadoop Distributed File System,HDFS)以及用于分布式计算的MapReduce计算模型。HDFS为Hadoop集群提供由众多节点组成的存储系统,在存储大规模数据文件时,会将文件切分成多个相同大小的数据块(最后一份数据块例外),分布在集群中所有节点上。 为了保证可靠性,HDFS会依据配置为每一份数据块创建多个副本,并放置在集群的不同节点上。HDFS为上层MapReduce计算引擎提供数据存储服务。Hadoop MapReduce将应用划分成许多小任务并行执行,每个小任务就对计算节点本地存储的数据块进行处理。
HDFS文件系统采用分块机制分布式存储数据集,并通过数据块冗余策略来提高系统可靠性,每个数据块在系统中都有多个副本同时存在,这些副本分布在系统中多个机架内的多个节点上,防止因单个节点出现故障造成数据块的丢失。此外,这种分布式冗余机制能保证文件的并发读取,使得HDFS更适合“一次写,多次读”的数据处理模式。为实现这种数据块冗余策略,HDFS文件系统在写入数据时必须保证有多个副本同时写入。
HDFS文件系统在写入数据流时需先通过NameNode获取多个节点构成节点管线, 当数据流到达管线中的第一个节点时,该节点存储数据并发送给管线中的第二个节点。同样的,第二个节点存储数据并发送给管线中的第三个节点……以此类推,完成多份副本的写入。
HDFS文件系统在放置数据块及其副本时综合考虑以下几点
I)当提交数据的节点也是HDFS文件系统中存储数据块的节点时,该节点上放置一份数据块的备份;
2)—个数据块的备份必须分布在多个机架上,避免单个机架故障导致整个数据不可用;
3)与提交数据节点处于同一个机架内的其他节点上也必须有数据块的备份,这样可以尽量减少机架间的通信和IO开销;
4)在满足前面条件的前提下兼顾考虑节点存储空间的使用率,尽可能保证各个节点存储使用率平衡。
Hadoop Map阶段是整个MapReduce作业执行的第一阶段,主要完成将外部输入数据转化为〈Key,Value)形式的中间数据,提供给后续Reduce阶段作为输入数据。分布式并行处理环境下,Hadoop Map阶段使用分布式文件系统HDFS作为输入数据源,并在“移动计算比移动数据更经济”的指导原则下,将用户在提交作业时指定的Map处理过程分配到各个HDFS数据块存储节点上执行。当某个节点被分配的处理过程所需的输入数据刚好在该节点上存储时,称该处理过程满足数据本地性。
Hadoop MapReduce通过节点任务请求分配机制避免了多个数据块副本重复处理的问题。但从Hadoop Map阶段执行过程的分析可知,Map任务输入数据的本地性对Map任务的执行速率也会产生很大影响。当Map输入数据与Map任务执行在同一个节点上时将节省数据块网络传输开销,提高Map任务执行速率。在现有Hadoop体系结构中,HDFS数据块副本的分布状态通过Hadoop任务调度器直接影响Map任务输入数据的本地性。
因此,现有的HDFS数据块放置策略虽然能保证各个节点间的数据块数量大致平衡,但由于某些数据块副本的分布不合理,导致某些节点“窃取”其他节点的本地Map任务后,其他节点由于本地Map任务被分配同样需要“任务窃取”,这种“任务分配偏移”现象进一步加大了 Map阶段非本地数据的传输量,给整个网络带来巨大的传输压力,影响整个阶段的运行效率。此外,当节点间数据块数目平衡时,节点任务处理速率不同也会导致出现较大程度的非本地化任务处理。发明内容
本发明的目的在于解决由于HDFS数据块分布不均匀而导致的Map阶段map任务数据本地性较低的问题,提供一种HDFS运行时数据块平衡方法,该方法提出基于运行时数据块移动HDFS平衡策略,通过预测节点任务请求提前判断可能出现的非本地map任务执行,并在相应的节点间移动合适的数据块,使得节点发出实际任务请求时候能够得到本地 map任务的分配响应,从而提高Map阶段的完成效率。
本发明的目的是通过以下技术方案来解决的
这种HDFS运行时数据块平衡方法,包括以下步骤
I)节点本地任务列表预处理
I. I提出完全本地任务和非完全本地任务当HDFS的各个数据块存在多个副本的时候,导致同一个任务会出现在不同节点的本地Map任务列表中,从而某个节点本地任务列表中剩余的map任务数η,意味着该节点能够分配执行的本地任务数是η ;
I. 2节点本地任务列表的预处理过程当各个节点依次发出任务请求时,从节点的本地任务列表中获取当前可执行的任务加入到节点的完全本地任务列表中,而本地任务列表中未被分配的任务则加入到非完全本地任务列表中;
2)节点运行时信息统计
通过设计NodeEvaluateInfo类来实现在该类中统计节点已经处理的数据块总数sum、节点已处理数据块总耗时cost和作业的执行进度tip,知道以上信息后计算节点平均块处理时间cost/sum、节点当前运行任务剩余时间(1-tip) / (cost/sum);
3)节点速率评估与任务请求序列预测
3. I节点速率的评估由步骤2),采用COSIVNUMi来表示各个节点的数据处理速率,即节点处理单个任务的平均耗时;其中,NUMi为某一时刻节点i已完成的本地map任务数,COSTi为处理这些本地任务所花费的总耗时;
3. 2系统任务请求序列的预测系统任务请求序列即从当前时刻开始到作业完成时为止,各个从节点向主节点申请任务执行的时刻序列;在!'(|时刻,节点i正处理任务的进度为Pi,通过前面速率评估公式得到的节点处理单个数据块平均耗时为Ti,则该节点的第K 次任务请求时间点tik为
T0+(I-Pi) XTi+(k-l) XTi k 彡 I ;
其中k表示从当前时刻算起该节点第k次任务请求;获取各个节点的任务请求序列后,采用如下方式确定系统任务请求序列记系统剩余任务数为m,系统中节点数为n,对每个节点i,取其从当前时刻算起m次任务请求的时间点,记为{tn, ti2,…tim},n个节点将构成nXm个时间点{t11,t12,· · · tim t21,t22,··· t2m,···,tnl,tn2, -tj ;将所有时间点按升序排列,取前m个,则可得到从当前时刻开始对系统中剩余m个任务的请求序列Rm. Rm(J-)^ik 即表明系统中第j个任务请求将由节点i在tik时刻发出,且该请求是节点i的第k个请求;
4)节点任务的分配分析与实现在步骤3)预测的节点请求序列下提前确定各个节点的任务分配情况;
5)数据块移动节点对的选择从任务请求序列中获取发出请求的节点,接着从该节点的本地任务列表中获取任务,如果任务为空,则认定该节点是待平衡节点,将其加入到待平衡节点列表中;数据块移动节点对选择过程的第一步是遍历allocate数组,构建映射表Map〈node, List<Task>>,记录所有数据块源节点上的所有未分配任务;
6 )节点间数据块的移动
确定好待平衡节点和数据块源节点后便可进行实际的数据块移动;由于数据块移动与节点任务执行相互独立且考虑到可能有多个数据块需要移动,为提高效率以及简化编程实现,采用JAVA线程池技术实现整个数据块移动。
进一步的,以上步骤4)中,模拟Hadoop调度器在当前预测的系统任务请求序列Rm下的响应过程;依据各个节点的请求时机以及系统当前任务分配情况,确定对该请求的任务分配响应并判断该任务分配是否满足任务本地性;确定任务的分配记录通过 AllocatedRecord类实现,该类通过记录任务的分配标志、分配给的节点编号、分配的时间和该任务对应的数据块是否已加入代交换列表;节点任务请求记录,记录发出该请求的节点以及该请求在这个节点从当前时刻往后所有请求中的次序;最后根据步骤3)中确定的系统任务请求序列Rm,其中的第j个请求Rm(j)=tik由节点i在tik时刻发出,且该请求是节点i的第k个请求;通过遍历任务请求序列Rm,对系统中出现的第j个任务请求,从节点i 的本地Map任务列表中第k个任务task(i,k)开始,查找第一个可调度的本地Map任务;判断可调度的本地Map任务依据是
7)task(i,k)不为空;
8) allocate[task(i;k). id] = =_1,即该任务没有被调度器分配给其他的节点;
当task(i,k+m|m>cl)满足任务本地性时,设置相应任务的分配记录 allocate [task(i;k). id]=i,结束对第j个任务请求的分析;否则当task(i,k+m|m >不为空,将task(i,k+m|m>cl)添加到该节点的可交换任务队列中,判断下一个本地Map任务 task(i;k+m+1|m&0);当task(i;k+m|m&0)为空时,根据节点i及其交换任务队列构建待平衡节点对象BalanceNode并记录在待平衡节点列表中。
进一步的,上述步骤5)具体过程是对于每一个未分配的任务task,获取其数据块副本存储节点集,将数据块副本存储节点集中的节点和任务按〈Node,List<Task>>的形式放入映射表中,同一 node在List〈Task>尾部添加task ;在获取所有数据块源节点后,对于待平衡节点列表中的每一个待平衡节点,通过遍历映射表,找到第一个与待平衡节点位于同一机架内的数据块源节点;构造数据块移动请求并提交;判断两个节点位于同一机架内的依据是二者的节点名前缀一致;当无法找到与待平衡节点位于同一个机架内的数据块源节点时,选择映射表中第一个数据块源节点。
本发明的有益效果是
本发明针对Hadoop作业在Map阶段运行过程中不同节点处理数据块的差异,通过移动数据块使得数据块分布更符合各个节点性能,不仅可以减少后续运行在该数据集上类似作业的非本地Map任务分配,提高Map任务本地性,促进各个节点在Map阶段任务执行平衡,而且也能改善当前运行作业在Map阶段后续过程中的任务平衡。在Hadoop Map阶段, 各个Map任务的执行彼此间是完全独立的。各个Map任务在处理本地Map任务时,仅需要从本地磁盘上获取数据,除向JobTracker节点报告自身处理进度外几乎不需要任何网络通信。因此,在节点处理本地Map任务时,移动数据块对整个网络造成的压力较小。
图I是节点任务分配分析过程类图2是节点任我分配分析流程图3是待平衡节点与待分配任务匹配图4是数据块移动节点对匹配流程图5是数据块移动线程池框架;
图6是数据块移动线程池类图7是节点间数据块移动。
具体实施方式
下面结合附图对本发明作详细描述。
基于运行时数据块移动的HDFS数据块平衡策略,其具体实现步骤如下
第一步,节点本地任务列表预处理。对各个节点的本地任务列表进行预处理,将其划分为完全本地任务部分和非完全本地任务部分。所有节点的完全本地任务部分实现了对输入数据集的一个完整处理,且彼此间没有任务交集。理想情况下,如果各个节点同时分配完完全本地任务,则HDFS数据块分布是符合调度器对各个节点的分配,即HDFS数据块放置是均衡的。此时可通过预测节点未来的任务请求来确定冲突任务分配,并以此判断可能出现的非本地任务分配,为平衡HDFS数据块放置提供可靠的依据。对节点本地任务列表的预处理采用模拟JobTracker调度分配任务过程。各个节点任务处理速率相同,当各个节点将依次发出任务请求,预处理过程响应节点请求,从节点的本地任务列表中获取当前可执行的任务加入到节点的完全本地任务列表中,而本地任务列表中未被分配的任务则加入到非完全本地任务列表中。可执行的本地任务即该任务还未有在其他副本存储节点上执行。
第二步,节点运行时信息统计。本发明在系统设计中采用NodeEvaluateInfo类表示,在该类中统计节点已经处理的数据块总数sum、节点已处理数据块总耗时cost和作业的执行进度tip,知道以上信息后可以计算节点平均块处理时间cost/sum、节点当前运行任务剩余时间(1-tip) / (cost/sum);
第三步,节点速率评估与任务请求序列预测。I)节点速率评估。本发明提出一种节点速率评估方案,利用前面收集到的节点统计信息,采用COSIVNUMi来表示各个节点的数据处理速率,即节点处理单个任务的平均耗时。其中,NUMiS某一时刻节点i已完成的本地map任务数,COSTi为处理这些本地任务所花费的总耗时;2)系统任务请求序列预测。系统任务请求序列即从当前时刻开始到作业完成时为止,各个从节点向主节点申请任务执行的时刻序列。理论上讲,该序列只有在作业完成后才可准确获知,在作业运行过程中可以基于节点数据处理速率和节点当前处理任务的进度进行预测;假设在Ttl时刻,节点i正处理任务的进度为Pi,通过前面速率评估公式得到的节点处理单个数据块平均耗时为Ti,则该节点的第K次任务请求时间点tik为
T0+(I-Pi) XTi+(k-1) XTi k 彡 I
其中k表示从当前时刻算起该节点第k次任务请求。
获取各个节点的任务请求序列后,可以采用如下方式确定系统任务请求序列。
记系统剩余任务数为m,系统中节点数为η,对每个节点i,取其从当前时刻算起m次任务请求的时间点,记为{tn, ti2,…tim}, η个节点将构成nXm个时间点{tn, t!2,· · · t]_m,七21,七22, ^2m · · ·, tnl, tn2, -U。将所有时间点按升序排列,取前m个,则可得到从当前时刻开始对系统中剩余m个任务的请求序列Rm. Rm(j)=tik即表明系统中第j个任务请求将由节点i在tik时刻发出,且该请求是节点i的第k个请求。
此过程的形式化描述为已知整数序列A= {a” a2, · · · aj,B=Ib1, b2, -bj,构造整数集合C=Ici I Cfadl^bi, k彡ο},求升序排列C的前m个有序数。
第四步,节点任务分配分析。
I)节点任务分配过程设计。节点任务分配分析过程实质上是模拟Hadoop调度器在当前预测的系统任务请求序列Rm下的响应过程。依据各个节点的请求时机以及系统当前任务分配情况,确定对该请求的任务分配响应并判断该任务分配是否满足任务本地性。当某个节点的任务请求不能得到本地Map任务分配响应时,该节点即为待平衡节点。节点任务分配相关类图如图I所示。节点任务请求记录NodeRequest。节点任务分配分析是模拟 Hadoop任务调度器在当前预测的系统任务请求序列下的响应过程,而NodeRequest则描述模拟过程中的一个节点任务请求,其中主要记录了发出该请求的节点,以及该请求在这个节点从当前时刻往后所有请求中的次序。
2)节点任务分配过程实现。节点任务分配分析是在预测的节点请求序列下提前确定各个节点的任务分配情形,其具体流程如错误!未找到引用源。2所示。根据前面的描述,系统任务请求序列Rm中的第j个请求Rm (j) =tik由节点i在tik时刻发出,且该请求是节点i的第k个请求。通过遍历任务请求序列Rm,对系统中出现的第j个任务请求,从节点i 的本地Map任务列表中第k个任务task(i,k)开始,查找第一个可调度的本地Map任务。判断可调度的本地Map任务依据是
(I) task(i k)不为空;
(2) allocate[task(i;k). id]==_l,即该任务没有被调度器分配给其他的节点。当 task(i;k+m|m&0)满足任务本地性时,设置相应任务的分配记录allocate[task(i,k). id]=i,结束对第j个任务请求的分析。否则当task(i,k+m|m>(l)不为空,将task(i,k+m|m>(l)添加到该节点的可交换任务队列中,判断下一个本地Map任务task(i,k+m+l|m>(l)。当task(i,k+m|m>(l)为空时, 根据节点i及其交换任务队列构建待平衡节点对象BalanceNode并记录在待平衡节点列表中。完成全部任务请求的分析后,如果HDFS数据块放置不均衡,则待平衡节点列表不空且 allocate数组中部分任务分配记录仍为_1。此时待平衡节点个数与allocate数组中未分配项数目相同,且未分配的任务不是任何一个待平衡节点上的本地Map任务,否则在前面的节点任务分配过程中必定会有节点被分配该任务。
第五步,数据块移动节点对选择。在完成节点任务分配分析后便可在待平衡节点和未分配任务输入数据块所在的存储节点间移动数据块。确定数据块源节点与移动数据块的过程如图3所示。在选择匹配待平衡节点与未分配任务时要有所约束和限制的。(I)交换节点是在未分配任务的多个副本数据块的存储节点中选择。为减少通信开销,优先选择与待平衡节点在同一个机架内的副本存储节点;(2)应尽可能的避免多个待平衡节点与同一个数据块存储节点间进行数据块传输。
为加快节点间的匹配过程,本发明采用贪心算法,首先解析出所有未分配任务的数据块存储节点,随后在待平衡节点集合和存储节点集之间查找可能的匹配组合,一旦发现某对待平衡节点与未分配任务数据块存储节点之间满足前面的约束条件,便确定 二者的匹配关系,不再查找其他可能的更优匹配结果。此过程的算法时间复杂度为O (N),其中N为待平衡节点数。具体的节点匹配过程如错误!未找到引用源。所示。
数据块移动节点对选择过程的第一步是遍历al locate数组,构建映射表 Map〈node, List〈Task>>,记录所有数据块源节点上的所有未分配任务。具体过程是对于每一个未分配的任务task,获取其数据块副本存储节点集moveableNodes,将movableNodes 中的节点和task按〈Node, List〈Task>>的形式放入映射表nodeToTasks,同一 node在 List<Task> 尾部添加 task。
在实现中选择java. util. LinkedHashMap作为nodeToTasks的类型。该类的基本特点是依据访问顺序对映射表中的键值对进行迭代,当访问某一个键值对后,该键值对将放到链表的尾部。使用LinkedHashMap可以有效避免多个待平衡节点与同一个数据源节点之间进行数据块移动。
在获取所有数据块源节点后,对于待平衡节点列表中的每一个待平衡节点,通过遍历nodeToTasks,找到第一个与待平衡节点位于同一机架内的数据块源节点。构造数据块移动请求并提交。判断两个节点位于同一机架内的依据是二者的节点名前缀一致,如节点 /rack-A/node01与节点/rack_A/node02位于同一机架内。当无法找到与待平衡节点位于同一个机架内的数据块源节点时,选择nodeToTask中第一个数据块源节点。
第六步,节点间数据块移动。确定好待平衡节点和数据块源节点后便可进行实际的数据块移动。由于数据块移动与节点任务执行相互独立且考虑到可能有多个数据块需要移动,为提高效率以及简化编程实现,采用JAVA线程池技术实现数据块移动模块,如错误! 未找到引用源。所示。每个数据块移动任务等待线程池中空闲线程的调用执行,任务执行结束后,线程重返线程池,接受下一个任务的执行。I)线程池设计。线程池相关类图如图6所示;2)数据块移动任务。每一个任务对应一份数据块,根据待平衡节点的任务分配记录,可依据任务编号解析出对应数据块并选择本地Map任务列表中索引最大的节点作为目的节点。每个数据块移动请求都封装成一个MoveTask类,其中包含了需要移动的数据块Block以及数据块源节点和目的节点BalanceNode。数据块移动任务Transfer通过实现java. lang. Runnable接口,在run O方法中实现数据块移动逻辑。其流程图如图7所示。
对每一个数据块移动请求,Tracnsfer从中解析出数据块对象以及数据块源节点和目的节点,向目的节点发送数据块置换指令0P_REPLACE_BL0CK,由目的节点向源节点发送0P_C0PY_BL0CK指令并完成数据块的传输。数据块拷贝成功后,目的节点通知NameNode 删除源节点上该数据块的拷贝。
权利要求
1. 一种HDFS运行时数据块平衡方法,其特征在于,包括以下步骤1)节点本地任务列表预处理I. I提出完全本地任务和非完全本地任务当HDFS的各个数据块存在多个副本的时候,导致同一个任务会出现在不同节点的本地Map任务列表中,从而某个节点本地任务列表中剩余的map任务数η,意味着该节点能够分配执行的本地任务数是η ;1.2节点本地任务列表的预处理过程当各个节点依次发出任务请求时,从节点的本地任务列表中获取当前可执行的任务加入到节点的完全本地任务列表中,而本地任务列表中未被分配的任务则加入到非完全本地任务列表中;2)节点运行时信息统计通过设计NodeEvaluateInfo类来实现在该类中统计节点已经处理的数据块总数 sum、节点已处理数据块总耗时cost和作业的执行进度tip,知道以上信息后计算节点平均块处理时间cost/sum、节点当前运行任务剩余时间(1-tip) / (cost/sum);3)节点速率评估与任务请求序列预测3. I节点速率的评估由步骤2),采用COSIVNUMi来表示各个节点的数据处理速率,即节点处理单个任务的平均耗时;其中,NUMi为某一时刻节点i已完成的本地map任务数, COSTi为处理这些本地任务所花费的总耗时;3. 2系统任务请求序列的预测系统任务请求序列即从当前时刻开始到作业完成时为止,各个从节点向主节点申请任务执行的时刻序列;在Ttl时刻,节点i正处理任务的进度为 Pi,通过前面速率评估公式得到的节点处理单个数据块平均耗时为Ti,则该节点的第K次任务请求时间点 tik 为 V(I-Pi) XTi+(k-l) XTi k ^ I ;其中k表示从当前时刻算起该节点第k次任务请求;获取各个节点的任务请求序列后, 采用如下方式确定系统任务请求序列记系统剩余任务数为m,系统中节点数为n,对每个节点i,取其从当前时刻算起m次任务请求的时间点,记为{tn, ti2,…tim}, η个节点将构成 nXm个时间点{tn,七12,…t!m,七21,七22,… t2m>…,tnl, tn2, *·· t*};将所有时间点按升序排列, 取前m个,则可得到从当前时刻开始对系统中剩余m个任务的请求序列Rm. Rm(j)=tik即表明系统中第j个任务请求将由节点i在tik时刻发出,且该请求是节点i的第k个请求;4)节点任务的分配分析与实现在步骤3)预测的节点请求序列下提前确定各个节点的任务分配情况;5)数据块移动节点对的选择从任务请求序列中获取发出请求的节点,接着从该节点的本地任务列表中获取任务,如果任务为空,则认定该节点是待平衡节点,将其加入到待平衡节点列表中;数据块移动节点对选择过程的第一步是遍历allocate数组,构建映射表 Map〈node, List〈Task>>,记录所有数据块源节点上的所有未分配任务;6)节点间数据块的移动确定好待平衡节点和数据块源节点后便可进行实际的数据块移动;由于数据块移动与节点任务执行相互独立且考虑到可能有多个数据块需要移动,为提高效率以及简化编程实现,采用JAVA线程池技术实现整个数据块移动。
2.根据权利要求I所述的HDFS运行时数据块平衡方法,其特征在于,步骤4)中,模拟 Hadoop调度器在当前预测的系统任务请求序列Rm下的响应过程;依据各个节点的请求时机以及系统当前任务分配情况,确定对该请求的任务分配响应并判断该任务分配是否满足任务本地性;确定任务的分配记录通过AllocatedRecord类实现,该类通过记录任务的分配标志、分配给的节点编号、分配的时间和该任务对应的数据块是否已加入代交换列表;节点任务请求记录,记录发出该请求的节点以及该请求在这个节点从当前时刻往后所有请求中的次序;最后根据步骤3)中确定的系统任务请求序列Rni,其中的第j个请求Rjjktik由节点i在tik时刻发出,且该请求是节点i的第k个请求;通过遍历任务请求序列Rm,对系统中出现的第j个任务请求,从节点i的本地Map任务列表中第k个任务task(i,k)开始,查找第一个可调度的本地Map任务;判断可调度的本地Map任务依据是a)task(i,k)不为空;b)allocate[task(i;k).id]==_l,即该任务没有被调度器分配给其他的节点;当task(i,k+m|m>(l)满足任务本地性时,设置相应任务的分配记录allocate [task(i,k). id] =i,结束对第j个任务请求的分析;否则当task(i,k+m|m>(l)不为空,将task(i,k+m|m>(l)添加到该节点的可交换任务队列中,判断下一个本地Map任务task(i,k+m+l|m>(l);当task(i;k+m|m&0) 为空时,根据节点i及其交换任务队列构建待平衡节点对象BalanceNode并记录在待平衡节点列表中。
3.根据权利要求I或2所述的HDFS运行时数据块平衡方法,其特征在于,步骤5)具体过程是对于每一个未分配的任务task,获取其数据块副本存储节点集,将数据块副本存储节点集中的节点和任务按〈Node, List〈Task>>的形式放入映射表中,同一 node在 List<Task>尾部添加task ;在获取所有数据块源节点后,对于待平衡节点列表中的每一个待平衡节点,通过遍历映射表,找到第一个与待平衡节点位于同一机架内的数据块源节点; 构造数据块移动请求并提交;判断两个节点位于同一机架内的依据是二者的节点名前缀一致;当无法找到与待平衡节点位于同一个机架内的数据块源节点时,选择映射表中第一个数据块源节点。
全文摘要
本发明公开了一种HDFS运行时数据块平衡方法,该方法首先对节点本地任务列表进行预处理,为每一个节点划分出完成本地任务和非完全本地任务,以提供启动HDFS数据块平衡判断的依据。接着对各个节点的运行速率就行评估和任务请求预测。完成以上步骤之后对各个节点的分配过程进行设计和实现。之后选择合适的节点间进行数据块的移动,从而数据块的分布就可以匹配预测的节点任务请求序列,最终达到数据块平衡的目的。本发明提出基于运行时数据块移动HDFS平衡策略,通过预测节点任务请求提前判断可能出现的非本地map任务执行,并在相应的节点间移动合适的数据块,使得节点发出实际任务请求时候能够得到本地map任务的分配响应,从而提高Map阶段的完成效率。
文档编号G06F17/30GK102937918SQ20121039317
公开日2013年2月20日 申请日期2012年10月16日 优先权日2012年10月16日
发明者曹海军, 伍卫国, 董小社, 樊源泉, 魏伟, 朱霍 申请人:西安交通大学