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

文档序号:9929380阅读:347来源:国知局
一种流水化数据洗牌传输的Spark任务调度与执行方法
【技术领域】
[0001 ]本发明涉及计算机分布式计算框架领域。具体来讲,主要是在分布式计算框架Spark的基础上改变他的任务调度机制,从而提升该计算框架的性能。
【背景技术】
[0002]Spark作为目前应用最广泛的分布式计算框架,已经被部署在了无数的数据中心中。它提出的分布式回弹数据集(Resilient Distributed Dataset,RDD)使得大数据的计算过程最大可能的在内存中进行。在执行逻辑上,Spark按照用户程序的逻辑从前向后生成RDD,每个RDD都会有自己的依赖。当用户的程序需要最终的输出结果时,Spark就会从最后一个RDD递归向前寻找,并且按照其中存在的洗牌传输依赖(ShuffIe Dependency)来划分阶段(Stage)。在划分完阶段之后,Spark就会从前向后提交阶段,先提交没有缺失依赖的阶段,依次向后。这种调度逻辑使得数据自动流向需要计算的位置,并且让计算中间结果最大可能的保存在内存中。
[0003]但是为了保证阶段(Stage)之间的分割和本身框架的容错性,在划分每个阶段的洗牌传输依赖(Shuf fie Dependency)时,Spark会将前驱阶段产生的中间结果存储到磁盘中,然后开始分配下一个阶段的任务,之后再由阶段的任务去远程读取磁盘上的数据,然后进行计算。
[0004]在目前磁盘速度远远慢于内存的现实中,这部分的数据读写成为了限制Spark性能提升的最大瓶颈。然而碍于阶段的划分的完整性以及容错性,目前仍然没有对于优化这部分瓶颈的补丁或者解决方案出现。

【发明内容】

