具有键/值存储检查点的基于流簇的处理的制作方法

文档序号:14033780阅读:179来源:国知局
具有键/值存储检查点的基于流簇的处理的制作方法

相关申请的交叉引用

本申请主张2015年4月17日申请的第14/689,197号美国专利申请的优先权,且所述专利申请以引用的方式并入本文中。

此外,以下进一步的美国专利申请的内容也以引用的方式并入本文中:2011年4月13日申请的第13/086,132号美国专利申请;2012年7月13日申请的第13/548,805号美国专利申请;2011年8月25日申请的第13/218,082号美国专利申请;2011年12月16日申请的第13/328,570号美国专利申请;以及2013年10月15日申请的第14/054,112号美国专利申请,其为主张2012年10月15日申请的第61/713,957号和2013年1月2日申请的第61/748,233号美国临时专利申请的优先权的非临时申请,所有所述美国专利申请的内容也以引用的方式并入本文中。

本发明的各个方面可涉及高性能计算系统。



背景技术:

需要分析的数据集的大小多年来已极大地增加,且计算系统和策略已经经设计以达到尝试和赶上数据集大小的增加速度。然而,目前系统在性能方面一直落后于数据集大小增加的步调。

例如第2008/0086442号美国专利申请公开案和/或dean等人的“mapreduce:针对大群集的简化数据处理(mapreduce:simplifieddataprocessingonlargeclusters)”(osdi2004)中所论述的mapreduce技术提供一种进行大数据集处理的方式。然而,此类现有技术可以变得较快且更有效。

此外,当以mapreduce编程模型实施时,特定应用/算法可具有工作流程内的同步点(屏障),其中一个级直至另一级完全完成处理时才能开始。这还可能导致低效率。



技术实现要素:

本发明的各个方面可涉及用以解决现有大数据分析技术的上文提及的局限性和/或大体提供高性能计算环境的技术。涉及称为“流簇(flowlet)”(下文将更详细地论述)的内容的使用的本文中所描述的技术可使用硬件、软件、固件和/或其组合来实施。流簇的类型可包括键值存储(keyvaluestore)流簇和/或其它类型的流簇。键值存储(kvs)流簇可用于容错技术中。

附图说明

现将结合附图描述本发明的各个方面,附图中:

图1展示工作流程的非限制性实例;

图2展示流量控制序列的非限制性实例;

图3展示流簇的多个示例以及流簇之间的交互的实例;

图4展示使用根据本发明的各种技术实施的约简操作的实例;

图5a-5d展示工作聚合序列的实例;

图6展示内存分配的各种实例;

图7a-7f展示流程控制的进一步实例;

图8展示节点内负载均衡的实例;

图9a-9c展示节点内负载均衡的进一步实例;

图10a-10h展示计算节点处的处理情境的实例;

图11a和11b展示实施优先的任务的系统的实例;

图12展示共享键/值存储的实例;

图13a和13b展示键/值数据存储的实例;

图14a和14b展示可结合本文中所描述的技术的各种实施方案使用的容错机制的实例;

图15展示使用状态保持的进一步实例;

图16展示根据本文中所描述的技术的各种实施方案的概念系统的实例;以及

图17a-17f展示根据本发明的一方面的进一步容错机制的实例。

具体实施方式

一般来说,流簇的使用可促进用于在分布式计算系统中以工作流程(workflow)的形式处理数据的技术,工作流程可由多个数据流程行为者(称为流簇,其将在下文进一步论述)组成,所述数据流程行为者可含有从一个或多个数据源到一个或多个数据宿的用户自定义函数(udf)。这些概念以及其如何交互的各个方面将在下文论述。

如上所述,“工作流程”为可在当前技术的各个方面中使用的高层级构造。工作流程被界定为含有一个或多个数据源、一个或多个流簇以及一个或多个数据宿,其中这些组件可根据有向非循环图(dag)来组织。流簇可接收数据,经由某一用户自定义函数处理数据,且输出结果数据。数据可由另一流簇接收或发送到另一流簇,或者由某一外部装置接收或发送到某一外部装置,所述外部装置例如(但不限于)数据库、文件系统或套接口。工作流程可在分布式计算系统上执行。图1展示工作流程的非限制性实例,其中数据从数据源1经由各种流簇(根据各种路径)流动到数据宿1。各种流簇展示为含有各种udfs。流簇不一定限于含有单一udf,也不限于具有单一数据源或数据宿。类似地,工作流程不限于具有单一数据源和/或单一数据宿。

