一种基于映射-归约计算模型的洗牌数据缓存方法与流程

文档序号:18180268发布日期:2019-07-17 05:09阅读:333来源:国知局
一种基于映射-归约计算模型的洗牌数据缓存方法与流程

本发明涉及计算机分布式系统以及分布式计算框架领域。具体来讲,主要是为基于映射(Map)-归约(Reduce)计算模型提供基于内存的分布式洗牌(shuffle)数据缓存,从而提升该计算框架的性能和鲁棒性。



背景技术:

映射-归约计算模型以及基于该模型设计的分布式计算系统是目前主流的大数据分布式系统,比如Spark,Hadoop。基于该模型的计算在映射和归约阶段之间存在着一个洗牌(Shuffle),将映射和归约进行了隔离。目前的所有设计都是采用将洗牌数据写入磁盘做持久化处理,然后再进行传输。而磁盘的性能远不如内存,因此给计算系统带来了此较大的性能开销。

于此同时,该类型的计算框架主要通过磁盘来保证计算的容错性(Hadoop),或者需要用户手动地增加检查点(Spark)。这些容错机制由于和计算逻辑相互重叠,不但没有充分利用现有的硬件特性,而且穿插在计算过程中大大影响了计算本身的性能。

目前虽然有一些基于内存的分布式文件系统,但是他们主要的是针对数据块本身,而数据块本身的体积往往远大于洗牌数据,因此需要大量的内存作为支撑。基于以上的背景,本发明提供了一种基于内存的分布式洗牌数据缓存方法来消除洗牌传输和基于磁盘的容错性机制带来的性能开销,提升计算框架的性能和鲁棒性。



技术实现要素:

本发明针对基于映射-归约模型的分布式计算系统,通过将洗牌传输数据缓存在分布式系统的内存中来消除洗牌传输和基于磁盘的容错性机制带来的性能开销。本发明的技术解决方案如下:

一种映射-规约计算模型的洗牌数据缓存方法,包括如下步骤:

步骤1:映射-归约计算框架将一个映射-归约工作按任务为单位的划分通过接口发送到洗牌缓存主机。这里的任务包含了洗牌传输依赖的ID,映射任务总数与归约任务总数,主机接收后,加上时间戳保存在本地内存中。

步骤2:洗牌缓存主机收到工作划分数据之后,采用随机算法将其中的归约任务与集群的各个节点做一个一对三的映射。及一个归约任务对应随机三个节点,其中一个为主要节点,剩下两个为备份节点。归约任务与节点的映射以哈希表的形式保存在主机的内存中。

步骤3:计算框架调度其中一个节点执行一个映射任务。该节点执行完映射任务的计算过程之后,通过调用缓存系统的接口将该映射任务的洗牌数据发送至本地洗牌缓存执行器进程的内存空间。同时立即返回,表示任务执行完成。

步骤4:当一个节点上的缓存系统的执行器进程收到映射任务的洗牌数据时,会按照洗牌数据默认的划分方式(由计算框架指定),将数据按照归约任务划分成多个洗牌归约数据块,保存在内存中。通常一个映射任务会产生与归约任务个数相同或者小于归约任务个数的数据块。

步骤5:执行器向洗牌缓存主机请求归约任务与节点的映射表,该步骤在整个映射-归约工作中只会执行一次)。映射表保证了所有执行器的分发规则是一致。执行器根据主机的归约任务与节点的映射表,将步骤4中划分完毕的洗牌归约数据块分发到与之对应的三个归约任务远程节点。执行器发送洗牌归约数据块时,会按照步骤2中主从节点的设置分别给数据块加上主从备份的标签。

步骤6:远程节点收到洗牌归约数据块时读取该数据块的标签。如果该标签显示为主备份则将其保存在内存中,如果实从备份则将其写入硬盘。

步骤7:重复步骤3到步骤6的过程,直到该工作的所有映射任务执行完毕,进入步骤10。