[0005]本发明针对在Spark数据洗牌传输时读写硬盘的瓶颈,提出了一种流水化数据洗牌传输(Shuffle)的Spark任务调度方法,通过改变Spark任务的提交顺序,使得一个任务先于他的前驱任务开始被调度分发,同时采用前驱任务发送执行结果到后继任务的内存中的方法,在不改变用户接口,不破坏阶段的完整性和容错性的同时,解决了原本Spark在不同阶段(Stage)中洗牌数据传输(Shuffle)的磁盘读写开销。使得前驱任务在执行完的产生中间结果的同时通过网络将数据发送给后继任务,从而避免了磁盘1的读写,提升Spark分布式计算框架的性能。
[0006]本发明的技术解决方案如下:
[0007]—种流水化数据洗牌传输的Spark任务调度与执行方法,包括如下步骤:
[0008]步骤I:当Spark提交一个任务且该任务被划分成多个阶段进行提交时,首先找到用户执行任务生成结果的最后一个阶段;
[0009]步骤2:从最后一个阶段开始,判断该阶段是否包含未完成的前驱阶段:
[0010]如果这个阶段的前驱阶段全部执行完成,则提交该阶段进行执行;
[0011 ]如果有前驱阶段没有被执行,则将该阶段标记为等待,同时提交该阶段进行执行,并且递归提交该阶段的前驱阶段;
[0012]步骤3:在提交一个阶段进行执行之后,调度器将该阶段拆分成多个任务,并判断该阶段:是否为等待阶段:
[0013]如果该阶段被标记为等待,则调度器向资源管理器请求与任务个数相同的空闲执行节点,调度器获取相应执行任务的执行节点之后,根据该阶段包含的分布式回弹数据集的依赖关系递归向前寻找洗牌传输依赖,调度器每找到一个洗牌传输依赖就会向的映射输出追踪表注册该次洗牌传输流水信息,在注册完成之后,调度器还会通知每一个即将要运行这个任务的执行节点准备好相应的内存来缓存他们前驱任务发送的中间结果;每个执行节点收到调度器的注册信息之后,会在本地缓存中新建一个以洗牌传输依赖ID为索引,值为规约数据块总数个的缓存数组的键值对,同时还会在本地新建一个以洗牌传输依赖ID为索引,值为规约数据块总数的信号量数据结构的键值对,其中每个信号量包含这次洗牌依赖的洗牌任务映射总数,;
[0014]否则,直接进入下一步;
[0015]步骤4:在调度器封装阶段的任务集合时,判断该阶段是否是一个洗牌映射阶段:
[0016]如果该阶段是一个洗牌映射阶段,则对该阶段中的每个任务都设置对应的洗牌传输依赖ID;
[0017]否则,直接进入下一步;
[0018]步骤5:调度器将封装好的任务分发给各个执行节点;
[0019]步骤6:当任务被分配到每个执行节点的执行器上进行执行时,执行器会判断这个任务是否为洗牌映射任务:
[0020]如果是,则根据该任务包含的洗牌传输依赖ID,向映射输出追踪表请求该ID对应的规约任务的执行节点的集合信息,然后,设置洗牌映射任务的对应规约信息,将收到的结合信息中的规约数据块号和远程地址封装成一个哈希表传给该洗牌映射任务,并进入步骤7;
[0021]如果执行器判断该任务为规约任务,调用该规约任务对应的函数进行计算,并进入步骤11;
[0022]步骤7:当一个洗牌映射任务开始执行时,会检查是否需要流水化数据输出;
[0023]如果需要,首先根据用户指定的分类器或者Spark默认的分类器将中间结果键值对按照键计算出他对应的规约数据块号,根据设置的数据块号和远程地址哈希表,将计算获得的数据结果发送给对应的负责后继规约任务的执行节点,发送的信息包括:洗牌传输依赖ID,规约数据块号,数据结果的键值对;在发送数据的同时,执行器向磁盘写入数据,并进入步骤8;同时,当负责规约任务的执行节点收到流水数据之后,会将洗牌数据依赖ID作为索引,保存该ID对应的缓存数组的第规约数据块号的缓存中,进入步骤8;
[0024]如果不需要,则直接将执行结果写入磁盘,进入步骤8;
[0025]步骤8:执行器完成洗牌映射任务;
[0026]步骤9:当一个洗牌映射任务运行结束时,就会向所有的负责规约任务的执行节点发送流水结束信息,该信息包括:洗牌传输依赖ID,该任务负责的映射数据块号,和该条信息对应的执行节点负责的规约数据块号;
[0027]步骤10:当负责规约任务的执行节点收到流水结束的信息后,会根据洗牌传输依赖ID作为索引,找到该ID对应的信号量数组,将其中第规约数据块号个CountDownLatch减一。如果这个信号量被减到O,则表示该规约数据块依赖的数据映射全部传输结束;
[0028]步骤11:当执行器执行规约任务的指定函数时,会调用相应的规约函数,该函数在执行任务读取数据时,会向执行节点请求一个读入数据的迭代器;
[0029]步骤12:在生成迭代器的时候会向执行节点询问这次洗牌传输是否有本地缓存,即是否被流水化数据传输:
[0030]如果是,则调用执行节点的获取缓存方法,根据规约任务的洗牌传输依赖ID和该任务负责的规约数据块号向执行节点请求缓存,并进入步骤13;
[0031 ]否则,读取远程数据,进入步骤15;
[0032]步骤13:执行节点收到获取缓存的调用后,就会以洗牌传输依赖ID为索引,找到缓存中对应的缓存数组,并且返回第规约数据块号个缓存的异步引用;
[0033]步骤14:在迭代器收到缓存的异步引用时,开始等待,直到该任务所需的洗牌传输依赖的规约数据块号中的CountDownLatch信号量变为O,表示该规约数据块所依赖的映射数据块全部完成,进入步骤15;
[0034]步骤15:执行器执行指定规约函数。
[0035]与现有技术相比,本发明的有益效果是:能够大幅缩短Spark任务执行过程中数据洗牌传输的时间,缩短分布式计算任务的执行时间。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1