关于流簇,流簇是工作流程中的数据流程行为者,该工作流程经设计以对输入数据集执行计算且产生一或多个输出数据集。如图2中所展示,流簇可经受某一形式的“流程控制”或“限流”。如图2中所展示,产生者流簇可处理数据且将输出数据发送到与消费者流簇相关联的位元或队列。如果消费者流簇(或一般来说,某一下游行为者)不具有用以存储传入数据的空间或出于某一其它原因而过载(例如(但不限于),具有太多任务待在例如工作队列中执行),那么消费者流簇(或下游行为者)可产生流程控制事件201,其可由系统处理且可导致产生者流簇被指示停止产生更多输出数据。此可持续设定的时间周期,或直至新流程控制事件指示产生者流簇可再次产生输出数据为止。在一变化过程中,流程控制事件可用于致使产生者流簇以较低速率(向下限流)输出数据,直至消费者流簇再次能够接收进一步数据为止,此时进一步流程控制事件可用于致使产生者流簇恢复处理且以先前速率(“向上限流”)输出数据。

在替代实施方案中,流程控制可采取其它形式。举例来说,产生者流簇和/或消费者流簇可分别在存在准备好传递的数据时或需要数据时传送,且数据可基于此类请求从产生者传递到消费者。可使用基于窗口的流程控制,作为另一替代方案。在流程控制的另一实例中,流簇例项可在其变得过载的情况下告知到所述流簇的上游输入源停止或限制读取数据;此不仅可适用于直接上游数据源(例如,数据由流簇例项消耗的产生者流簇)而且可适用于间接上游数据源(例如,除数据由流簇例项消耗的产生者流簇之外,数据直接或间接地再次被使用的流簇)。一般来说,流程控制不一定限于这些方案中的任一者,而是还可并入此项技术中已知的其它流程控制算法。

在产生者流簇停止/暂停的情况下,数据的处理发生中断。可基于各种因素发生不同类型的中断。确切地说,中断可包括主动返回(例如,编程者用以输出数据的函数传回错误码,所述错误码要求编程者在系统中对如何处置且接着将控制权转交到系统进行编程)或被动返回(例如,投掷异常以将控制权转交回到系统,或由运行时系统或操作系统切换堆栈;应注意,“运行时”或“运行时系统”可指代特定计算节点或计算节点的集合或整个系统,其可能是依赖于实施)。在任一情况下,通常可能需要保留用户自定义函数的内部状态使得所述函数可在其由系统恢复时继续。维持此状态一致性的一种方式可使用堆栈切换(例如,由运行时系统作为用户层级线程或由操作系统作为重量级线程)。另一方式可使用面向对象的编程;此类技术可约束编程者将udf的状态存储在从系统提供的流簇对象细分的对象的性质中。然而,此可节省存储器空间,因为堆栈切换可需要尺寸很大的堆栈(即,大于1mb),而用户需要存储的状态可能通常小得多,常常约10-100字节。另一技术可提供指针,udf可使用所述指针来分配空间和存储任何内部状态。此第三种方法可用于例如可能不容易支持面向对象的编程的编程语言,例如c或fortran。进一步技术可允许编程者在特定使用案例中针对最佳模式而从多个技术中进行选择。

现参看图3,给定流簇可在运行时在一个或多个计算节点上实例化301为一个或多个流簇例项(即,在不经由例如以太网、无限宽带、numalink等网络接口通信的情况下并不共享可寻址内存的计算单元)。流簇例项可一起工作以推进分布式流簇的进程。计算可在各种流簇例项之间分区以使跨越一组计算节点302的工作负载达到平衡。计算分区可使用相关联数据分区。数据可使用“键/值对”(“键”作为路线且“值”作为有效负载)的概念分区。具有相同键的所有键/值对可投送到相同计算节点。可存在各种原因注解具有相同键的多个值,包括(但不限于):所述工作只是需要跨越机器分布且无数据输入聚合要求;下游流簇需要立即聚合和呈现所有值以供处理;下游流簇具有在特定计算节点本地的内部只读信息;或下游流簇具有在特定计算节点本地的必须经原子更新的内部读取-写入信息。

