一种流水化数据洗牌传输的Spark任务调度与执行方法_3

文档序号:9929380阅读:来源:国知局
执行洗牌映射任务的同时将数据发送到等待执行规约任务的节点,从而将原本Spark洗牌传输的等待时间隐藏起来。当洗牌映射任务结束时,规约任务就能在较原先更短的时间内启动,从而加快整个分布式计算的速度。
[0080]在本次实施例的基础上通过Word Count等相关Spark的benchmark程序,验证了本发明的正确性,同时本发明在性能上相较于原版的Spark在不同的benchmark程序上都有不同程度的提升。
[0081]以上详细描述了本发明的较佳具体实施例。应当理解,本领域的普通技术无需创造性劳动就可以根据本发明的构思做出诸多修改和变化。因此,凡本技术领域中技术人员依本发明的构思在现有技术的基础上通过逻辑分析、推理或者有限的实验可以得到的技术方案,皆应在由权利要求书所确定的保护范围内。
【主权项】
1.一种流水化数据洗牌传输的Spark任务调度与执行方法,其特征在于,包括如下步骤: 步骤1:当Spark提交一个任务且该任务被划分成多个阶段进行提交时,首先找到用户执行任务生成结果的最后一个阶段; 步骤2:从最后一个阶段开始,判断该阶段是否包含未完成的前驱阶段: 如果这个阶段的前驱阶段全部执行完成,则提交该阶段进行执行; 如果有前驱阶段没有被执行,则将该阶段标记为等待,同时提交该阶段进行执行,并且递归提交该阶段的前驱阶段; 步骤3:在提交一个阶段进行执行之后,调度器将该阶段拆分成多个任务,并判断该阶段:是否为等待阶段: 如果该阶段被标记为等待,则调度器向资源管理器请求与任务个数相同的空闲执行节点,调度器获取相应执行任务的执行节点之后,根据该阶段包含的分布式回弹数据集的依赖关系递归向前寻找洗牌传输依赖,调度器每找到一个洗牌传输依赖就会向的映射输出追踪表注册该次洗牌传输流水信息,在注册完成之后,调度器还会通知每一个即将要运行这个任务的执行节点准备好相应的内存来缓存他们前驱任务发送的中间结果;每个执行节点收到调度器的注册信息之后,会在本地缓存中新建一个以洗牌传输依赖ID为索引,值为规约数据块总数个的缓存数组的键值对,同时还会在本地新建一个以洗牌传输依赖ID为索弓I,值为规约数据块总数的信号量数据结构的键值对,其中每个信号量包含这次洗牌依赖的洗牌任务映射总数,; 否则,直接进入下一步; 步骤4:在调度器封装阶段的任务集合时,判断该阶段是否是一个洗牌映射阶段: 如果该阶段是一个洗牌映射阶段,则对该阶段中的每个任务都设置对应的洗牌传输依赖ID; 否则,直接进入下一步; 步骤5:调度器将封装好的任务分发给各个执行节点; 步骤6:当任务被分配到每个执行节点的执行器上进行执行时,执行器会判断这个任务是否为洗牌映射任务: 如果是,则根据该任务包含的洗牌传输依赖ID,向映射输出追踪表请求该ID对应的规约任务的执行节点的集合信息,然后,设置洗牌映射任务的对应规约信息,将收到的结合信息中的规约数据块号和远程地址封装成一个哈希表传给该洗牌映射任务,并进入步骤7; 如果执行器判断该任务为规约任务,调用该规约任务对应的函数进行计算,并进入步骤11; 步骤7:当一个洗牌映射任务开始执行时,会检查是否需要流水化数据输出; 如果需要,首先根据用户指定的分类器或者Spark默认的分类器将中间结果键值对按照键计算出他对应的规约数据块号,根据设置的数据块号和远程地址哈希表,将计算获得的数据结果发送给对应的负责后继规约任务的执行节点,发送的信息包括:洗牌传输依赖ID,规约数据块号,数据结果的键值对;在发送数据的同时,执行器向磁盘写入数据,并进入步骤8;同时,当负责规约任务的执行节点收到流水数据之后,会将洗牌数据依赖ID作为索引,保存该ID对应的缓存数组的第规约数据块号的缓存中,进入步骤8; 如果不需要,则直接将执行结果写入磁盘,进入步骤8; 步骤8:执行器完成洗牌映射任务; 步骤9:当一个洗牌映射任务运行结束时,就会向所有的负责规约任务的执行节点发送流水结束信息,该信息包括:洗牌传输依赖ID,该任务负责的映射数据块号,和该条信息对应的执行节点负责的规约数据块号; 步骤10:当负责规约任务的执行节点收到流水结束的信息后,会根据洗牌传输依赖ID作为索引,找到该ID对应的信号量数组,将其中第规约数据块号个CountDownLatch减一。如果这个信号量被减到O,则表示该规约数据块依赖的数据映射全部传输结束; 步骤11:当执行器执行规约任务的指定函数时,会调用相应的规约函数,该函数在执行任务读取数据时,会向执行节点请求一个读入数据的迭代器; 步骤12:在生成迭代器的时候会向执行节点询问这次洗牌传输是否有本地缓存,即是否被流水化数据传输: 如果是,则调用执行节点的获取缓存方法,根据规约任务的洗牌传输依赖ID和该任务负责的规约数据块号向执行节点请求缓存,并进入步骤13; 否则,读取远程数据,进入步骤15; 步骤13:执行节点收到获取缓存的调用后,就会以洗牌传输依赖ID为索引,找到缓存中对应的缓存数组,并且返回第规约数据块号个缓存的异步引用; 步骤14:在迭代器收到缓存的异步引用时,开始等待,直到该任务所需的洗牌传输依赖的规约数据块号中的CountDownLatch信号量变为O,表示该规约数据块所依赖的映射数据块全部完成,进入步骤15; 步骤15:执行器执行指定规约函数。2.根据权利要求1所述的流水化数据洗牌传输的Spark任务调度与执行方法,其特征在于,所述的步骤I到15中任一一个步骤出错都会触发容错性机制:如果错误发生于一个流水化的洗牌传输的前驱任务,即洗牌映射任务的步骤,以及该步骤之前的任一步骤,那么他的后继都会被标记为失败并且重新提交,继续执行流水化的洗牌传输;如果错误发生于一个流水化的洗牌传输的后继任务,即规约任务的执行步骤,那么前驱任务并不会受到影响,而失败的后继任务会被重新提交,此时重新提交的后继任务就会从前驱任务的磁盘中去读取所需要的数据。3.根据权利要求1所述的流水化数据洗牌传输的Spark任务调度与执行方法,其特征在于,所述的步骤3中调度器向资源管理器请求与任务个数相同的空闲执行节点,采取随机获取空闲的执行节点的策略。4.根据权利要求1所述的流水化数据洗牌传输的Spark任务调度与执行方法,其特征在于,所述的步骤3中洗牌传输流水信息,包括洗牌传输依赖ID以及对应的执行节点集合的信息。5.根据权利要求4所述的流水化数据洗牌传输的Spark任务调度与执行方法,其特征在于,所述的执行节点集合的信息包含:这个执行节点负责的规约数据块号和元信息,该元信息包括节点名称和地址。6.根据权利要求1所述的流水化数据洗牌传输的Spark任务调度与执行方法,其特征在于,所述的步骤3中在注册完成之后,调度器还会通知每一个即将要运行这个任务的执行节点准备好相应的内存来缓存他们前驱任务发送的中间结果,该信息包含:这次洗牌传输的ID、前驱洗牌映射任务的分块总数、该执行节点该次任务负责的规约数据块号以及规约数据块总数。
【专利摘要】本发明公开了一种流水化数据洗牌传输的Spark任务调度与执行方法,从后向前提交并执行阶段和其中的任务,同时采用前驱任务发送执行结果到后继任务的内存,在不改变用户接口,不破坏阶段的完整性和容错性的同时,解决了原本Spark在不同阶段(Stage)中洗牌数据传输(Shuffle)的磁盘读写开销,从而降低了分布式计算程序在Spark上的运行时间。
【IPC分类】G06F9/38
【公开号】CN105718244
【申请号】CN201610029211
【发明人】付周望, 张未雨, 戚正伟, 管海兵
【申请人】上海交通大学
【公开日】2016年6月29日
【申请日】2016年1月18日
当前第3页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1