步骤8:计算框架在调度前通过洗牌缓存系统的接口查询所有归约任务的分布情况。

步骤9:计算框架根据归约任务的分布情况调度归约任务。计算框架首先选取其中的主备份节点,将一个归约任务分发到该节点上。如果主备份节点失效,进入步骤10,否则进入步骤11。

步骤10:计算框架选择从备份节点,将归约任务发送到该节点上。如果两个从备份节点同时失效,则该任务失败,抛出错误。终止所有步骤。

步骤11:归约任务在节点上执行时,通过接口向本地的洗牌缓存执行器获取数据。

步骤12:本地洗牌缓存执行器接受到请求后,首先检查数据是否在内存中,如在内存中则直接返回对应数据,否则去磁盘获取对应的数据并返回。

步骤13:归约任务收到数据后开始计算。

步骤14:重复步骤9至步骤13直到所有归约任务执行完毕,映射-归约工作结束。

洗牌缓存系统的缓存数据替换策略:

由于每个节点的内存资源有限,为了不影响任务执行时的性能,洗牌缓存系统只会占用固定的内存空间(可以通过配置文件设置)。然而随着任务的不断执行,就会在主备份节点的内存缓存大量的洗牌归约数据。为了节约内存资源,洗牌缓存系统提供了最早缓存任务最先被剔除的策略。该策略遵循以下步骤。

步骤1:洗牌缓存系统执行节点检测到内存余量不足。

步骤2:该备份节点向洗牌缓存系统主机发送剔除请求。

步骤3:洗牌缓存系统主机收到剔除请求后,根据本地内存记录,找到最早被缓存的映射-洗牌工作对应的洗牌传输依赖ID,以及该工作所有归约任务的主备份节点。

步骤4:洗牌缓存系统将该洗牌传输依赖ID广播给集群中所有洗牌缓存系统的主备份节点。

步骤5:执行节点收到洗牌传输依赖ID之后从自己的内存中将对应的数据块从内存中删除。

洗牌缓存体统为计算框架提供的鲁棒性支持的恢复策略。

由于映射-归约计算框架在执行整个工作流程的时候包含了大量的映射-归约过程。如果配合了洗牌缓存系统,计算框架将不需要对计算数据进行手动的检查点设置。在任务执行过程中发生失败,则可以直接从最近的一次映射-归约的数据中直接恢复,大大减少了恢复时间,提升了计算性能。该策略遵循以下步骤。

步骤1:计算框架出现运行错误。

步骤2:计算框架根据用户执行逻辑开始从后向前寻找最近被持久化的数据。

步骤3:计算框架搜寻时通过接口向洗牌缓存系统查询是否有相应的洗牌数据备份。

步骤4:如果查到有备份则直接从该步骤开始恢复。

步骤5:如果没有查到备份,则继续向前寻找,如果都没有备份,则按照计算框架的容错机制开始恢复。

与现有技术相比,本发明的有益效果是:能够提升基于映射-归约模型的分布式计算框架(如Spark,Hadoop)的计算性能,避免低效的用户手动设置检查点,提升分布式计算框架的鲁棒性。

附图说明

图1.架构示意图

图2.映射任务工作示意图

图3.主节点归约任务执行示意图

图4.从节点归约任务执行示意图

图5.任务划分信息

图6.洗牌缓存主机追踪信息

具体实施方法

以下将结合附图对本发明的实施例做详细说明。本实施例在本发明技术方案和算法的前提下进行实施,并给出详细实施方式和具体操作过程,但是适用平台不限于下述实施例。本实例的具体操作平台是由两台普通服务器组成的小型集群,每个服务器上装有UbuntuServer 14.04.1 LTS 64 bit,并且配备8GB内存。本发明的具体开发是基于Apache Spark 1.6的源码版本作为说明,Hadoop等其他映射-归约分布式计算框架也同样适用。首先需要通过修改Spark的源代码使其通过本方法的接口来传输洗牌数据。