举例来说,考虑上文提及的mapreduce范例中发现的标准约简器。此范例中的一个问题是,标准约简器可能通常需要在可发生任何约简之前由先前映射器发射所有键/值对(使用本发明的术语)。因此,给定约简器可能直到其接收数据的最慢的映射器已完成才开始;这可导致负载不平衡。此外,此可需要将大量数据存储到磁盘,因为其不适合可较容易访问的内存,因此潜在地导致许多磁盘访问,从而可能进一步减慢处理。

现在转而参看图4,上文描述的键/值映射(其中下游流簇具有在特定计算节点本地的必须经原子更新的内部读取-写入信息)可提供针对这两个问题的解决方案。如果可一次一个值地进行约简,那么流簇可产生含有值的部分约简的内部内存存储(其可通过键寻址)。举例来说,如果约简器的任务是对键的所有值求和且发射键/值对<键,值的和>,那么内部内存存储可初始化到零,且当键值对到达流簇时,流簇可原子级将值加到内部存储的当前值,从而产生部分和401,如图4中反映。当来自上游流簇的所有键/值对已经产生时,最终和可作为<键,最终和>发射。此部分约简流簇可通过允许上游流簇完成之前的异步部分计算而改进计算问题之前的同步;可有助于寻址大中间数据问题;以及可缓解将中间数据存储到磁盘的需要(通过在键/值对产生时消耗所述键/值对且仅存储部分和)。

图5(由图5a-5d组成)展示工作聚合序列的实例。键/值对可以是任何大小。在许多使用案例中,键和值两者可较小。通常可存在用于处理一批键/值对的固定开销,而无关于个别对的大小。此类开销的一些实例可包括处理过程中的网络开销、所发送/接收的每一消息的数据标头大小、从运行时系统的工作队列获得键/值对群组的过程中的开销,以及检查点(checkpoint)一批键/值对之间的状态的过程中的开销。可通过将多个键/值对聚合到单一批次中来约简处理开销,其中键/值对可存储在一起且可作为同一批次处理。在如图6中所展示的技术中,流簇可通过将键/值对聚合到位元501中而缓解开销问题。位元501可在位元转发到下一流簇(如箭头502指示)之前累积一个或多个键/值对。位元501的大小可因此决定转发到下一流簇502或数据宿的工作量(参看,例如图1)。类似地,位元大小可决定可从上游流簇或源接收的工作量(即,针对其中可存储输入数据的位元)。在一个可能实施方案中,用户可定义位元的大小。在另一实施方案中,运行时系统可基于动态运行时参数的观测而确定位元大小,所述参数例如系统中的剩余工作、流簇在工作流程中的位置、产生者流簇相对于消费者流簇的优先级,或可能影响相对于位元大小的性能的其它因素。一般来说,较大位元在较多键/值对上摊销固定开销,但可限制并行。在一个实施方案中,如果单一键/值对大于位元大小,那么其可在单一“超大”位元中发送。在另一实施方案中,此键/值对可分段到多个位元中且在消费者流簇处重新汇编。

如上文所论述和图2中展示,流程控制可结合基于工作流程/流簇的处理来使用。如上文所论述,如果流簇不具有存储传入的输入数据的空间,那么其可将流程控制事件201发送到上游流簇,所述上游流簇可指示先前产生者流簇应例如(临时)停止数据输出。每一计算节点可将特定量的内存分配用于接收传入的数据以供将来处理。一些实施方案可具有静态最大量的空间,而其它实施方案归因于其它内存约束(例如(但不限于)以下案例:如果执行的一个部分在执行的某一初始周期之后需要可被删除的大查找表,那么在查找表删除之后较多空间可分配给传入数据)可增长和缩减贯穿所述程序的过程的所述空间。

可用内存可以以不同方式在局部流簇例项之间划分,如图6中所展示。在一实例601中,流簇可接收的内存的量可依据位元的数目计数。在另一实例602中,空间的量可以以字节计数。其它单位也是可能的,例如位、字等,且本发明因此不受限制。

