《一种HDFS运行时数据块平衡方法.pdf》由会员分享,可在线阅读,更多相关《一种HDFS运行时数据块平衡方法.pdf(14页珍藏版)》请在专利查询网上搜索。
1、(10)申请公布号 CN 102937918 A (43)申请公布日 2013.02.20 C N 1 0 2 9 3 7 9 1 8 A *CN102937918A* (21)申请号 201210393176.9 (22)申请日 2012.10.16 G06F 9/50(2006.01) G06F 17/30(2006.01) (71)申请人西安交通大学 地址 710049 陕西省西安市咸宁西路28号 (72)发明人曹海军 伍卫国 董小社 樊源泉 魏伟 朱霍 (74)专利代理机构西安通大专利代理有限责任 公司 61200 代理人徐文权 (54) 发明名称 一种HDFS运行时数据块平衡方法 (。
2、57) 摘要 本发明公开了一种HDFS运行时数据块平衡 方法,该方法首先对节点本地任务列表进行预处 理,为每一个节点划分出完成本地任务和非完全 本地任务,以提供启动HDFS数据块平衡判断的依 据。接着对各个节点的运行速率就行评估和任务 请求预测。完成以上步骤之后对各个节点的分配 过程进行设计和实现。之后选择合适的节点间进 行数据块的移动,从而数据块的分布就可以匹配 预测的节点任务请求序列,最终达到数据块平衡 的目的。本发明提出基于运行时数据块移动HDFS 平衡策略,通过预测节点任务请求提前判断可能 出现的非本地map任务执行,并在相应的节点间 移动合适的数据块,使得节点发出实际任务请求 时候能。
3、够得到本地map任务的分配响应,从而提 高Map阶段的完成效率。 (51)Int.Cl. 权利要求书2页 说明书7页 附图4页 (19)中华人民共和国国家知识产权局 (12)发明专利申请 权利要求书 2 页 说明书 7 页 附图 4 页 1/2页 2 1.一种HDFS运行时数据块平衡方法,其特征在于,包括以下步骤: 1)节点本地任务列表预处理 1.1提出完全本地任务和非完全本地任务:当HDFS的各个数据块存在多个副本的时 候,导致同一个任务会出现在不同节点的本地Map任务列表中,从而某个节点本地任务列 表中剩余的map任务数n,意味着该节点能够分配执行的本地任务数是n; 1.2节点本地任务列表。
4、的预处理过程:当各个节点依次发出任务请求时,从节点的本 地任务列表中获取当前可执行的任务加入到节点的完全本地任务列表中,而本地任务列表 中未被分配的任务则加入到非完全本地任务列表中; 2)节点运行时信息统计 通过设计NodeEvaluateInfo类来实现:在该类中统计节点已经处理的数据块总数 sum、节点已处理数据块总耗时cost和作业的执行进度tip,知道以上信息后计算节点平均 块处理时间cost/sum、节点当前运行任务剩余时间(1-tip)/(cost /sum); 3)节点速率评估与任务请求序列预测 3.1节点速率的评估:由步骤2),采用COST i /NUM i 来表示各个节点的数。
5、据处理速率,即 节点处理单个任务的平均耗时;其中,NUM i 为某一时刻节点i已完成的本地map任务数, COST i 为处理这些本地任务所花费的总耗时; 3.2系统任务请求序列的预测:系统任务请求序列即从当前时刻开始到作业完成时为 止,各个从节点向主节点申请任务执行的时刻序列;在T 0 时刻,节点i正处理任务的进度为 P i ,通过前面速率评估公式得到的节点处理单个数据块平均耗时为T i ,则该节点的第K次任 务请求时间点t ik 为T 0 +(1-P i )T i +(k-1)T i k1; 其中k表示从当前时刻算起该节点第k次任务请求;获取各个节点的任务请求序列后, 采用如下方式确定系统。
6、任务请求序列:记系统剩余任务数为m,系统中节点数为n,对每个 节点i,取其从当前时刻算起m次任务请求的时间点,记为t i1 ,t i2 ,t im ,n个节点将构成 nm个时间点t 11 ,t 12 ,t 1m ,t 21 ,t 22 ,t 2m ,t n1 ,t n2 ,t nm ;将所有时间点按升序排列, 取前m个,则可得到从当前时刻开始对系统中剩余m个任务的请求序列R m R m (j)=t ik 即表 明系统中第j个任务请求将由节点i在t ik 时刻发出,且该请求是节点i的第k个请求; 4)节点任务的分配分析与实现:在步骤3)预测的节点请求序列下提前确定各个节点 的任务分配情况; 5)。
7、数据块移动节点对的选择:从任务请求序列中获取发出请求的节点,接着从该节点 的本地任务列表中获取任务,如果任务为空,则认定该节点是待平衡节点,将其加入到待平 衡节点列表中;数据块移动节点对选择过程的第一步是遍历allocate数组,构建映射表 Map,记录所有数据块源节点上的所有未分配任务; 6)节点间数据块的移动 确定好待平衡节点和数据块源节点后便可进行实际的数据块移动;由于数据块移动与 节点任务执行相互独立且考虑到可能有多个数据块需要移动,为提高效率以及简化编程实 现,采用JAVA线程池技术实现整个数据块移动。 2.根据权利要求1所述的HDFS运行时数据块平衡方法,其特征在于,步骤4)中,模。
8、拟 Hadoop调度器在当前预测的系统任务请求序列R m 下的响应过程;依据各个节点的请求时 机以及系统当前任务分配情况,确定对该请求的任务分配响应并判断该任务分配是否满足 权 利 要 求 书CN 102937918 A 2/2页 3 任务本地性;确定任务的分配记录:通过AllocatedRecord类实现,该类通过记录任务的分 配标志、分配给的节点编号、分配的时间和该任务对应的数据块是否已加入代交换列表;节 点任务请求记录,记录发出该请求的节点以及该请求在这个节点从当前时刻往后所有请求 中的次序;最后根据步骤3)中确定的系统任务请求序列R m ,其中的第j个请求R m (j)=t ik 由 。
9、节点i在t ik 时刻发出,且该请求是节点i的第k个请求;通过遍历任务请求序列R m ,对系统 中出现的第j个任务请求,从节点i的本地Map任务列表中第k个任务task (i,k) 开始,查找 第一个可调度的本地Map任务;判断可调度的本地Map任务依据是: a)task (i,k) 不为空; b)allocatetask (i,k) .id=-1,即该任务没有被调度器分配给其他的节点; 当task (i,k+m|m0) 满足任务本地性时,设置相应任务的分配记录allocatetask (i,k) . id=i,结束对第j个任务请求的分析;否则当task (i,k+m|m0) 不为空,将tas。
10、k (i,k+m|m0) 添加 到该节点的可交换任务队列中,判断下一个本地Map任务task (i,k+m+1|m0) ;当task (i,k+m|m0) 为空时,根据节点i及其交换任务队列构建待平衡节点对象BalanceNode并记录在待平衡 节点列表中。 3.根据权利要求1或2所述的HDFS运行时数据块平衡方法,其特征在于,步骤5)具 体过程是:对于每一个未分配的任务task,获取其数据块副本存储节点集,将数据块副本 存储节点集中的节点和任务按的形式放入映射表中,同一node在 List尾部添加task;在获取所有数据块源节点后,对于待平衡节点列表中的每一个 待平衡节点,通过遍历映射表,找。
11、到第一个与待平衡节点位于同一机架内的数据块源节点; 构造数据块移动请求并提交;判断两个节点位于同一机架内的依据是二者的节点名前缀一 致;当无法找到与待平衡节点位于同一个机架内的数据块源节点时,选择映射表中第一个 数据块源节点。 权 利 要 求 书CN 102937918 A 1/7页 4 一种 HDFS 运行时数据块平衡方法 技术领域 0001 本发明属于计算机技术领域,涉及一种数据块平衡方法,尤其是一种云计算环境 下HDFS(Hadoop Distributed File System)在运行过程中数据块平衡方法。 背景技术 0002 Hadoop是由Apache开源组织开发的一个高可靠性和。
12、高可扩展性的存储与分布式 并行计算平台,最早是作为开源搜索引擎项目Nutch的基础平台而开发的,之后从Nutch项 目中独立出来,成为典型的开源云计算平台之一。Hadoop核心实现了按块存储的分布式文 件系统(Hadoop Distributed File System,HDFS)以及用于分布式计算的MapReduce计算 模型。HDFS为Hadoop集群提供由众多节点组成的存储系统,在存储大规模数据文件时,会 将文件切分成多个相同大小的数据块(最后一份数据块例外),分布在集群中所有节点上。 为了保证可靠性,HDFS会依据配置为每一份数据块创建多个副本,并放置在集群的不同节 点上。HDFS为上。
13、层MapReduce计算引擎提供数据存储服务。Hadoop MapReduce将应用划 分成许多小任务并行执行,每个小任务就对计算节点本地存储的数据块进行处理。 0003 HDFS文件系统采用分块机制分布式存储数据集,并通过数据块冗余策略来提高系 统可靠性,每个数据块在系统中都有多个副本同时存在,这些副本分布在系统中多个机架 内的多个节点上,防止因单个节点出现故障造成数据块的丢失。此外,这种分布式冗余机制 能保证文件的并发读取,使得HDFS更适合“一次写,多次读”的数据处理模式。为实现这种 数据块冗余策略,HDFS文件系统在写入数据时必须保证有多个副本同时写入。 0004 HDFS文件系统在写。
14、入数据流时需先通过NameNode获取多个节点构成节点管线, 当数据流到达管线中的第一个节点时,该节点存储数据并发送给管线中的第二个节点。同 样的,第二个节点存储数据并发送给管线中的第三个节点以此类推,完成多份副本的 写入。 0005 HDFS文件系统在放置数据块及其副本时综合考虑以下几点: 0006 1)当提交数据的节点也是HDFS文件系统中存储数据块的节点时,该节点上放置 一份数据块的备份; 0007 2)一个数据块的备份必须分布在多个机架上,避免单个机架故障导致整个数据不 可用; 0008 3)与提交数据节点处于同一个机架内的其他节点上也必须有数据块的备份,这样 可以尽量减少机架间的通信。
15、和IO开销; 0009 4)在满足前面条件的前提下兼顾考虑节点存储空间的使用率,尽可能保证各个节 点存储使用率平衡。 0010 Hadoop Map阶段是整个MapReduce作业执行的第一阶段,主要完成将外部输入数 据转化为形式的中间数据,提供给后续Reduce阶段作为输入数据。分布式并 行处理环境下,Hadoop Map阶段使用分布式文件系统HDFS作为输入数据源,并在“移动计 算比移动数据更经济”的指导原则下,将用户在提交作业时指定的Map处理过程分配到各个 说 明 书CN 102937918 A 2/7页 5 HDFS数据块存储节点上执行。当某个节点被分配的处理过程所需的输入数据刚好在。
16、该节点 上存储时,称该处理过程满足数据本地性。 0011 Hadoop MapReduce通过节点任务请求分配机制避免了多个数据块副本重复处理 的问题。但从Hadoop Map阶段执行过程的分析可知,Map任务输入数据的本地性对Map任 务的执行速率也会产生很大影响。当Map输入数据与Map任务执行在同一个节点上时将节 省数据块网络传输开销,提高Map任务执行速率。在现有Hadoop体系结构中,HDFS数据块 副本的分布状态通过Hadoop任务调度器直接影响Map任务输入数据的本地性。 0012 因此,现有的HDFS数据块放置策略虽然能保证各个节点间的数据块数量大致平 衡,但由于某些数据块副本。
17、的分布不合理,导致某些节点“窃取”其他节点的本地Map任务 后,其他节点由于本地Map任务被分配同样需要“任务窃取”,这种“任务分配偏移”现象进 一步加大了Map阶段非本地数据的传输量,给整个网络带来巨大的传输压力,影响整个阶 段的运行效率。此外,当节点间数据块数目平衡时,节点任务处理速率不同也会导致出现较 大程度的非本地化任务处理。 发明内容 0013 本发明的目的在于解决由于HDFS数据块分布不均匀而导致的Map阶段map任务 数据本地性较低的问题,提供一种HDFS运行时数据块平衡方法,该方法提出基于运行时数 据块移动HDFS平衡策略,通过预测节点任务请求提前判断可能出现的非本地map任务。
18、执 行,并在相应的节点间移动合适的数据块,使得节点发出实际任务请求时候能够得到本地 map任务的分配响应,从而提高Map阶段的完成效率。 0014 本发明的目的是通过以下技术方案来解决的: 0015 这种HDFS运行时数据块平衡方法,包括以下步骤: 0016 1)节点本地任务列表预处理 0017 1.1提出完全本地任务和非完全本地任务:当HDFS的各个数据块存在多个副本的 时候,导致同一个任务会出现在不同节点的本地Map任务列表中,从而某个节点本地任务 列表中剩余的map任务数n,意味着该节点能够分配执行的本地任务数是n; 0018 1.2节点本地任务列表的预处理过程:当各个节点依次发出任务请。
19、求时,从节点 的本地任务列表中获取当前可执行的任务加入到节点的完全本地任务列表中,而本地任务 列表中未被分配的任务则加入到非完全本地任务列表中; 0019 2)节点运行时信息统计 0020 通过设计NodeEvaluateInfo类来实现:在该类中统计节点已经处理的数据块总 数sum、节点已处理数据块总耗时cost和作业的执行进度tip,知道以上信息后计算节点平 均块处理时间cost/sum、节点当前运行任务剩余时间(1-tip)/(cost/sum); 0021 3)节点速率评估与任务请求序列预测 0022 3.1节点速率的评估:由步骤2),采用COST i /NUM i 来表示各个节点的数。
20、据处理速 率,即节点处理单个任务的平均耗时;其中,NUM i 为某一时刻节点i已完成的本地map任务 数,COST i 为处理这些本地任务所花费的总耗时; 0023 3.2系统任务请求序列的预测:系统任务请求序列即从当前时刻开始到作业完成 时为止,各个从节点向主节点申请任务执行的时刻序列;在T 0 时刻,节点i正处理任务的进 说 明 书CN 102937918 A 3/7页 6 度为P i ,通过前面速率评估公式得到的节点处理单个数据块平均耗时为T i ,则该节点的第K 次任务请求时间点t ik 为 0024 T 0 +(1-P i )T i +(k-1)T i k1; 0025 其中k表示从。
21、当前时刻算起该节点第k次任务请求;获取各个节点的任务请求序 列后,采用如下方式确定系统任务请求序列:记系统剩余任务数为m,系统中节点数为n,对 每个节点i,取其从当前时刻算起m次任务请求的时间点,记为t i1 ,t i2 ,t im ,n个节点将 构成nm个时间点t 11 ,t 12 ,.t 1m ,t 21 ,t 22 ,t 2m ,t n1 ,t n2 ,t nm ;将所有时间点按升序 排列,取前m个,则可得到从当前时刻开始对系统中剩余m个任务的请求序列R m R m (j)=t ik 即表明系统中第j个任务请求将由节点i在t ik 时刻发出,且该请求是节点i的第k个请 求; 0026 4。
22、)节点任务的分配分析与实现:在步骤3)预测的节点请求序列下提前确定各个 节点的任务分配情况; 0027 5)数据块移动节点对的选择:从任务请求序列中获取发出请求的节点,接着从该 节点的本地任务列表中获取任务,如果任务为空,则认定该节点是待平衡节点,将其加入到 待平衡节点列表中;数据块移动节点对选择过程的第一步是遍历allocate数组,构建映射 表Map,记录所有数据块源节点上的所有未分配任务; 0028 6)节点间数据块的移动 0029 确定好待平衡节点和数据块源节点后便可进行实际的数据块移动;由于数据块移 动与节点任务执行相互独立且考虑到可能有多个数据块需要移动,为提高效率以及简化编 程实。
23、现,采用JAVA线程池技术实现整个数据块移动。 0030 进一步的,以上步骤4)中,模拟Hadoop调度器在当前预测的系统任务请求序 列R m 下的响应过程;依据各个节点的请求时机以及系统当前任务分配情况,确定对该请 求的任务分配响应并判断该任务分配是否满足任务本地性;确定任务的分配记录:通过 AllocatedRecord类实现,该类通过记录任务的分配标志、分配给的节点编号、分配的时间 和该任务对应的数据块是否已加入代交换列表;节点任务请求记录,记录发出该请求的节 点以及该请求在这个节点从当前时刻往后所有请求中的次序;最后根据步骤3)中确定的 系统任务请求序列R m ,其中的第j个请求R m。
24、 (j)=t ik 由节点i在t ik 时刻发出,且该请求是节 点i的第k个请求;通过遍历任务请求序列R m ,对系统中出现的第j个任务请求,从节点i 的本地Map任务列表中第k个任务task (i,k) 开始,查找第一个可调度的本地Map任务;判断 可调度的本地Map任务依据是: 0031 7)task (i,k )不为空; 0032 8)allocatetask (i,k) .id=-1,即该任务没有被调度器分配给其他的节点; 0033 当task (i,k+m|m0) 满足任务本地性时,设置相应任务的分配记录 allocatetask (i,k) .id=i,结束对第j个任务请求的分析;。
25、否则当task (i,k+m|m0) 不 为空,将task (i,k+m|m0) 添加到该节点的可交换任务队列中,判断下一个本地Map任务 task (i,k+m+1|m0) ;当task (i,k+m|m0) 为空时,根据节点i及其交换任务队列构建待平衡节点对 象BalanceNode并记录在待平衡节点列表中。 0034 进一步的,上述步骤5)具体过程是:对于每一个未分配的任务task,获取其数据 块副本存储节点集,将数据块副本存储节点集中的节点和任务按的形 说 明 书CN 102937918 A 4/7页 7 式放入映射表中,同一node在List尾部添加task;在获取所有数据块源节点后。
26、,对 于待平衡节点列表中的每一个待平衡节点,通过遍历映射表,找到第一个与待平衡节点位 于同一机架内的数据块源节点;构造数据块移动请求并提交;判断两个节点位于同一机架 内的依据是二者的节点名前缀一致;当无法找到与待平衡节点位于同一个机架内的数据块 源节点时,选择映射表中第一个数据块源节点。 0035 本发明的有益效果是: 0036 本发明针对Hadoop作业在Map阶段运行过程中不同节点处理数据块的差异,通过 移动数据块使得数据块分布更符合各个节点性能,不仅可以减少后续运行在该数据集上类 似作业的非本地Map任务分配,提高Map任务本地性,促进各个节点在Map阶段任务执行平 衡,而且也能改善当前。
27、运行作业在Map阶段后续过程中的任务平衡。在Hadoop Map阶段, 各个Map任务的执行彼此间是完全独立的。各个Map任务在处理本地Map任务时,仅需要 从本地磁盘上获取数据,除向JobTracker节点报告自身处理进度外几乎不需要任何网络 通信。因此,在节点处理本地Map任务时,移动数据块对整个网络造成的压力较小。 附图说明 0037 图1是节点任务分配分析过程类图; 0038 图2是节点任我分配分析流程图; 0039 图3是待平衡节点与待分配任务匹配图; 0040 图4是数据块移动节点对匹配流程图; 0041 图5是数据块移动线程池框架; 0042 图6是数据块移动线程池类图; 004。
28、3 图7是节点间数据块移动。 具体实施方式 0044 下面结合附图对本发明作详细描述。 0045 基于运行时数据块移动的HDFS数据块平衡策略,其具体实现步骤如下: 0046 第一步,节点本地任务列表预处理。对各个节点的本地任务列表进行预处理,将其 划分为完全本地任务部分和非完全本地任务部分。所有节点的完全本地任务部分实现了对 输入数据集的一个完整处理,且彼此间没有任务交集。理想情况下,如果各个节点同时分配 完完全本地任务,则HDFS数据块分布是符合调度器对各个节点的分配,即HDFS数据块放置 是均衡的。此时可通过预测节点未来的任务请求来确定冲突任务分配,并以此判断可能出 现的非本地任务分配,。
29、为平衡HDFS数据块放置提供可靠的依据。对节点本地任务列表的预 处理采用模拟JobTracker调度分配任务过程。各个节点任务处理速率相同,当各个节点将 依次发出任务请求,预处理过程响应节点请求,从节点的本地任务列表中获取当前可执行 的任务加入到节点的完全本地任务列表中,而本地任务列表中未被分配的任务则加入到非 完全本地任务列表中。可执行的本地任务即该任务还未有在其他副本存储节点上执行。 0047 第二步,节点运行时信息统计。本发明在系统设计中采用NodeEvaluateInfo类表 示,在该类中统计节点已经处理的数据块总数sum、节点已处理数据块总耗时cost和作业 的执行进度tip,知道以。
30、上信息后可以计算节点平均块处理时间cost/sum、节点当前运行 说 明 书CN 102937918 A 5/7页 8 任务剩余时间(1-tip)/(cost/sum); 0048 第三步,节点速率评估与任务请求序列预测。1)节点速率评估。本发明提出一种 节点速率评估方案,利用前面收集到的节点统计信息,采用COST i /NUM i 来表示各个节点的 数据处理速率,即节点处理单个任务的平均耗时。其中,NUM i 为某一时刻节点i已完成的本 地map任务数,COST i 为处理这些本地任务所花费的总耗时;2)系统任务请求序列预测。系 统任务请求序列即从当前时刻开始到作业完成时为止,各个从节点向主。
31、节点申请任务执行 的时刻序列。理论上讲,该序列只有在作业完成后才可准确获知,在作业运行过程中可以基 于节点数据处理速率和节点当前处理任务的进度进行预测;假设在T 0 时刻,节点i正处理 任务的进度为P i ,通过前面速率评估公式得到的节点处理单个数据块平均耗时为T i ,则该 节点的第K次任务请求时间点t ik 为 0049 T 0 +(1-P i )T i +(k-1)T i k1 0050 其中k表示从当前时刻算起该节点第k次任务请求。 0051 获取各个节点的任务请求序列后,可以采用如下方式确定系统任务请求序列。 0052 记系统剩余任务数为m,系统中节点数为n,对每个节点i,取其从当前。
32、时刻算 起m次任务请求的时间点,记为t i1 ,t i2 ,t im ,n个节点将构成nm个时间点t 11 , t 12 ,.t 1m ,t 21 ,t 22 ,t 2m ,.,t n1 ,t n2 ,t nm 。将所有时间点按升序排列,取前m个,则可得 到从当前时刻开始对系统中剩余m个任务的请求序列R m R m (j)=t ik 即表明系统中第j个任 务请求将由节点i在t ik 时刻发出,且该请求是节点i的第k个请求。 0053 此过程的形式化描述为:已知整数序列A=a 1 ,a 2 ,.a n ,B=b 1 ,b 2 ,b n ,构造整 数集合C=c i |c i =a i +k*b i。
33、 ,ko,求升序排列C的前m个有序数。 0054 第四步,节点任务分配分析。 0055 1)节点任务分配过程设计。节点任务分配分析过程实质上是模拟Hadoop调度器 在当前预测的系统任务请求序列R m 下的响应过程。依据各个节点的请求时机以及系统当前 任务分配情况,确定对该请求的任务分配响应并判断该任务分配是否满足任务本地性。当 某个节点的任务请求不能得到本地Map任务分配响应时,该节点即为待平衡节点。节点任 务分配相关类图如图1所示。节点任务请求记录NodeRequest。节点任务分配分析是模拟 Hadoop任务调度器在当前预测的系统任务请求序列下的响应过程,而NodeRequest则描述 。
34、模拟过程中的一个节点任务请求,其中主要记录了发出该请求的节点,以及该请求在这个 节点从当前时刻往后所有请求中的次序。 0056 2)节点任务分配过程实现。节点任务分配分析是在预测的节点请求序列下提前确 定各个节点的任务分配情形,其具体流程如错误!未找到引用源。2所示。根据前面的描 述,系统任务请求序列R m 中的第j个请求R m (j)=t ik 由节点i在t ik 时刻发出,且该请求是节 点i的第k个请求。通过遍历任务请求序列R m ,对系统中出现的第j个任务请求,从节点i 的本地Map任务列表中第k个任务task (i,k) 开始,查找第一个可调度的本地Map任务。判 断可调度的本地Map。
35、任务依据是: 0057 (1)task (i,k) 不为空; 0058 (2)allocatetask (i,k) .id=-1,即该任务没有被调度器分配给其他的节点。当 task (i,k+m|m0) 满足任务本地性时,设置相应任务的分配记录allocatetask (i,k) .id=i,结 束对第j个任务请求的分析。否则当task (i,k+m|m0) 不为空,将task (i,k+m|m0) 添加到该节点 说 明 书CN 102937918 A 6/7页 9 的可交换任务队列中,判断下一个本地Map任务task (i,k+m+1|m0) 。当task (i,k+m|m0) 为空时, 根。
36、据节点i及其交换任务队列构建待平衡节点对象BalanceNode并记录在待平衡节点列表 中。完成全部任务请求的分析后,如果HDFS数据块放置不均衡,则待平衡节点列表不空且 allocate数组中部分任务分配记录仍为-1。此时待平衡节点个数与allocate数组中未分 配项数目相同,且未分配的任务不是任何一个待平衡节点上的本地Map任务,否则在前面 的节点任务分配过程中必定会有节点被分配该任务。 0059 第五步,数据块移动节点对选择。在完成节点任务分配分析后便可在待平衡节点 和未分配任务输入数据块所在的存储节点间移动数据块。确定数据块源节点与移动数据块 的过程如图3所示。在选择匹配待平衡节点与。
37、未分配任务时要有所约束和限制的。(1)交 换节点是在未分配任务的多个副本数据块的存储节点中选择。为减少通信开销,优先选择 与待平衡节点在同一个机架内的副本存储节点;(2)应尽可能的避免多个待平衡节点与同 一个数据块存储节点间进行数据块传输。 0060 为加快节点间的匹配过程,本发明采用贪心算法,首先解析出所有未分配任务的 数据块存储节点,随后在待平衡节点集合和存储节点集之间查找可能的匹配组合,一旦发 现某对待平衡节点与未分配任务数据块存储节点之间满足前面的约束条件,便确定二者的 匹配关系,不再查找其他可能的更优匹配结果。此过程的算法时间复杂度为O(N),其中N为 待平衡节点数。具体的节点匹配过。
38、程如错误!未找到引用源。所示。 0061 数据块移动节点对选择过程的第一步是遍历allocate数组,构建映射表 Map,记录所有数据块源节点上的所有未分配任务。具体过程是对于每 一个未分配的任务task,获取其数据块副本存储节点集moveableNodes,将movableNodes 中的节点和task按的形式放入映射表nodeToTasks,同一node在 List尾部添加task。 0062 在实现中选择java.util.LinkedHashMap作为nodeToTasks的类型。该类的基本 特点是依据访问顺序对映射表中的键值对进行迭代,当访问某一个键值对后,该键值对将 放到链表的尾部。
39、。使用LinkedHashMap可以有效避免多个待平衡节点与同一个数据源节点 之间进行数据块移动。 0063 在获取所有数据块源节点后,对于待平衡节点列表中的每一个待平衡节点,通过 遍历nodeToTasks,找到第一个与待平衡节点位于同一机架内的数据块源节点。构造数据块 移动请求并提交。判断两个节点位于同一机架内的依据是二者的节点名前缀一致,如节点 /rack-A/node01与节点/rack-A/node02位于同一机架内。当无法找到与待平衡节点位于 同一个机架内的数据块源节点时,选择nodeToTask中第一个数据块源节点。 0064 第六步,节点间数据块移动。确定好待平衡节点和数据块源。
40、节点后便可进行实际 的数据块移动。由于数据块移动与节点任务执行相互独立且考虑到可能有多个数据块需要 移动,为提高效率以及简化编程实现,采用JAVA线程池技术实现数据块移动模块,如错误! 未找到引用源。所示。每个数据块移动任务等待线程池中空闲线程的调用执行,任务执行结 束后,线程重返线程池,接受下一个任务的执行。1)线程池设计。线程池相关类图如图6所 示;2)数据块移动任务。每一个任务对应一份数据块,根据待平衡节点的任务分配记录,可 依据任务编号解析出对应数据块并选择本地Map任务列表中索引最大的节点作为目的节 点。每个数据块移动请求都封装成一个MoveTask类,其中包含了需要移动的数据块Bl。
41、ock 说 明 书CN 102937918 A 7/7页 10 以及数据块源节点和目的节点BalanceNode。数据块移动任务Transfer通过实现java. lang.Runnable接口,在run()方法中实现数据块移动逻辑。其流程图如图7所示。 0065 对每一个数据块移动请求,Tracnsfer从中解析出数据块对象以及数据块源节点 和目的节点,向目的节点发送数据块置换指令OP_REPLACE_BLOCK,由目的节点向源节点发 送OP_COPY_BLOCK指令并完成数据块的传输。数据块拷贝成功后,目的节点通知NameNode 删除源节点上该数据块的拷贝。 说 明 书CN 102937918 A 10 1/4页 11 图1 说 明 书 附 图CN 102937918 A 11 2/4页 12 图2 图3 说 明 书 附 图CN 102937918 A 12 3/4页 13 图4 图5 说 明 书 附 图CN 102937918 A 13 4/4页 14 图6 图7 说 明 书 附 图CN 102937918 A 14 。