本发明通过在分布式计算集群中部署缓存系统,同时修改分布式计算框架的少部分代码,实现对本方法的接口调用,来实现对于映射-规约计算中洗牌数据的分布式多备份内存/磁盘缓存。在本方法的支持下,能提升现有的基于映射-归约模型的分布式计算框架的性能和鲁棒性。基于图1中的架构来设计,在洗牌缓存系统的主机采用了Paxos协议来维护系统本身状态的一致性和鲁棒性。同时,在分布式计算集群的各个节点上部署了洗牌执行器,来负责具体洗牌数据的传输,缓存以及为分布式计算框架的工作进程提供接口。在映射阶段的工作流程如图2所示,分布式计算框架将洗牌数据通过接口传输到本地洗牌执行器的内存,然后由洗牌执行器根据该映射-归约工作的任务数等参数来划分和选择备份节点,并且备份数据。在归约阶段,分布式计算框架则通过接口直接向本地的洗牌执行器请求数据。在主节点工作的情况下,该数据来自洗牌执行器的内存,如图3所示。如果主节点失败,任务会被调度到从节点上,从从节点的硬盘读取数据,如图4所示。

请先参阅图1,图1为架构示意图,如图所示,本发明的总体架构是典型的主从式架构,主机由一台工作主机和两台备份主机组成。他们通过Paxos协议保证状态的一致性,从而避免由于工作主机崩溃造成的整个系统崩溃。此外,从节点的每台服务器上都部署洗牌缓存执行器。同时需要在同一个集群中部署经过修改的Spark计算框架。

当Spark计算框架开始工作时,一旦有包含洗牌传输的任务被用户提交,洗牌缓存系统就会进人权利要求书中阐述的工作步骤,来为Spark提供洗牌传输的加速和鲁棒性支持。而整个过程对于Spark的用户是完全透明的。

由于本实施例充分利用了内存来缓存数据。当映射任务结束时,归约任务就能直接在本地的洗牌缓存执行器的内存中读到所需要的数据,从而加快整个分布式计算的速度。

同时,当Spark的运算中某一步发生错误,需要恢复时,可以向前递归,找到被洗牌缓存系统缓存的数据,再开始恢复,从而加快了恢复速度,提升整个系统的鲁棒性。

一种基于映射-归约计算模型的洗牌数据缓存方法,包括如下步骤:

计算框架与洗牌缓存系统配合运行过程:

步骤1:映射-归约计算框架将一个映射-归约工作按任务为单位的划分通过接口发送到洗牌缓存主机。这里的任务包含了洗牌传输依赖的ID,映射任务总数与归约任务总数,主机接收后,加上时间戳保存在本地内存中。如图5所示。

步骤2:洗牌缓存主机收到任务划分数据之后,采用随机算法将其中的归约任务与集群的各个节点做一个一对三的映射。即一个归约任务对应随机三个节点,其中一个为主要节点,剩下两个为备份节点。归约任务与节点的映射以哈希表的形式保存在主机的内存中,同时主机会给相应记录打上时间戳。具体保存信息如图6所示。

步骤3:计算框架调度其中一个节点执行一个映射任务。该节点执行完映射任务的计算过程之后,通过调用缓存系统的接口将该映射任务的洗牌数据发送至本地洗牌缓存执行器进程的内存空间。同时立即返回,表示任务执行完成。

步骤4:当一个节点上的缓存系统的执行器进程收到映射任务的洗牌数据时,会按照洗牌数据默认的划分方式(由计算框架指定),将数据按照归约任务划分成多个洗牌归约数据块,保存在内存中。通常一个映射任务会产生与归约任务个数相同或者小于归约任务个数的数据块。

步骤5:执行器向洗牌缓存主机请求归约任务与节点的映射表,及图6所表示的信息。(该步骤在整个映射-归约工作中只会执行一次)。映射表保证了所有执行器的分发规则是一致。

步骤6:执行器根据主机的归约任务与节点的映射表,将步骤4中划分完毕的洗牌归约数据块分发到与之对应的三个归约任务远程节点。