一些实施方案603可在产生者之间静态地分区传入数据内存(例如,每一计算节点可具有作为产生者的流簇例项,且10mb空间可在10个产生者之间均匀划分使得每一者具有1mb的空间)。其它实施方案604可在产生者之间动态地分区传入数据内存;例如,此可使得任何产生者能产生数据,只要不超出整个空间限制即可(例如,在给定时间,可在10个产生者之间使用10mb空间使得第一产生者可使用5.5mb且另外九个产生者各自可使用0.5mb)。进一步实施方案605可在特定计算节点上运行的流簇之间静态地分区传入数据内存(例如,如果存在四个流簇和40mb的总传入数据空间,那么每一流簇可被分配10mb)。进一步实施方案可在计算节点上运行的流簇之间动态地分区传入数据存储器(例如,如果存在四个流簇和40mb的总传入数据空间,那么在给定时间处,一个流簇可被分配20mb,另外两个各自可被分配10mb,且最后一个流簇可能未被分配任何空间,且此可基于将来情形进行调节)。

图7(由图7a-7f组成)进一步说明可如何实施流程控制的方面。流程控制的一个方面可以是:如果消费者不具有存储数据的任何空间,那么产生者不应产生更多数据。因此,在一些实例实施方案中,在产生者开始产生数据之前,保留空间量的信息可在产生者和消费者之间通信。举例来说,图7a中,消费者流簇可以以空位元700开始。随着产生者产生数据且将其发射到消费者701的位元,产生者可递减其可用空间的计数,如图7b和7c中所示,直至消费者确认其已消耗数据702,如图7d中所示。如果由产生者维护的计数达到零703,如图7e中所示,那么消费者可发送流程控制事件704(或者,产生者可触发其自身的流程控制事件),如图7f中所示,这可致使产生者被中断。在此情况下,产生者在其上执行的工作线程可释放回到系统用于其它处理。

在单一计算节点内,存在共享可寻址内存和容易地且有效地共享数据的若干计算单元。在程序开始时,若干流簇例项可开始,且可从工作流程数据源读取。图8展示此如何实施的三个非限制性实例。在一个实例801中,可以每数据源每计算节点开始一个流簇例项。在另一实例802中,可每数据源每计算节点开始等于计算单元的数目的流簇例项。在第三实例803中,每数据源每计算节点开始一个与计算单元数目之间的某一数目。常常可存在平衡并行处理时数据资源的争用的依赖数据源数目的最佳例项。

现在转而参看图9(由图9a-9c组成),当开始流簇例项时,其可作为任务放置于工作队列901中。运行时系统可实施一或多个工作线程(t1、t2、…、tn),其可从工作队列取出任务。在一个实例中,工作线程的数目可等于计算单元的数目,从而试图最大限度地利用所有计算单元。在另一实例中,工作线程的数目可小于计算单元的数目(在一个特定实例中,确切地说少一个),使得计算单元可在特定程序和系统上同时运行的其它程序之间高效地共享(由操作系统)。在一个实例中,工作队列901可以是由所有工作线程共享的简单先入先出队列,如图9a中所示。在另一实例中,工作队列可以是一系列分布队列(例如,每工作线程一个),其可经布置使得工作线程可从其相关联队列局部牵引,且当其为空时可从其它队列“盗窃”任务902,如图9b中所展示。在另一实例中,如图9c中所示,工作可由主工作者(线程)903进行负载平衡,主工作者(线程)903可检查每一工作者的传入队列且可在必要的情形下进行再分布。

工作线程可获得任务,且可确定与任务相关联的流簇的类型。任务还可含有所述流簇的一个或多个键/值对。对于每一键/值对,工作线程可执行流簇的用户自定义函数。或者,如果流簇需要,那么工作线程可在处理之前存储键/值对以供所有值的稍后完整聚合。流簇的用户自定义函数可处理键/值对,可能产生存储于流簇例项中的内部状态、键索引的内存存储,或用户产生的堆对象。在处理键/值对期间或之后,用户自定义函数可发射零个、一个或更多键/值对(流簇可改变其内部状态或内存存储状态,且不需要发射任何东西,因为将来的处理可引起所述发射)。

图10(由图10a-10h组成)展示计算节点处的处理情境的实例。图10a中,工作线程t1可执行任务a。图10a中,到t1的输入位元展示为完整的,且输出位元展示为含有一个空位置(本发明不限于位元的大小为三,但此在图10的图示中用作实例)。图10b中,如果处理下一键/值对将致使位元中当前聚合的键/值超出位元大小,那么位元可发送1001到消费者,在此情况下为工作线程t2上运行的任务b(例如(但不限于)分类、组合和/或过滤等可能的后处理之后)。在一些情况下,输出位元可在其满之前清空,这可基于例如经过时间、到流簇的输入数据的速率、其它计算节点上其它流簇的不足等事件。此在例如“实时”系统中可能是有用的,在“实时”系统中,稀少输入数据事件的及时处理可比节省处理许多事件的开销更重要。如果不使用聚合,那么每一键/值对可触发一次发送。

