本申请涉及流计算技术领域,特别涉及一种基于流计算的数据处理方法、装置及电子设备。
背景技术:
作为流式计算任务的最小执行单位,算子失败是十分常见的,比如设备故障、用户代码抛出错误或者网络故障等等都可能造成算子执行失败。对批处理计算作业来说,通常单个任务失败的处理方式是重启并重新调度失败任务,而不影响其他任务和整体作业的运行,然而这个方式对于流式计算来说并不可用。
流式计算任务的算子执行失败恢复机制是从检查点(checkpoint)获取重放日志(redolog)和重新回放数据两步。对于重启后的新算子,它通过从检查点读取重放日志,但不能独立地重新回放数据,因为重放日志不包含数据的,要重新回放数据只能要求全部上游算子重新计算,因此需追溯到数据源算子。
当前,为了保证流式计算作业“精确一次(exactlyonce)”级别的一致性,流计算故障恢复的基本方案是重启流计算中所有的算子,即重置整个执行图(executiongraph)。对于大流量、高并发的流式计算任务,由于单个算子执行失败将重新启动流计算的所有算子,恢复耗时较长,从而导致流计算输出中断。这对实时性和稳定性有高要求的线上任务来说,比如欺诈检测、告警监控,异常检测等,其严重影响用户体验和可用性。
技术实现要素:
本申请提供了一种基于流计算的数据处理方法、装置及电子设备,本申请实施例采用的技术方案如下:
一种基于流计算的数据处理方法,包括:
响应于流计算中至少一个第一算子出现运行错误,确定所述第一算子的输入数据中未计算完成的第一数据,生成能够标识所述第一数据的第一标识;
获取预先保存的所述流计算的日志文件,基于所述日志文件初始化所述第一算子的数据;
构建所述第一算子与相邻上游算子,以及所述第一算子与相邻下游算子之间的数据连接;
向所述相邻上游算子发送所述第一标识,使所述相邻上游算子至少向所述第一算子重新发送所述第一数据,以使所述第一算子基于所述第一数据进行计算并更新数据。
在一些实施例中,所述确定所述第一算子的输入数据中未计算完成的第一数据,生成用于标识所述第一数据的第一标识,包括:
确定所述第一算子的第一映射关系,其中,所述第一映射关系包括所述第一算子分别与所述相邻上游算子和所述相邻下游算子的第一关联关系,和/或所述第一算子的输入数据和输出数据的第二关联关系;
确定所述第一算子在第一时段的输入数据和输出数据;其中,所述第一时段包括保存所述日志文件至所述第一算子出现运行错误之间的时段;
基于所述第一映射关系和所述第一算子在所述第一时段的输出数据,确定所述第一算子在所述第一时段的输入数据中未计算完成的所述第一数据,以及已计算完成的第二数据;
生成用于标识所述第一数据的所述第一标识,或生成通过标识所述第二数据以对所述第一数据进行标识的所述第一标识。
在一些实施例中,所述确定所述第一算子在第一时段的输入数据和输出数据,包括:
获取第二标识,其中,所述第二标识用于标识所述相邻上游算子在所述第一时段输出的第三数据;
基于所述第二标识确定所述第一算子在第一时段的输入数据;
获取第三标识,其中,所述第三标识用于标识所述相邻下游算子在所述第一时段输入的第四数据;
基于所述第三标识确定所述第一算子在第一时段的输出数据。
在一些实施例中,所述向所述相邻上游算子发送所述第一标识,使所述相邻上游算子至少向所述第一算子重新发送所述第一数据,以使所述第一算子基于所述第一数据进行计算并更新数据,包括:
向所述相邻上游算子发送所述第一标识,使所述相邻上游算子基于所述第一标识对所述第三数据中包含的所述第一数据和/或所述第二数据进行标识;
控制所述相邻上游算子向所述第一算子发送标识后的所述第三数据;
控制所述第一算子对所述第二数据进行计算,禁止向所述相邻下游算子输出数据;
控制所述第一算子对所述第一数据进行计算,向所述相邻下游算子输出数据。
在一些实施例中,所述向所述相邻上游算子发送所述第一标识,使所述相邻上游算子至少向所述第一算子重新发送所述第一数据,以使所述第一算子基于所述第一数据进行计算并更新数据,包括:
向所述相邻上游算子发送所述第一标识,使所述相邻上游算子基于所述第一标识从所述第三数据中提取所述第一数据;
控制所述相邻上游算子向所述第一算子重新发送所述第一数据;
控制所述第一算子对所述第一数据进行计算,并向所述相邻下游算子输出数据。
在一些实施例中,所述确定所述第一算子的第一映射关系,包括:
基于所述流计算的逻辑执行图和/或物理执行图确定所述第一算子的第一映射关系。
在一些实施例中,所述方法还包括:
响应于流计算中至少一个第一算子出现运行错误;
切断所述第一算子与所述相邻上游算子的数据连接,以及所述第一算子与所述相邻下游算子的数据连接;和/或
清空所述相邻上游算子的数据发送队列和所述相邻下游算子的数据接收队列;和/或
将所述相邻上游算子和所述相邻下游算子从第一模式切换至第二模式;响应于所述第一算子计算完成所述第一数据,将所述相邻上游算子、所述第一算子和所述相邻下游算子从所述第二模式切换至所述第一模式。
一种基于流计算的数据处理方法,包括:
接收第一管理器发送的第一通知,其中,所述第一通知用于通知相邻下游的第一算子出现运行错误;
向所述第一管理器反馈用于标识第一时段向所述第一算子发送的第三数据的第二标识,以使所述第一管理器基于所述第二标识确定用于标识第一数据的第一标识;其中,所述第一时段包括保存日志文件至所述第一算子出现运行错误之间的时段;所述第一数据包括所述第三数据中未被所述第一算子计算完成的数据;
响应于所述第一管理器基于所述流计算的日志文件初始化所述第一算子的数据,与初始化完成的所述第一算子建立数据连接;
接收所述第一管理器发送的所述第一标识,基于所述第一标识至少向所述第一算子重新发送所述第一数据,以使所述第一算子基于所述第一数据进行计算并更新数据。
一种基于流计算的数据处理装置,包括:
确定模块,用于响应于流计算中至少一个第一算子出现运行错误,确定所述第一算子的输入数据中未计算完成的第一数据,生成能够标识所述第一数据的第一标识;
初始化模块,用于获取预先保存的所述流计算的日志文件,基于所述日志文件初始化所述第一算子的数据;
第一构建模块,用于构建所述第一算子与相邻上游算子,以及所述第一算子与相邻下游算子之间的数据连接;
第一发送模块,用于向所述相邻上游算子发送所述第一标识,使所述相邻上游算子至少向所述第一算子重新发送所述第一数据,以使所述第一算子基于所述第一数据进行计算并更新数据。
一种基于流计算的数据处理装置,包括:
接收模块,用于接收第一管理器发送的第一通知,其中,所述第一通知用于通知相邻下游的第一算子出现运行错误;
反馈模块,用于向所述第一管理器反馈用于标识第一时段向所述第一算子发送的第三数据的第二标识,以使所述第一管理器基于所述第二标识确定用于标识第一数据的第一标识;其中,所述第一时段包括保存日志文件至所述第一算子出现运行错误之间的时段;所述第一数据包括所述第三数据中未被所述第一算子计算完成的数据;
第二构建模块,用于响应于所述第一管理器基于流计算的日志文件初始化所述第一算子的数据,与初始化完成的所述第一算子建立数据连接;
第二发送模块,用于接收所述第一管理器发送的所述第一标识,基于所述第一标识至少向所述第一算子重新发送所述第一数据,以使所述第一算子基于所述第一数据进行计算并更新数据。
一种电子设备,包括如上所述的数据处理装置,还包括:
相邻上游算子,用于接收所述第一标识,至少基于所述第一标识向所述第一算子重新发送所述第一数据;
第一算子,用于基于所述第一数据进行计算并更新数据。
本申请实施例的基于流计算的数据处理方法,仅需基于日志文件重新初始化出现运行错误的第一算子,无需重新初始化全部算子,也无需重新初始化第一算子及其下游算子,就能够实现精确一次级别的数据一致性,能够显著降低故障恢复延迟,提高系统稳定性,改善用户体验。
附图说明
图1为本申请实施例的基于流计算的数据处理方法的第一种实施例的流程图;
图2为本申请实施例的基于流计算的数据处理方法的场景示意图;
图3为本申请实施例的基于流计算的数据处理方法的第二种实施例的流程图;
图4为本申请实施例的基于流计算的数据处理方法的第三种实施例的流程图;
图5为本申请实施例的基于流计算的数据处理装置的第一种实施例的结构框图;
图6为本申请实施例的基于流计算的数据处理装置的第二种实施例的结构框图。
具体实施方式
此处参考附图描述本申请的各种方案以及特征。
应理解的是,可以对此处申请的实施例做出各种修改。因此,上述说明书不应该视为限制,而仅是作为实施例的范例。本领域的技术人员将想到在本申请的范围和精神内的其他修改。
包含在说明书中并构成说明书的一部分的附图示出了本申请的实施例,并且与上面给出的对本申请的大致描述以及下面给出的对实施例的详细描述一起用于解释本申请的原理。
通过下面参照附图对给定为非限制性实例的实施例的优选形式的描述,本申请的这些和其它特性将会变得显而易见。
还应当理解,尽管已经参照一些具体实例对本申请进行了描述,但本领域技术人员能够确定地实现本申请的很多其它等效形式。
当结合附图时,鉴于以下详细说明,本申请的上述和其他方面、特征和优势将变得更为显而易见。
此后参照附图描述本申请的具体实施例;然而,应当理解,所申请的实施例仅仅是本申请的实例,其可采用多种方式实施。熟知和/或重复的功能和结构并未详细描述以避免不必要或多余的细节使得本申请模糊不清。因此,本文所申请的具体的结构性和功能性细节并非意在限定,而是仅仅作为权利要求的基础和代表性基础用于教导本领域技术人员以实质上任意合适的详细结构多样地使用本申请。
本说明书可使用词组“在一种实施例中”、“在另一个实施例中”、“在又一实施例中”或“在其他实施例中”,其均可指代根据本申请的相同或不同实施例中的一个或多个。
本申请实施例提供了一种基于流计算的数据处理方法,通过确定出现运行错误的算子的输入数据中未计算完成的数据,基于日志文件初始化运行错误的算子后,驱使相邻上游算子至少重新发送未计算完成的数据,使该初始化的算子精确的恢复到出现运行错误时的状态,能够实现确保流计算精确一次级别的一致性。
参见图1所示,本申请实施例的基于流计算的数据处理方法具体包括如下步骤:
s110,响应于流计算中至少一个第一算子出现运行错误,确定所述第一算子的输入数据中未计算完成的第一数据,生成能够标识所述第一数据的第一标识。
流计算中的算子运行错误时,通常会出现算子无响应、无法识别或生成错误代码等情况。在具体实施时,可通过例如一第二管理器来监控算子状态,在确定流计算中的第一算子出现无响应、无法识别或生成错误代码等情况时,确定该第一算子出现运行错误,向一第一管理器发送第一信息,以通知第一管理器第一算子运行错误,该第一信息可包括例如用于标识该第一算子身份的身份标识。
可通过例如该第一管理器响应于接收到第一信息,而确定第一算子的输入数据中未计算完成的第一数据。如图2中a部分所示为流计算出现运行错误时的状态示意图,以b1算子出现运行错误为例,b1算子从其相邻上游的a1算子接收的输入数据可包括{v,w,x,y},在b1算子出现运行错误之前已经计算完成数据v和w,向相邻下游的c1算子发送了数据v1,向相邻下游的e1算子发送了数据w1,数据x和y即为出现运行错误的b1算子未计算完成的第一数据,也即第一数据包括{x,y}。
第一管理器在确定第一数据的情况下,可基于确定的第一数据生成能够标识该第一数据的第一标识。在具体实施时,第一标识可通过多种方式来标识该第一数据,如该第一标识可通过标识数据队列中起始数据项和结束数据项的方式对对已数据进行标识,该第一标识可为直接标识第一数据中各个数据项的绝对标识,也可为例如相对于输入数据的数据序列中首个数据项的偏移量这样的相对标识,或者其他相对标识等。
需要说明的是,在具体实施时,不仅限于通过第二管理器来监控算子状态,不进行限于通过第一管理器来确定第一数据,也不仅限于通过第一管理器来生成第一标识,也可通过其他系统模块来完成上述操作。此外,上述第一管理器及第二管理器可为程序模块,也可为电子设备。
s120,获取预先保存的所述流计算的日志文件,基于所述日志文件初始化所述第一算子的数据。
其中,在流计算正常执行过程中,每间隔特定时间间隔会保存日志文件。该日志文件可包括流计算中各个算子的计算函数、在保存该日志文件的第一时刻各个算子所包含的数据、与相邻算子的关联关系及其他数据。基于该日志文件能够将流计算中一个或多个算子恢复至第一时刻的状态。
在确定第一算子出现运行错误的情况下,可通过例如第一管理器从保存日志文件的文件系统中获取第一算子的日志文件,继而驱使例如第二管理器基于第一算子的日志文件初始化第一算子的数据。如运行第一算子的计算函数,配置第一时刻保存的第一算子所包含的相关数据等。当然,也可由例如第一管理器或其他设备来执行基于日志文件初始化第一算子的操作。
s130,构建所述第一算子与相邻上游算子,以及所述第一算子与相邻下游算子之间的数据连接。
在执行流计算时,算子需要从相邻上游算子获取输入数据,对输入数据进行计算,并向相邻下游算子输出数据。为使初始化完成的第一算子能够分别与相邻上游算子和相邻下游算子实现数据传输,在第一算子初始化完成的情况下,需要构建第一算子与相邻上游算子,以及第一算子与相邻下游算子的数据连接。在具体实施时,可基于第一算子的身份标识,以及相邻上游算子的身份标识和相邻下游算子的身份标识构建第一算子与相邻上游算子,以及第一算子与相邻下游算子的数据连接。
以图2所示的b1算子出现运行错误为例,在b1算子初始化完成后,可重新构建b1算子与相邻上游的a1算子之间的数据连接,并重新构建b1算子与相邻下游的c1算子,以及b1算子与相邻下游的e1算子之间的数据连接,如图2中b部分所示。
s140,向所述相邻上游算子发送所述第一标识,使所述相邻上游算子至少向所述第一算子重新发送所述第一数据,以使所述第一算子基于所述第一数据进行计算并更新数据。
在具体实施时,流计算的各个算子可存储保存日志文件之后的输出数据。相邻上游算子接收到例如第一管理器发送的第一标识,基于该第一标识从其存储的输出数据中确定第一数据,并至少向第一算子重新发送该第一数据,就能够使第一算子恢复至出现运行错误之前的状态。第一管理器驱使第一算子基于第一数据进行计算,更新自身数据,并向相邻下游算子发送第一数据的计算结果,不会向相邻下游算子输出重复的计算结果,也不会漏发计算结果,能够实现精确一次级别的数据一致性。
仍然以图2中b1算子出现运行错误为例,则第一标识能够标识输入数据{v,w,x,y}中的第一数据{x,y},相邻上游的a1算子接收到该第一标识后,可至少向b1算子重新发送第一数据{x,y},截止至此时,b1算子已经恢复到出现运行错误的第二时刻的状态,如图2中c部分所示。驱使b1算子至少对重新接收的第一数据{x,y}进行计算,并将第一数据的计算结果发送至相邻下游算子,以恢复第一算子的正常运行。只需基于日志文件重新初始化b1算子这一个算子即可,作为比较,如果重新初始化整个流计算需要重新初始化五个算子(a1、b1、c1、d1及e1),如果重新初始化出现运行错误的b1算子及其下游算子,则需要重新初始化四个算子(b1、c1、d1及e1),需要重新初始化的算子数量显著减少。
本申请实施例的基于流计算的数据处理方法,在第一算子出现运行错误时,通过确定第一算子的输入数据中未计算完成的第一数据,基于日志文件重新初始化第一算子,重构第一算子与相邻上游算子,以及第一算子与相邻下游算子的数据连接,驱使相邻上游算子至少向初始化完成的第一算子重新发送第一数据以恢复第一算子,能够精确的将第一算子恢复至出现运行错误之前的状态,仅需基于日志文件重新初始化出现运行错误的第一算子,无需重新初始化全部算子,也无需重新初始化第一算子及其下游算子,就能够实现精确一次级别的数据一致性,能够显著降低故障恢复延迟,提高系统稳定性,改善用户体验。
在一些实施例中,步骤s110,所述确定所述第一算子的输入数据中未计算完成的第一数据,生成用于标识所述第一数据的第一标识,可包括:
s111,确定所述第一算子的第一映射关系。
其中,所述第一映射关系包括所述第一算子分别与所述相邻上游算子和所述相邻下游算子的第一关联关系,和/或所述第一算子的输入数据和输出数据的第二关联关系。以图2中b1算子出现运行错误为例,则第一关联关系包括b1算子与相邻上游的a1算子,b1算子与相邻下游的c1算子,以及b1算子与相邻下游的e1算子的关联关系,第二关联关系可包括b1算子的输入数据{v,w}经b1算子计算后生成的输出数据{v1,w1}的关联关系。
在具体实施时,可基于逻辑执行图或物理执行图确定所述第一算子的第一映射关系。逻辑执行图和物理执行图可包含数据在算子之间的传输关系,以及数据在算子内部的变换关系。可由例如第一管理器基于逻辑执行图或物理执行图确定第一算子的第一映射关系。当然,不仅限于基于逻辑执行图或物理执行图来确定第一算子的第一映射关系,当其他信息中记录有表征第一映射关系的数据时,也可基于其他信息来确定该第一映射关系。
s112,确定所述第一算子在第一时段的输入数据和输出数据。
其中,所述第一时段至少包括保存日志文件的第一时刻至第一算子出现运行错误的第二时刻之间的时段。确定第一算子在第一时段的输入数据和输出数据,也即确定保存日志文件的第一时刻之后,截止至第一算子出现运行错误的第二时刻,第一算子接收的相邻上游算子发送的输入数据,以及第一算子向相邻下游算子发送的输出数据。以图2中b1算子出现运行错误为例,则{v,w,x,y}即为第一时段的输入数据,{v1,w1}即为第一时段的输出数据。
在具体实施时,步骤s112,所述确定所述第一算子在第一时段的输入数据和输出数据,可包括:
获取第二标识,其中,所述第二标识用于标识所述相邻上游算子在所述第一时段输出的第三数据;
基于所述第二标识确定所述第一算子在第一时段的输入数据;
获取第三标识,其中,所述第三标识用于标识所述相邻下游算子在所述第一时段输入的第四数据;
基于所述第三标识确定所述第一算子在第一时段的输出数据。
算子正常运行过程中,不仅存储保存日志文件之后的输出数据,还存储用于标识算子在保存日志文件之后的输出数据的第二标识,以及用于标识算子在保存日志文件之后的输入数据的第三标识。在实际应用时,可在算子内配置例如重放管理模块,通过该重放管理模块存储第一时刻之后的输出数据,以及第二标识和第三标识。
在此基础上,第一管理器可从相邻上游算子处获取第二标识,从相邻下游算子处获取第三标识,基于相邻上游算子在第一时段的输出数据,即可确定第一算子在第一时段的输入数据,基于相邻下游算子在第一时段的输入数据,即可确定第一算子在第一时段的输出数据。具体的,该第二标识和第三标识可为直接标识数据项的绝对标识,也可为以相对于特定标志位的偏移量的方式对数据项进行标识的相对标识。通过获取标识的方式来确定第一算子在第一时段的输入数据和输出数据,能够减少数据传输量和数据处理量,有益于简化操作。
s113,基于所述第一映射关系和所述第一算子在所述第一时段的输出数据,确定所述第一算子在所述第一时段的输入数据中未计算完成的所述第一数据,以及已计算完成的第二数据。
具体的,可基于第一算子与相邻下游算子的第一关联关系,第一算子的输入数据和输出数据的第二关联关系,第一算子在第一时段的输出数据,共同确定第一算子用于计算并生成该输出数据所依据的输入数据,也即第一算子在第一时段的输入数据中计算完成的第二数据,继而基于第一算子在第一时段的输入数据可确定第一算子在第一时段未计算完成的第一数据。例如,在确定b1算子与c1算子的关联关系,b1算子与e1算子的关联关系,输入数据{v,w}经b1算子计算后生成的输出数据{v1,w1}的关联关系,b1算子向c1算子输出v1数据,b1算子向e1算子输出的w1数据,即可确定b1算子计算完成的第二数据{v,w},继而可以确定第一时段的输入数据{v,w,x,y}中未计算完成的第一数据{x,y}。
s114,生成用于标识所述第一数据的所述第一标识,或生成通过标识所述第二数据以对所述第一数据进行标识的所述第一标识。
在确定第一数据的情况下,所生成的第一标识可用于标识第一数据,例如直接标识{x,y};该第一标识也可用于标识第二数据,以间接标识第一数据,例如通过标识{v,w}以间接标识{x,y}。
在第一算子出现运行错误,无响应、无法识别或者自身数据无法恢复的情况下,通过上述步骤,可基于相邻上游算子的输出数据、相邻下游算子的输入数据,以及第一算子的第一映射关系,就能够准确确定第一算子的输入数据中未计算完成的第一数据,生成能够标识第一数据第一标识,从而确保能够实现精确一次级别的一致性。
在一些实施例中,步骤s140,所述向所述相邻上游算子发送所述第一标识,使所述相邻上游算子至少向所述第一算子重新发送所述第一数据,以使所述第一算子基于所述第一数据进行计算并更新数据,包括:
s141,向所述相邻上游算子发送所述第一标识,使所述相邻上游算子基于所述第一标识对所述第三数据中包含的所述第一数据和/或所述第二数据进行标识。
可由例如第一管理器向相邻上游算子发送该第一标识,相邻上游算子获取到该第一标识,可基于该第一标识对第三数据中的第一数据进行标识,如对{x,y}进行标识;也可对第二数据进行标识,如对{v,w}进行标识,或者也可分别对第一数据和第二数据进行标识,也即对{x,y}和{v,w}分别进行标识。相邻上游算子可通过例如标识起始数据项和结束数据项的方式,对第一数据和/或第二数据进行标识。
s142,控制所述相邻上游算子向所述第一算子发送标识后的所述第三数据。也即,驱使相邻上游算子将标识后的第三数据全部重新发送给第一算子。
s143,控制所述第一算子对所述第二数据进行计算,禁止向所述相邻下游算子输出数据。
第二数据为第一算子在出现运行错误的第二时刻已经计算完成的数据,所以,第一算子对第二数据进行计算所生成的计算结果,不向相邻下游算子输出。如b1算子对{v,w}进行计算生成的计算结果{v1,w1},但不向c1算子和e1算子重新输出。这样,能够避免第一算子向相邻下游算子输出重复的数据。
s144,控制所述第一算子对所述第一数据进行计算,向所述相邻下游算子输出数据。
第一数据为第一算子在出现运行错误的第二时刻未计算完成的数据,所以,第一算子对第一数据进行计算所生成的计算结果尚未向相邻下游算子发送,控制第一算子对第一数据进行计算,向相邻下游算子输出数据能够避免漏发计算结果。如,b1算子对{x,y}进行计算所生成的计算结果{x1,y1}则需要向相邻下游算子输出,确保实现精确一次的数据一致性。
通过将相邻上游算子在保存日志文件之后输出的第三数据全部重新发送至第一算子进行重新计算,并分别控制不将第二数据的计算结果输出至相邻下游算子,且将第一数据的计算结果输出至相邻下游算子,既能够避免向相邻下游算子重复输出数据,确保精确一次级别的数据一致性,而且,在第一算子需要基于第二数据的计算结果对第一数据进行计算的情况下,通过重新计算第二数据能够确保第一数据的计算结果的准确性。
在一些实施例中,步骤s140,所述向所述相邻上游算子发送所述第一标识,使所述相邻上游算子至少向所述第一算子重新发送所述第一数据,以使所述第一算子基于所述第一数据进行计算并更新数据,包括:
s145,向所述相邻上游算子发送所述第一标识,使所述相邻上游算子基于所述第一标识从所述第三数据中提取所述第一数据;
s146,控制所述相邻上游算子向所述第一算子重新发送所述第一数据;
s147,控制所述第一算子对所述第一数据进行计算,并向所述相邻下游算子输出数据。
也即,相邻上游算子并不将保存日志文件之后输出的第三数据全部重新发送给第一算子,而是基于第一标识从第三数据中提取第一数据,仅将第一算子的输入数据中未计算完成的第一数据重新发送给第一算子,在第一算子对第一数据进行计算不需要依托第二数据的计算结果的情况下,初始化完成的第一算子仅需计算第一数据,并向相邻下游算子输出第一数据的计算结果,而不需要重新计算第二数据,能够进一步降低故障恢复延迟。
在一些实施例中,所述方法还包括:
响应于流计算中至少一个第一算子出现运行错误,切断所述第一算子与所述相邻上游算子的数据连接,以及所述第一算子与所述相邻下游算子的数据连接。
如此,能够避免相邻上游算子在非受控的情况下向初始化完成的第一算子输出数据,并避免因此导致的计算错误或数据不一致;也能够避免第一算子在非受控的情况下向相邻下游算子输出数据。
在一些实施例中,所述方法还包括:
响应于流计算中至少一个第一算子出现运行错误,清空所述相邻上游算子的数据发送队列和所述相邻下游算子的数据接收队列。
在具体实施时,可在算子中设置用于短暂缓存输出数据的数据发送队列,以及用于短暂缓存输入数据的数据接收队列。在第一算子出现运行错误时,通过清空相邻上游算子的数据发送队列,以及相邻下游算子的数据接收队列,能够避免相邻上游算子向第一算子重复输出缓存在数据发送队列中的数据,也能够避免相邻下游算子重复计算第二时刻已经缓存在数据接收队列中但尚未计算的数据。
在一些实施例中,所述方法还可包括:
响应于流计算中至少一个第一算子出现运行错误,将所述相邻上游算子和所述相邻下游算子从第一模式切换至第二模式;
响应于所述第一算子计算完成所述第一数据,将所述相邻上游算子、所述第一算子和所述相邻下游算子从所述第二模式切换至所述第一模式。
在具体实施时,可为算子配置第一模式和第二模式,第一模式即为正常模式,第二模式即为故障模式。
配合图3所示,以系统包括第一客户端、第一管理器和第二管理器为例,第一客户端作为系统接口,可用于与应用层进行交互,或者用于与用户所使用的第一电子设备进行交互,以获取任务信息。具体的,该任务信息可包括例如逻辑执行图等数据。第一客户端将逻辑执行图发送至第一管理器。第一管理器基于逻辑执行图生成物理执行图,将物理执行图发送至第二管理器。第二管理器基于物理执行图初始化算子,并将算子配置为在第一模式下进行数据计算。在第一模式下,算子接收相邻上游算子的输入数据,对输入数据进行计算,并将至少部分计算结果作为输出数据发送至相邻下游算子。流计算执行过程中,每间隔特定时间间隔保存日志文件。算子自身会存储保存日志文件之后的输出数据,还会存储用于标识保存日志文件之后的输出数据的第二标识,以及用于标识保存日志文件之后的输入数据的第三标识。
在流计算执行过程中,可通过第二管理器监控算子的运行状态,在至少一个第一算子出现运行错误的情况下,第二管理器向第一管理器发送第一信息,以通知第一管理器第一算子出现运行错误。该第一信息可包括用于标识第一算子身份的身份标识。第一管理器切断出现运行错误的第一算子与相邻上游算子的数据连接,以及第一算子与相邻下游算子的数据连接;向相邻上游算子发送第一通知,以驱使相邻上游算子从第一模式切换为第二模式,清空数据发送队列,并向所述第一管理器发送所述第二标识;向相邻下游算子发送第二通知,以驱使相邻下游算子也从第一模式切换为第二模式,清空数据接收队列,并向所述第一管理器发送所述第三标识。第一管理器基于所述第二标识和所述第三标识,确定所述第一算子在第一时段的输入数据和输出数据,继而确定所述第一算子的输入数据中未计算完成的第一数据,生成用于标识所述第一数据的第一标识。第一管理器为重新初始化第一算子申请系统资源,获取预先保存的第一算子的日志文件,向第二管理器发送该日志文件,以使第二管理器基于日志文件初始化第一算子的数据,并将初始化完成的第一算子配置为处于第二模式;构建第一算子与相邻上游算子,以及第一算子与相邻下游算子之间的数据连接;向相邻上游算子发送第一标识,驱使相邻上游算子基于该第一标识至少向第一算子重新发送第一数据,驱使第一算子基于获取的第一数据进行计算;至此出现运行错误的第一算子已恢复,将第一算子、相邻上游算子及相邻下游算子从第二模式切换至第一模式,结束故障恢复。
需要说明的是,第一管理器可在生成该第一标识后立即向相邻上游算子发送该第一标识,相邻上游算子可响应于其与第一算子之间数据连接重新构建,而向第一算子至少重新发送第一数据;第一管理器也可在构建完成第一算子与相邻上游算子,以及第一算子与相邻下游算子之间的数据连接,才向相邻上游算子发送该第一标识,以驱使相邻上游算子至少向第一算子重新发送该第一数据。
参见图4所示,本申请实施例还提供了一种基于流计算的数据处理方法,具体包括如下步骤:
s210,接收第一管理器发送的第一通知,其中,所述第一通知用于通知相邻下游的第一算子出现运行错误。
流计算中的算子运行错误时,通常会出现算子无响应、无法识别或生成错误代码等情况。以通过第一管理器监控算子的状态,或者第一管理器通过第二管理器来监控算子的状态为例。在第二管理器确定流计算中的第一算子出现无响应、无法识别或生成错误代码等情况时,确定该第一算子出现运行错误,向第一管理器发送第一信息,以通知第一管理器第一算子运行错误,该第一信息可包括例如用于标识该第一算子身份的身份标识。第一管理器基于该第一信息确定第一算子的相邻上游算子和相邻下游算子,向第一算子的相邻上游算子发送第一通知,第一算子的相邻上游算子接收到该第一通知,即可确定第一算子出现运行错误,并向第一算子的相邻下游算子发送第二通知,以通知第一算子的相邻下游算子第一算子出现运行错误。
s220,向所述第一管理器反馈第二标识,以使所述第一管理器基于所述第二标识确定用于标识第一数据的第一标识;其中,所述第二标识用于标识第一时段向所述第一算子发送的第三数据;所述第一时段包括保存日志文件至所述第一算子出现运行错误之间的时段;所述第一数据包括所述第三数据中未被所述第一算子计算完成的数据。
在流计算正常执行过程中,每间隔特定时间间隔会保存日志文件。该日志文件可包括流计算中各个算子的计算函数、在保存该日志文件的第一时刻各个算子所包含的数据、与相邻算子的关联关系及其他数据。所述第一时段包括保存日志文件的第一时刻至第一算子出现运行错误的第二时刻之间的时段。
算子正常运行过程中,会存储保存日志文件之后的输出数据,还会存储用于标识算子在保存日志文件之后的输出数据的第二标识,以及用于标识算子在保存日志文件之后的输入数据的第三标识。在实际应用时,可在算子内配置例如重放管理模块,通过该重放管理模块存储第一时刻之后的输出数据,以及第二标识和第三标识。
第一算子的相邻上游算子响应于接收第一通知,获取用于标识第一时段向第一算子发送的第三数据的第二标识,向第一管理器反馈该第二标识。相应的,第一算子的相邻下游算子会响应于接收第二通知,获取用于标识第一时段从第一算子接收的第四数据的第三标识,向第一管理器反馈第三标识。第一管理器可基于该第二标识确定第一算子在第一时段的输入数据,基于第三标识确定第一算子在第一时段的输出数据。继而,第一管理器基于第一算子在第一时段的输入数据和输出数据确定第一算子在第一时段的输入数据中未计算完成的第一数据,以及第一算子在第一时段的输入数据中计算完成的第二数据。
如图2中a部分所示为流计算出现运行错误时的状态示意图,以b1算子出现运行错误为例,b1算子在第一时段从其相邻上游的a1算子接收的输入数据可包括{v,w,x,y},在b1算子出现运行错误之前已经计算完成数据v和w,向相邻下游的c1算子发送了数据v1,向相邻下游的e1算子发送了数据w1,数据x和y即为出现运行错误的b1算子未计算完成的数据,也即第一数据包括{x,y},第二数据包括{v,w}。
第一管理器在确定第一数据的情况下,可基于确定的第一数据生成用于标识该第一数据的第一标识。在具体实施时,第一标识可通过多种方式来标识该第一数据,如该第一标识可通过标识数据队列中起始数据项和结束数据项的方式对对已数据进行标识,该第一标识可为直接标识第一数据中各个数据项的绝对标识,也可为例如相对于输入数据的数据序列中首个数据项的偏移量这样的相对标识,或者其他相对标识等。类似的,第二标识和第三标识也可为绝对标识或相对标识。
s230,响应于所述第一管理器基于所述流计算的日志文件初始化所述第一算子的数据,与初始化完成的所述第一算子建立数据连接。
基于该日志文件能够将流计算中一个或多个算子恢复至第一时刻的状态。在确定第一算子出现运行错误的情况下,第一管理器从保存日志文件的文件系统中获取第一算子的日志文件,继而驱使例如第二管理器基于第一算子的日志文件初始化第一算子的数据。如运行第一算子的计算函数,配置第一时刻保存的第一算子所包含的相关数据等。
在执行流计算时,上游算子需要向下游算子输出数据。为使第一算子的相邻上游算子能够向第一算子输出数据,在第一算子初始化完成的情况下,需要构建第一算子的相邻上游算子与第一算子之间的数据连接。在具体实施时,可基于例如第一算子的相邻上游算子的身份标识,以及第一算子的身份标识构建第一算子的相邻上游算子与第一算子之间的数据连接。
以图2所示的b1算子出现运行错误为例,在b1算子初始化完成后,可重新构建b1算子与相邻上游的a1算子之间的数据连接,并重新构建b1算子与相邻下游的c1算子,以及b1算子与相邻下游的e1算子之间的数据连接,如图2中b部分所示。
s240,接收所述第一管理器发送的所述第一标识,基于所述第一标识至少向所述第一算子重新发送所述第一数据,以使所述第一算子基于所述第一数据进行计算并更新数据。
在具体实施时,流计算的各个算子可存储保存日志文件之后的输出数据。第一算子的相邻上游算子接收到第一管理器发送的第一标识,基于该第一标识从其存储的输出数据(也即第三数据)中确定第一数据,并至少向第一算子重新发送该第一数据,就能够使第一算子恢复至出现运行错误之前的状态。第一管理器驱使第一算子基于第一数据进行计算,更新自身数据,并向第一算子的相邻下游算子发送第一数据的计算结果,不会向相邻下游算子输出重复的计算结果,也不会漏发计算结果,能够实现精确一次级别的数据一致性。
仍然以图2中b1算子出现运行错误为例,则第一标识能够标识输入数据{v,w,x,y}中的第一数据{x,y},相邻上游的a1算子接收到该第一标识后,可至少向b1算子重新发送第一数据{x,y},截止至此时,b1算子已经恢复到出现运行错误的第二时刻的状态,如图2中c部分所示。驱使b1算子至少对重新接收的第一数据{x,y}进行计算,并将第一数据的计算结果发送至相邻下游算子,以恢复第一算子的正常运行。只需基于日志文件重新初始化b1算子这一个算子即可,作为比较,如果重新初始化整个流计算需要重新初始化五个算子(a1、b1、c1、d1及e1),如果重新初始化出现运行错误的b1算子及其下游算子,则需要重新初始化四个算子(b1、c1、d1及e1),需要重新初始化的算子数量显著减少。
本申请实施例的基于流计算的数据处理方法,能够精确的将第一算子恢复至出现运行错误之前的状态,仅需基于日志文件重新初始化出现运行错误的第一算子,无需重新初始化全部算子,也无需重新初始化第一算子及其下游算子,就能够实现精确一次级别的数据一致性,能够显著降低故障恢复延迟,提高系统稳定性,改善用户体验。
在一些实施例中,步骤s240,所述接收所述第一管理器发送的所述第一标识,基于所述第一标识至少向所述第一算子重新发送所述第一数据,以使所述第一算子基于所述第一数据进行计算并更新数据,包括:
s241,接收所述第一管理器发送的所述第一标识,基于所述第一标识对所述第三数据中包含的第一数据和/或第二数据进行标识。
第一算子的相邻上游算子获取到该第一标识,可基于该第一标识对第三数据中的第一数据进行标识,如对{x,y}进行标识;也可对第二数据进行标识,如对{v,w}进行标识,或者也可分别对第一数据和第二数据进行标识,也即对{x,y}和{v,w}分别进行标识。第一算子的相邻上游算子可通过例如标识起始数据项和结束数据项的方式,对第一数据和/或第二数据进行标识。
s242,向所述第一算子发送标识后的所述第三数据,以使所述第一算子对所述第二数据进行计算,禁止向所述第一算子的相邻下游算子发送计算结果,并使所述第一算子对所述第一数据进行计算,向所述第一算子的相邻下游算子发送计算结果。
第二数据为第一算子在出现运行错误的第二时刻已经计算完成的数据,所以,第一算子对第二数据进行计算所生成的计算结果,不向相邻下游算子输出。如b1算子对{v,w}进行计算生成的计算结果{v1,w1},但不向c1算子和e1算子重新输出。这样,能够避免第一算子向相邻下游算子输出重复的数据。
第一数据为第一算子在出现运行错误的第二时刻未计算完成的数据,所以,第一算子对第一数据进行计算所生成的计算结果尚未向相邻下游算子发送,控制第一算子对第一数据进行计算,向相邻下游算子输出数据能够避免漏发计算结果。如,b1算子对{x,y}进行计算所生成的计算结果{x1,y1}则需要向相邻下游算子输出,确保实现精确一次的数据一致性。
通过第一算子的相邻上游算子将保存日志文件之后输出的第三数据全部重新发送至第一算子进行重新计算,并第一算子控制不将第二数据的计算结果输出至相邻下游算子,且将第一数据的计算结果输出至相邻下游算子,既能够避免向相邻下游算子重复输出数据,确保精确一次级别的数据一致性,而且,在第一算子需要基于第二数据的计算结果对第一数据进行计算的情况下,通过重新计算第二数据能够确保第一数据的计算结果的准确性。
在一些实施例中,步骤s240,所述接收所述第一管理器发送的所述第一标识,基于所述第一标识至少向所述第一算子重新发送所述第一数据,以使所述第一算子基于所述第一数据进行计算并更新数据,包括:
s243,接收所述第一管理器发送的所述第一标识,基于所述第一标识从所述第三数据中提取所述第一数据;
s244,向所述第一算子重新发送所述第一数据,以使所述第一算子对所述第一数据进行计算,并向所述第一算子的相邻下游算子发送计算结果。
也即,第一算子的相邻上游算子并不将第三数据全部重新发送给第一算子,而是基于第一标识从第三数据中提取第一数据,仅将第一算子的输入数据中未计算完成的第一数据重新发送给第一算子,在第一算子对第一数据进行计算不需要依托第二数据的计算结果的情况下,初始化完成的第一算子仅需计算第一数据,并向相邻下游算子输出第一数据的计算结果,而不需要重新计算第二数据,能够进一步降低故障恢复延迟。
在一些实施例中,所述方法还包括:
响应于接收所述第一管理器发送的所述第一通知,切断与相邻下游的所述第一算子之间的数据连接。
如此,能够避免第一算子的相邻上游算子在非受控的情况下向初始化完成的第一算子输出数据,并避免因此导致的计算错误或数据不一致。
在一些实施例中,所述方法还包括:
响应于接收所述第一管理器发送的所述第一通知,清空数据发送队列。
在具体实施时,可在算子中设置用于短暂缓存输出数据的数据发送队列,以及用于短暂缓存输入数据的数据接收队列。在接收到第一通知,确定相邻下游的第一算子出现运行错误时,通过清空第一算子的相邻上游算子的数据发送队列,能够避免向第一算子重复输出缓存在数据发送队列中的数据。
在一些实施例中,所述方法还可包括:
响应于接收所述第一管理器发送的第一通知,从第一模式切换至第二模式;
响应于接收用于告知所述第一算子计算完成所述第一数据的第三通知,从所述第二模式切换至所述第一模式。
在具体实施时,可为算子配置第一模式和第二模式,第一模式即为正常模式,第二模式即为故障模式。
配合图2所示,以系统包括第一客户端、第一管理器和第二管理器为例,第一客户端作为系统接口,可用于与应用层进行交互,或者用于与用户所使用的第一电子设备进行交互,以获取任务信息。具体的,该任务信息可包括例如逻辑执行图等数据。第一客户端将逻辑执行图发送至第一管理器。第一管理器基于逻辑执行图生成物理执行图,将物理执行图发送至第二管理器。第二管理器基于物理执行图初始化算子,并将算子配置为在第一模式下进行数据计算。在第一模式下,算子接收相邻上游算子的输入数据,对输入数据进行计算,并将至少部分计算结果作为输出数据发送至相邻下游算子。流计算执行过程中,每间隔特定时间间隔保存日志文件。算子自身会存储保存日志文件之后的输出数据,还会存储用于标识保存日志文件之后的输出数据的第二标识,以及用于标识保存日志文件之后的输入数据的第三标识。
在流计算执行过程中,可通过第二管理器监控算子的运行状态,在至少一个第一算子出现运行错误的情况下,第二管理器向第一管理器发送第一信息,以通知第一管理器第一算子出现运行错误。该第一信息可包括用于标识第一算子身份的身份标识。第一管理器切断出现运行错误的第一算子与相邻上游算子的数据连接,以及第一算子与相邻下游算子的数据连接;向相邻上游算子发送第一通知,以驱使相邻上游算子从第一模式切换为第二模式,清空数据发送队列,并向所述第一管理器发送所述第二标识;向相邻下游算子发送第二通知,以驱使相邻下游算子也从第一模式切换为第二模式,清空数据接收队列,并向所述第一管理器发送所述第三标识。第一管理器基于所述第二标识和所述第三标识,确定所述第一算子在第一时段的输入数据和输出数据,继而确定所述第一算子的输入数据中未计算完成的第一数据,生成用于标识所述第一数据的第一标识。第一管理器为重新初始化第一算子申请系统资源,获取预先保存的第一算子的日志文件,向第二管理器发送该日志文件,以使第二管理器基于日志文件初始化第一算子的数据,并将初始化完成的第一算子配置为处于第二模式;构建第一算子与相邻上游算子,以及第一算子与相邻下游算子之间的数据连接;向相邻上游算子发送第一标识,驱使相邻上游算子基于该第一标识至少向第一算子重新发送第一数据,驱使第一算子基于获取的第一数据进行计算;至此出现运行错误的第一算子已恢复,将第一算子、相邻上游算子及相邻下游算子从第二模式切换至第一模式,结束故障恢复。
需要说明的是,第一管理器可在生成该第一标识后立即向相邻上游算子发送该第一标识,相邻上游算子可响应于其与第一算子之间数据连接重新构建,而向第一算子至少重新发送第一数据;第一管理器也可在构建完成第一算子与相邻上游算子,以及第一算子与相邻下游算子之间的数据连接,才向相邻上游算子发送该第一标识,以驱使相邻上游算子至少向第一算子重新发送该第一数据。
参见图5所示,本申请实施例还提供了一种基于流计算的数据处理装置,该数据处理装置用于实现如上任一实施例所述的基于流计算的数据处理方法,该数据处理装置包括:
确定模块11,用于响应于流计算中至少一个第一算子出现运行错误,确定所述第一算子的输入数据中未计算完成的第一数据,生成能够标识所述第一数据的第一标识;
初始化模块12,用于获取预先保存的所述流计算的日志文件,基于所述日志文件初始化所述第一算子的数据;
第一构建模块13,用于构建所述第一算子与相邻上游算子,以及所述第一算子与相邻下游算子之间的数据连接;
第一发送模块14,用于向所述相邻上游算子发送所述第一标识,使所述相邻上游算子至少向所述第一算子重新发送所述第一数据,以使所述第一算子基于所述第一数据进行计算并更新数据。
在一些实施例中,所述确定模块11具体用于:
确定所述第一算子的第一映射关系,其中,所述第一映射关系包括所述第一算子分别与所述相邻上游算子和所述相邻下游算子的第一关联关系,和/或所述第一算子的输入数据和输出数据的第二关联关系;
确定所述第一算子在第一时段的输入数据和输出数据;其中,所述第一时段包括保存所述日志文件至所述第一算子出现运行错误之间的时段;
基于所述第一映射关系和所述第一算子在所述第一时段的输出数据,确定所述第一算子在所述第一时段的输入数据中未计算完成的所述第一数据,以及已计算完成的第二数据;
生成用于标识所述第一数据的所述第一标识,或生成通过标识所述第二数据以对所述第一数据进行标识的所述第一标识。
在一些实施例中,所述确定模块11进一步用于:
获取第二标识,其中,所述第二标识用于标识所述相邻上游算子在所述第一时段输出的第三数据;
基于所述第二标识确定所述第一算子在第一时段的输入数据;
获取第三标识,其中,所述第三标识用于标识所述相邻下游算子在所述第一时段输入的第四数据;
基于所述第三标识确定所述第一算子在第一时段的输出数据。
在一些实施例中,所述第一发送模块14具体用于:
向所述相邻上游算子发送所述第一标识,使所述相邻上游算子基于所述第一标识对所述第三数据中包含的所述第一数据和/或所述第二数据进行标识;
控制所述相邻上游算子向所述第一算子发送标识后的所述第三数据;
控制所述第一算子对所述第二数据进行计算,禁止向所述相邻下游算子输出数据;
控制所述第一算子对所述第一数据进行计算,向所述相邻下游算子输出数据。
在一些实施例中,所述第一发送模块14具体用于:
向所述相邻上游算子发送所述第一标识,使所述相邻上游算子基于所述第一标识从所述第三数据中提取所述第一数据;
控制所述相邻上游算子向所述第一算子重新发送所述第一数据;
控制所述第一算子对所述第一数据进行计算,并向所述相邻下游算子输出数据。
在一些实施例中,所述确定模块11进一步用于:
基于所述流计算的逻辑执行图和/或物理执行图确定所述第一算子的第一映射关系。
在一些实施例中,所述确定模块11还用于:
响应于流计算中至少一个第一算子出现运行错误;
切断所述第一算子与所述相邻上游算子的数据连接,以及所述第一算子与所述相邻下游算子的数据连接;和/或
清空所述相邻上游算子的数据发送队列和所述相邻下游算子的数据接收队列;和/或
将所述相邻上游算子和所述相邻下游算子从第一模式切换至第二模式;响应于所述第一算子计算完成所述第一数据,将所述相邻上游算子、所述第一算子和所述相邻下游算子从所述第二模式切换至所述第一模式。
参见图6所示,本申请实施例还提供了一种基于流计算的数据处理装置,该数据处理装置用于实现如上任一实施例所述的基于流计算的数据处理方法,包括:
接收模块21,用于接收第一管理器发送的第一通知,其中,所述第一通知用于通知相邻下游的第一算子出现运行错误;
反馈模块22,用于向所述第一管理器反馈用于标识第一时段向所述第一算子发送的第三数据的第二标识,以使所述第一管理器基于所述第二标识确定用于标识第一数据的第一标识;其中,所述第一时段包括保存日志文件至所述第一算子出现运行错误之间的时段;所述第一数据包括所述第三数据中未被所述第一算子计算完成的数据;
第二构建模块23,用于响应于所述第一管理器基于流计算的日志文件初始化所述第一算子的数据,与初始化完成的所述第一算子建立数据连接;
第二发送模块24,用于接收所述第一管理器发送的所述第一标识,基于所述第一标识至少向所述第一算子重新发送所述第一数据,以使所述第一算子基于所述第一数据进行计算并更新数据。
在一些实施例中,所述第二发送模块24具体用于:
接收所述第一管理器发送的所述第一标识,基于所述第一标识对所述第三数据中包含的第一数据和/或第二数据进行标识;
向所述第一算子发送标识后的所述第三数据,以使所述第一算子对所述第二数据进行计算,禁止向所述第一算子的相邻下游算子发送计算结果,并使所述第一算子对所述第一数据进行计算,向所述第一算子的相邻下游算子发送计算结果。
在一些实施例中,所述第二发送模块24具体用于:
接收所述第一管理器发送的所述第一标识,基于所述第一标识从所述第三数据中提取所述第一数据;
向所述第一算子重新发送所述第一数据,以使所述第一算子对所述第一数据进行计算,并向所述第一算子的相邻下游算子发送计算结果。
在一些实施例中,所述接收模块21还用于:
响应于接收所述第一管理器发送的所述第一通知;
切断与相邻下游的所述第一算子之间的数据连接;和/或
清空数据发送队列;和/或
从第一模式切换至第二模式;响应于接收用于告知所述第一算子计算完成所述第一数据的第三通知,从所述第二模式切换至所述第一模式。
本申请实施例还提供了一种电子设备,包括如任一实施例所述的基于流计算的数据处理装置,该电子设备还包括:
相邻上游算子,用于接收所述第一标识,至少基于所述第一标识向所述第一算子重新发送所述第一数据;
第一算子,用于基于所述第一数据进行计算并更新数据。
在一些实施例中,所述电子设备还包括:
相邻下游算子,用于向所述基于流计算的数据处理装置发送第三标识,其中,所述第三标识用于标识所述相邻下游算子在所述第一时段输入的第四数据。
以上实施例仅为本申请的示例性实施例,不用于限制本申请,本申请的保护范围由权利要求书限定。本领域技术人员可以在本申请的实质和保护范围内,对本申请做出各种修改或等同替换,这种修改或等同替换也应视为落在本申请的保护范围内。