步骤7:执行器发送洗牌归约数据块时,会按照步骤2中主从节点的设置分别给数据块加上主从备份的标签。

步骤8:远程节点收到洗牌归约数据块时读取该数据块的标签。如果该标签显示为主备份则将其保存在内存中,如果实从备份则将其写入硬盘。

步骤9:重复步骤3到步骤8的过程,直到该工作的所有映射任务执行完毕,进入步骤10。

步骤10:计算框架在调度前通过洗牌缓存系统的接口查询所有归约任务的分布情况。

步骤11:计算框架根据归约任务的分布情况调度归约任务。计算框架首先选取其中的主备份节点,将一个归约任务分发到该节点上。如果主备份节点失效,进入步骤12,否则进入步骤13。

步骤12:计算框架选择从备份节点,将归约任务发送到该节点上。如果两个从备份节点同时失效,则该任务失败,抛出错误。终止所有步骤。

步骤13:归约任务在节点上执行时,通过接口向本地的洗牌缓存执行器获取数据。

步骤14:本地洗牌缓存执行器接受到请求后,首先检查数据是否在内存中,如在内存中则直接返回对应数据,否则去磁盘获取对应的数据并返回。

步骤15:归约任务收到数据后开始计算。

步骤16:重复步骤11至步骤15直到所有归约任务执行完毕,进入步骤17。

步骤17:该映射-归约工作结束。

洗牌缓存系统的缓存数据替换策略:

由于每个节点的内存资源有限,为了不影响任务执行时的性能,洗牌缓存系统只会占用固定的内存空间(可以通过配置文件设置)。然而随着任务的不断执行,就会在主备份节点的内存缓存大量的洗牌归约数据。为了节约内存资源,洗牌缓存系统提供了最早缓存任务最先被剔除的策略。该策略遵循以下步骤。

步骤1:洗牌缓存系统执行节点检测到内存余量不足。

步骤2:该备份节点向洗牌缓存系统主机发送剔除请求。

步骤3:洗牌缓存系统主机收到剔除请求后,根据本地内存记录,找到最早被缓存的映射-洗牌工作对应的洗牌传输依赖ID,以及该工作所有归约任务的主备份节点。

步骤4:洗牌缓存系统将该洗牌传输依赖ID广播给集群中所有洗牌缓存系统的主备份节点。

步骤5:执行节点收到洗牌传输依赖ID之后从自己的内存中将对应的数据块从内存中删除。

洗牌缓存体统为计算框架提供的鲁棒性支持的恢复策略。

由于映射-归约计算框架在执行整个工作流程的时候包含了大量的映射-归约过程。如果配合了洗牌缓存系统,计算框架将不需要对计算数据进行手动的检查点设置。在任务执行过程中发生失败,则可以直接从最近的一次映射-归约的数据中直接恢复,大大减少了恢复时间,提升了计算性能。该策略遵循以下步骤。

步骤1:计算框架出现运行错误。

步骤2:计算框架根据用户执行逻辑开始从后向前寻找最近被持久化的数据。

步骤3:计算框架搜寻时通过接口向洗牌缓存系统查询是否有相应的洗牌数据备份。

步骤4:如果查到有备份则直接从该步骤开始恢复。

步骤5:如果没有查到备份,则继续向前寻找,如果都没有备份,则按照计算框架的容错机制开始恢复。

在本次实施例的基础上通过Word Count等相关Spark的benchmark程序,验证了本发明的正确性,同时本发明在性能上相较于原版的Spark在不同的benchmark程序上都有不同程度的提升。

以上详细描述了本发明的较佳具体实施例。应当理解,本领域的普通技术无需创造性劳动就可以根据本发明的构思做出诸多修改和变化。因此,凡本技术领域中技术人员依本发明的构思在现有技术的基础上通过逻辑分析、推理或者有限的实验可以得到的技术方案,皆应在由权利要求书所确定的保护范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1