图10c中,t1的输出位元已满,且t1的输入位元中仍有数据待处理。然而,t2的输入位元仍含有一个条目(且t2的输出位元含有两个条目)。在此情况下,如果数据正在t1的输出位元处聚合,那么聚合的数据将对于t2的输入位元来说太大。如果在任何时间所发射的键/值对将超出分配给消费者的空间量,那么产生者流簇例项可以被中断1002,如图10d中所展示。如图10e中所展示,产生者流簇接着可放置在“待决”队列1003上。工作线程(在此情况下,为t1)接着可从工作队列获得另一任务,且执行所述任务1004。如图10e-10f的实例中所展示,此其它任务可以是任务c。当消费者(t2处,在图10的实例中)最后处理来自产生者1005的一批键/值对时,消费者接着可警告产生者计算节点上的运行时系统更多空间可用1006。运行时系统接着可移动“待决”任务(在此实例中,为任务a)到工作队列1007,如图10f-10g中所注意指到。当工作线程完成当前任务(例如,任务c)时,其可返回到工作队列以恢复待决任务(例如,任务a)的计算1008,如图10h中所展示。待决任务可“记住”其在何处停止且可获得来自堆栈的任何内部状态、其对象性质或用户分配的堆空间,以便这样做。

除上文之外,在一些实例实施方案中,任务可区分优先级,且可能需要中断低优先级任务使得计算单元件可用于处理高优先级任务。此在图11a-11b中展示的实例中反映。如图11a和11b中分别展示,此中断可以在输入键/值对粒度上或在输出键/值对粒度上发生。举例来说,当新的高优先级任务(任务4)到达1101时,工作线程t1可正在执行任务1。在输入键/值对粒度上,如图10a中反映,工作线程可作出用户自定义函数的调用之间的决策1102;任务4可抢先于任务1,且任务1可放置在普通工作队列上。在输出键/值对粒度上,如图10b中反映,初始地执行任务11103的工作线程可被类似于用于流程控制的机制的机制中断,且再次,任务4可抢先于任务1,且任务1可放置在普通工作队列上。

一些使用案例可能需要大于任一单个计算节点的主内存的数据的内存。此数据可常常用作贯穿工作流程的参考。解决此问题的一种方式可以是以多种方式跨越非共享内存空间分配参考数据,例如(但不限于)分取全局地址空间(pgas)(如通用平行c、shmem、全局阵列等中所使用)、分布式散列表(dht)(如amazondynamo、apachecassandra、apacheaccumulo和terracotta等中所使用),或水平或垂直分区的数据库(如nosql数据库、oracle、emcgreenplum等中所使用)。然而,所有这些机制都需要用户请求数据(通常远程)且将数据带回到本地计算单元以供处理。此可在许多情况下需要请求者长时间等待响应,才可继续计算。

作为一个替代方案,根据当前技术的各种实施方案,可改为将计算引入至数据。此可借助于共享键/值存储来完成,其一实例在图12中展示。键可定义数据在何处定位(例如,pgas模型中的阵列元素、dht模型中的散列表键,或在分区数据库的情况下的表行或列索引)。在图12中展示的实例中,用户可定义用于参考数据的键/值对映射1201。参考键/值对可在系统的计算节点1202之间分区且分布到系统的计算节点1202。(1203)一旦参考键/值对存在于分布式系统的本地内存中,共享键/值存储就可用于工作流程内的共享相当的键分区方案的所有流簇(如1203指示)。通过将计算发送到本地数据,有可能继续其它计算。

例如如图12的实例中所使用的共享键/值数据存储可以是写入一次数据存储1301,其中一旦键入键/值对,键的值就是只读的,且利用相同键写入两个键/值对是禁止的。此在图13a中说明。作为替代或另外,键/值数据存储可被实施为写入多次数据存储1302,如图13b中所展示,其中在键入键/值对之后,键的值可被附加或修改。其中其可适用的写入一次模式可更具有弹性,因为其可以以规则的间隔大量进行检查点。然而,写入多次模式可更一般地可适用,但其可能与高弹性成本相关联,因为其可能需要常常进行检查点,且检验点之间的修改对于系统的其余部分来说可能需要处理为原子级的。

