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

文档序号:9929380阅读:来源:国知局
【附图说明】
[0036]图1.架构示意图
[0037]图2.调度器调度方法流程图
[0038]图3.执行节点流程图
[0039]图4.流水注册信息
[0040]图5.流水通知信息
[0041]图6.流水传输信息
[0042]图7.流水结束信息
[0043]图8.执行节点缓存架构
[0044]图9.执行节点信号控制架构
[0045]具体实施方法
[0046]以下将结合附图对本发明的实施例做详细说明。本实施例在本发明技术方案和算法的前提下进行实施,并给出详细实施方式和具体操作过程,但是适用平台不限于下述实施例。只要集群兼容原版的Spark就能运行本发明。本实例的具体操作平台是由两台普通服务器组成的小型集群,每个服务器上装有UbuntuServer 14.04.1LTS 64bit,并且配备8GB内存。本发明的具体开发是基于Apache Spark 1.5的源码版本。
[0047]如图1所示,本发明基于Spark原有的框架包括调度器(DAGScheduler),资源管理器(BlockMangerMaster ),映射输出追踪表(MapOutputTracker )以及执行节点(BlockManger)和执行器(Executor ),通过改变任务调度算法和执行流程来实现不破坏阶段的完成性和容错性的基础上的洗牌数据传输的流水化。调度器和执行节点分别按照附图2与附图3中的流程运行,从而实现分布式计算性能的提升。
[0048]每台服务器上都部署了包含本发明的Spark,其中一台服务器作为Spark集群的Master,另外一台机器作为集群的Slave。值得注意的是为了保证本发明的性能,部署的集群应答配置比原始Spark集群更大的内存,具体的内存大小视运行的数据量大小而定。
[0049]当部署完成之后即可以按照Spark的运行方式运行分布式计算应用。改动对于使用Spark计算框架的用户完全透明。
[0050]—种流水化数据洗牌传输的Spark任务调度与执行方法,包括如下步骤:
[0051]步骤1:当Spark提交一个任务且该任务被划分成多个阶段进行提交时,首先找到用户执行任务生成结果的最后一个阶段;
[0052]步骤2:从最后一个阶段开始,判断该阶段是否包含未完成的前驱阶段:
[0053]如果这个阶段的前驱阶段全部执行完成,则提交该阶段进行执行;
[0054]如果有前驱阶段没有被执行,则将该阶段标记为等待,同时提交该阶段进行执行,并且递归提交该阶段的前驱阶段;
[0055]步骤3:在提交一个阶段进行执行之后,调度器将该阶段拆分成多个任务,并判断该阶段:是否为等待阶段:
[0056]如果该阶段被标记为等待,则调度器向资源管理器请求与任务个数相同的空闲执行节点,调度器获取相应执行任务的执行节点之后,根据该阶段包含的分布式回弹数据集的依赖关系递归向前寻找洗牌传输依赖,调度器每找到一个洗牌传输依赖就会向的映射输出追踪表注册该次洗牌传输流水信息,在注册完成之后,调度器还会通知每一个即将要运行这个任务的执行节点准备好相应的内存来缓存他们前驱任务发送的中间结果;每个执行节点收到调度器的注册信息之后,会在本地缓存中新建一个以洗牌传输依赖ID为索引,值为规约数据块总数个的缓存数组的键值对,同时还会在本地新建一个以洗牌传输依赖ID为索引,值为规约数据块总数的信号量数据结构的键值对,其中每个信号量包含这次洗牌依赖的洗牌任务映射总数,;
[0057]否则,直接进入下一步;
[0058]步骤4:在调度器封装阶段的任务集合时,判断该阶段是否是一个洗牌映射阶段:
[0059]如果该阶段是一个洗牌映射阶段,则对该阶段中的每个任务都设置对应的洗牌传输依赖ID;
[0060]否则,直接进入下一步;
[0061 ]步骤5:调度器将封装好的任务分发给各个执行节点;
[0062]步骤6:当任务被分配到每个执行节点的执行器上进行执行时,执行器会判断这个任务是否为洗牌映射任务:
[0063]如果是,则根据该任务包含的洗牌传输依赖ID,向映射输出追踪表请求该ID对应的规约任务的执行节点的集合信息,然后,设置洗牌映射任务的对应规约信息,将收到的结合信息中的规约数据块号和远程地址封装成一个哈希表传给该洗牌映射任务,并进入步骤7;
[0064]如果执行器判断该任务为规约任务,调用该规约任务对应的函数进行计算,并进入步骤11;
[0065]步骤7:当一个洗牌映射任务开始执行时,会检查是否需要流水化数据输出;
[0066]如果需要,首先根据用户指定的分类器或者Spark默认的分类器将中间结果键值对按照键计算出他对应的规约数据块号,根据设置的数据块号和远程地址哈希表,将计算获得的数据结果发送给对应的负责后继规约任务的执行节点,发送的信息包括:洗牌传输依赖ID,规约数据块号,数据结果的键值对;在发送数据的同时,执行器向磁盘写入数据,并进入步骤8;同时,当负责规约任务的执行节点收到流水数据之后,会将洗牌数据依赖ID作为索引,保存该ID对应的缓存数组的第规约数据块号的缓存中,进入步骤8;
[0067]如果不需要,则直接将执行结果写入磁盘,进入步骤8;
[0068]步骤8:执行器完成洗牌映射任务;
[0069]步骤9:当一个洗牌映射任务运行结束时,就会向所有的负责规约任务的执行节点发送流水结束信息,该信息包括:洗牌传输依赖ID,该任务负责的映射数据块号,和该条信息对应的执行节点负责的规约数据块号;
[0070]步骤10:当负责规约任务的执行节点收到流水结束的信息后,会根据洗牌传输依赖ID作为索引,找到该ID对应的信号量数组,将其中第规约数据块号个CountDownLatch减一。如果这个信号量被减到O,则表示该规约数据块依赖的数据映射全部传输结束;
[0071]步骤11:当执行器执行规约任务的指定函数时,会调用相应的规约函数,该函数在执行任务读取数据时,会向执行节点请求一个读入数据的迭代器;
[0072]步骤12:在生成迭代器的时候会向执行节点询问这次洗牌传输是否有本地缓存,即是否被流水化数据传输:
[0073]如果是,则调用执行节点的获取缓存方法,根据规约任务的洗牌传输依赖ID和该任务负责的规约数据块号向执行节点请求缓存,并进入步骤13;
[0074]否则,读取远程数据,进入步骤15;
[0075]步骤13:执行节点收到获取缓存的调用后,就会以洗牌传输依赖ID为索引,找到缓存中对应的缓存数组,并且返回第规约数据块号个缓存的异步引用;
[0076]步骤14:在迭代器收到缓存的异步引用时,开始等待,直到该任务所需的洗牌传输依赖的规约数据块号中的CountDownLatch信号量变为O,表示该规约数据块所依赖的映射数据块全部完成,进入步骤15;
[0077]步骤15:执行器执行指定规约函数。
[0078]在执行以上步骤时,其中任一一个步骤出错都会触发容错性机制:如果错误发生于一个流水化的洗牌传输的前驱任务,即洗牌映射任务的步骤,以及该步骤之前的任一步骤,那么他的后继都会被标记为失败并且重新提交,继续执行流水化的洗牌传输;如果错误发生于一个流水化的洗牌传输的后继任务,即规约任务的执行步骤,那么前驱任务并不会受到影响,而失败的后继任务会被重新提交,此时重新提交的后继任务就会从前驱任务的磁盘中去读取所需要的数据。
[0079]由于本实施例在
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1