可采用分布式容错机制在工作流程的执行期间对节点故障进行操作。容错性可经由细粒度检查点和工作复制的组合而实现。容错机制的实例在图14a-14b中展示。在当前实例中,如图14a中所展示,当从无法容易地重新产生的源(例如数据流1401)读取数据时,所述数据可在初级和次级计算节点(在此实例中,分别为节点1和节点2)上复制。图14a中,流簇a(其可消耗来自数据流1401的数据)可在两个计算节点上实例化,即,可存在流簇a的初级实例化和流簇a的次级实例化。在图14a中展示的实例中,第二流簇(流簇b)可消耗来自流簇a的输出,且还可在节点1和节点2两者上实例化。在此实例中,节点2上流簇b的实例化可消耗由节点1上流簇a输出的数据(然而,本发明因此不受限制)。无状态流簇(例如读取器、映射器、约简器和写入器)之间的弹性可通过在产生者1402和消费者1403侧两者上复制键/值对(其可在位元中聚合)直至数据由消费者处理且可安全地丢弃来维持。当产生流簇将数据发送到消耗流簇时,其可在本地保持副本。消费者也可将数据的副本保持在用于接收传入数据的存储区域中。如图14b中所展示,当消费者流簇例项消耗键/值对批次时,其可通知1405产生者键/值对批次是完整的,且产生者接着可被准许毁灭复制的数据1406。

对于保持状态的流簇(例如,部分约简器),所述状态可能需要在其它节点上进行检查点操作。图15展示此可如何实施的实例。假定其中所有状态数据复制在另一节点上的初始条件,例如(但不限于)其中不存在状态数据的初始条件。一批一个或多个键/值对可到达以供在节点1处处理1501。状态存储1503可经锁定使得仅单一工作线程(例如线程1)可能够访问存储以供处理此批次的键/值对;也就是说,另一工作线程(例如线程2)可避免1502访问所述存储。处理数据的工作线程(在图15的实例中的线程1)可相应地修改状态存储1503。在键/值对中的一者或多者的处理完成(或归因于流程控制或更高优先级任务而中断)后,经修改的状态可发送1504到另一节点(例如节点2)作为复制的检查点副本,且所述状态存储接着可解锁。以此方式,如果节点1失败,那么可从处理键/值对批次之前重新产生所述状态,且键/值对批次可从产生者流簇计算节点恢复。应注意,尽管针对特定流簇的状态存储可锁定使得特定流簇的例项不可使用所述状态存储,但其它流簇可同时使用其它状态存储。

经修改的状态可发送到另一节点的频率可由编程者或系统操作者确定,且此可影响从故障/中断恢复的粒度。如果此在每一键/值对的处理之后发生,那么处理可在最后一个经处理的键/值对之后的键/值对处恢复。如果此类冗余存储发生得不太频繁,那么恢复可能仅能够从最后一个键/值对或键/值对群组(在经修改的状态发送到另一节点之前经处理)之后的点开始。

对于跨越流簇的数据存储(例如(但不限于)上文描述的共享键/值存储),所述状态可以与上文针对单一流簇状态存储类似的方式复制。然而,每次仅一个流簇可修改所述存储。对于写入一次存储,一旦写入数据,读取器就可同时使用所述存储而无冲突。

利用以上方法,任何单一节点故障可从复制的数据恢复(应注意,一旦实现从特定单一节点故障恢复,单一节点故障恢复就可以再次实现)。此容错计划的一个实施方案可在其中产生者和消费者流簇在相同计算节点上的情况下将数据复制到另一计算节点上。

其它实施方案可将流簇的输入/输出数据不仅仅复制在产生者和消费者流簇的计算节点上。在输入/输出数据仅复制在产生者和消费者计算节点上的情况下,系统可在故障和恢复之间回弹到确切的一个计算节点故障。在第一节点恢复之前如果第二节点失败,那么节点之间共享的由产生者和消费者保持的数据可能丢失。因此,将数据复制在n个更多节点上可准许n+1个故障在程序的总故障之前同时发生。此表示复制空间和时间开销和从若干同时故障恢复的需要之间的折衷,其为所述故障模式的不可能性的函数。

关于可需要考虑多少故障/需要多少数据/状态的复制的确定可能依据用户/编程者判断,其可基于例如程序的敏感度、任一单个节点的平均无故障时间(meantimebetweenfailures)、系统中节点的数目、所需系统开机时间,和/或其它因素。在一些情境中,最小容错性可能足够,而在其它情境中,可能关键的是很大程度上确保程序执行不会失败。这些技术的各种实施方案可准许编程者指示和/或实施适合于给定程序的容错度。

一些应用/算法(例如,当使用map/reduce编程模型(但不一定限于此)实施时)可具有工作流程内的同步点(或“屏障”),所述工作流程中,一个阶段直至另一阶段完全完成处理才可开始。在基于流簇的系统中,可引入键值储存(kvs)流簇来实施此屏障。kvs流簇通常是同步的。在kvs流簇处,可存储特定时间点处工作流程的整个中间状态,这可准许检查点。

为了理解使用kvs流簇用于检查点的kvs流簇的使用,可注意到,尤其在涉及大量数据/状态和/或计算密集型的应用中,可能希望在实施所述应用的工作流程失败的情况下最小化所执行的重复工作的量。然而,简单地在任何给定点处停止工作流程可能不可行,因为例如:(a)在任何给定时间点处,可存在将需要保存以保持进行中的任务的完整“快照”的巨大量的上下文(context);以及(b)即使之前能够俘获得所有状态信息,该状态信息取决于俘获得上下文的细粒度,并不保证可通过重放和“快进”工作流程而到达获得相同上下文,这是归因于非确定性任务调度、产生键/值对、基于可用内存的缓冲等。kvs检查点可解决此类问题。同步kvs流簇可用于提供将键/值数据推进存储的操作和将键/值数据推出存储的操作之间的屏障。因此,在使用此kvs流簇的情况下,可直至kvs流簇上游的流簇已完成其与存储的事项时才可允许下游流簇将数据推出存储空间。

在切实可行的水平上,kvs流簇可接收所有上游事项已经完成的通知,以保证已接收来自上游流簇的所有数据。因此,工作流程中的某一中间点(例如,(但不限于)非迭代工作流程中的中间数据存储,或迭代工作流程中的每一迭代结束时的结果)处实施的kvs流簇可提供对工作流程进行检查点的“自由”机会(“自由”意思是,在上游完成后,无下游流簇正产生键/值对,且kvs流簇未在上游发送任何内容,从而意味着可能不需要额外控制(或性能开销)来暂停工作流程;显然,存在将键/值存储数据写入到存储器的成本,如下文将进一步论述)。如果上游数据产生者产生的所有数据聚合到单一下游kvs流簇中,那么kvs流簇可用作检验点,从而意味着在kvs流簇下游的故障之后(或在迭代工作流程的进一步迭代中)任务重新启动后,上游数据产生者完全不需要运行(或先前迭代完全不必运行);本质上,由kvs流簇产生的键/值存储可替代整个上游图(或所有先前迭代)且被视为用于重新启动的登录流簇。

为了理解kvs流簇的使用,理解图论的一些方面是有用的。确切地说,“在控制流程图中,如果从登录节点到n的每一路径必须穿过d,那么节点d支配节点n”。“支配者(图论)”,维基百科,自由百科全书(en.wikipedia.org/wiki/dominator_(graph_theory)。因此,在kvs流簇支配上游产生者的程度上,那些上游产生者可在故障之后重新启动期间基本上停用,且如kvs流簇存储的其结果可“快进”到工作流程故障发生的时间点。并非由kvs支配的任何产生者需要再产生其数据中的一些或全部(且应注意,在多分支应用中,可存在支配上游产生者的不同子集的不同kvs流簇,因此快进有可能对于工作流程的不同分支达到不同程度)。

图16说明已插入kvs流簇的工作流程的实例。图16中,kvs流簇167可经由节点164支配产生者161,因为来自分支164/161的数据到达写入流簇168的唯一方式是经由kvs流簇167。然而,产生者162和163不由kvs流簇167支配,因为每一者展示为具有绕过kvs流簇167的路径(162/166和163/166)(纵使产生者162也具有经过kvs流簇167的路径162/165,但并不防止数据绕过kvs流簇167)。因此,在来自kvs流簇167下游的故障后,产生者161可能不需要再产生其结果,但产生者162和163可需要运行,以再产生其结果。

图17a-17f展示kvs流簇可如何插入到工作流程中且用于检查点和恢复的逐步骤实例。图17a展示具有数据源171、读取流簇172、第一处理流簇173、第一kvs流簇(kvs1)174、第二处理流簇175、第二kvs流簇(kvs2)176、第三处理流簇177、第三kvs流簇(kvs3)178、写入流簇179和数据宿1710的工作流程的实例。图17b中,所有三个kvs流簇174、176、178可指定为检验点(展示为每一相应框的右下角的“x”)。图17c中,kvs1174可例如从第一处理流簇173或从控制器/控制逻辑(图未示)接收上游完整通知。作为响应,kvs1174可将从上游处理累积的数据写入到存储器1711,存储器1711可以是(例如)磁盘。图17d中,kvs2176可例如从第二处理流簇175或从控制器/控制逻辑(图未示)接收上游完整通知。作为响应,kvs2176可将从上游处理累积的数据写入到存储器1712,存储器1712可以是(例如)磁盘。图17e展示第三处理流簇177处的故障。图17f中,在故障之后,使用由kvs2176进行的检查点,kvs2176处累积的数据可从存储器1712检索,且处理可从所述点恢复,因此“快进”工作流程超过前两个处理流簇173、175。

本文中所描述的技术通常可扩展。可存在两个可具有扩展性的主轴线:计算单元和数据存储器。此可扩展系统的目标可以是使用计算系统的所有计算单元和数据存储单元或尽可能多的计算单元和数据存储单元来帮助解决大数据处理问题。另一目标可以是例如在其中键/值对到达以供处理的流媒体应用中根据某一实时约束增加处理量。可使任何节点上的内存数据的存储器可由所有节点经由基于键的索引而访问,如上文所描述。可经由例如(但不限于)hdfs、lustre、panassas等分布式文件系统使任何节点上的磁盘存储器可访问。一般来说,磁盘存储器可以以大的连续组块访问。代替从数据存储器(内存中或磁盘上)读取且将数据发送到请求者,计算请求可迁移到本地磁盘上具有数据的计算节点,如上文所描述。在特定数据绑定的情况下,下游流簇可以是上游流簇的延续部分。所述延续部分的目的地计算节点可由与其相关联的键/值对中的键定义。

键可在计算节点之间使用键到计算节点的任何一对一映射而分布。一个此类映射可以是将每一键转化为数字的确定性散列函数。所述数字和计算节点数目的模数可视为目的地计算节点。

所述延续部分可投送(依据键)到目的地计算节点以结束。以此方式,计算和数据可并置到特定键绑定的目的地以遍及大机器产生计算和数据的虚拟键空间。通常,键空间可比计算节点空间大几个数量级,因此所有或大多数计算节点可均一地参与计算和存储需求。参与可在某些状况下仅“几乎是”均一的,因为如果大量键绑定到特定计算节点(或如果由键绑定的计算和/或数据在键之间不均一地分布),那么散列函数可能产生某种不平衡。

计算节点在前文论述。应注意,此类计算节点通常含有不同类型的一或多个处理器或其它计算单元,且还可通常含有内存资源和/或其它计算机可读媒体。除内存之外,计算机可读媒体还可包括固态存储器(ram、rom、快闪等)、磁性存储器(例如,磁盘)、光学存储器(例如,cd、dvd、激光盘等),或其它非暂时性形式的存储器。含有计算节点的系统还可包括未与任何特定计算节点并置的另一计算机可读媒体。计算机可读媒体可含有可致使所述一或多个处理器或其它计算单元实施上文所论述的各种技术的指令。此类指令还可被下载或使得可用于下载。

此外,各种技术还可以硬件和/或固件的形式以及在软件中和/或其组合中实施。此类实施方案可包括(例如,但不限于)以可编程逻辑装置(pld)、专用集成电路(asic)等或其组合的形式的实施方案。

所属领域的技术人员应了解,本发明不受上文已明确地展示和描述的内容限制。事实上,本发明的范围包括上文描述的各种特征的组合和子组合两者,以及所属领域的技术人员在阅读以上描述后将了解的且不在现有技术中的修改和变化。

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