本发明属于互联网技术领域,具体地说,涉及一种分布式流计算系统、方法和装置。
背景技术:
流计算是目前数据处理领域里的一个重要组成部分。相对于传统的数据处理系统会把数据存储在硬盘或其他存储服务后再进行计算处理,流计算处理实时传入的数据并且实时的体现出数据的价值,普遍认为数据流的价值随时间的流逝而减低。
目前比较成熟的流处理系统包括Yahoo的S4(开源)、Twitter的Storm(开源)、Google的MillWheel、Amazon的Kinesis等,其用户的流计算需求需要依赖用户自己准备的数据处理逻辑代码实现。
以Storm为例,它在完成流处理需求时主要体现在两种节点上,Spout(喷口,可以理解为消息源)节点向下一级Bolts(螺栓)节点发送消息流(Stream),由下一级螺栓节点实现消息的处理逻辑,比如执行过滤、聚合计算等。而螺栓节点的计算逻辑(以及喷口节点的数据产生逻辑)是由用户通过实现storm提供的接口来完成的。Storm的拓扑(Topology)原理如图1所示。与storm类似,Kinesis等流处理体系同样是由用户实现计算逻辑。
在这种流计算系统中,如Storm、Kinesis等都需要用户自己实现流处理的逻辑。用户需要保证实现的逻辑无误,尤其是在各种偶发的边界条件上,否则,难以完成一个长时间稳定运行的流计算业务,更进一步地,在用户对系统框架理解不足,或者考虑不全的情况下,用户难以保证自己实现的逻辑能在系统发生故障时,正确处理各种异常,维持正确 的逻辑。以上对用户来说是极高的要求,很难让用户快速正确的使用分流处理系统。在使用上述系统时,用户通常需要身兼运维、测试、开发等更多角色的工作,而传统的数据处理(如sql查询)用户只需要想清自己的逻辑,完成sql(结构化查询语言,Structured Query Language)查询的编写即可,无需考虑sql查询的实现方法以及查询的正确性问题。
技术实现要素:
有鉴于此,本申请提供了一种分布式流计算系统、方法和装置,解决了现有技术中用户在使用流计算系统时需要自己实现流计算的处理逻辑的技术问题。
为了解决上述技术问题,本申请公开了一种分布式流计算系统,包括:第一节点和第二节点;所述第一节点将输入的离线sql运算逻辑转换为DAG(有向无环图,Directed Acyclic Graph),所述DAG表示所述离线sql运算逻辑中各个算子之间的逻辑关系;所述第一节点根据所述各个算子之间的逻辑关系将所述DAG划分为多个部分并分配到对应的多个第二节点,所述多个第二节点根据分配到的部分DAG而形成多个级别;所述多个第二节点接收实时数据流并根据所述DAG逐级完成流计算处理。
所述第一节点根据所述各个算子之间的逻辑关系将所述DAG划分为多个部分并分配到对应的多个第二节点,所述多个第二节点根据分配到的部分DAG而形成多个级别包括:在所述各个算子之间的逻辑关系中确定已完成对数据进行洗牌(shuffle)处理的位置,根据所述位置将所述DAG划分成相应的多个部分并分配到多个第二节点,所述多个第二节点根据分配到的部分DAG而形成多个级别。
所述DAG包括无逻辑状态的第一类算子和有逻辑状态的第二类算子;在所述流计算处理中,所述第二类算子为处理结果添加逻辑状态标识。
所述第二节点包括数据驱动模块、流计算模块和输出模块;其中,所述数据驱动模块接收实时数据流并发送至流计算模块,所述流计算模块根据分配到的部分DAG中各个算子之间的逻辑关系完成所述流计算处理,将处理 结果发送至输出模块;所述输出模块将所述处理结果发送至下一级第二节点或者外部的存储装置。
所述输出模块包括调度子模块和写入子模块;所述输出模块通过所述调度子模块将所述处理结果发送至下一级第二节点,或者所述输出模块通过所述写入子模块将所述处理结果发送至外部的存储装置。
为了解决上述技术问题,本申请还公开了一种分布式流计算方法,所述方法包括:根据从第一节点分配到的部分DAG,从客户端或上一级第二节点接收到实时数据流;根据所述部分DAG中各个算子之间的逻辑关系,对所述实时数据流进行流计算处理,得到处理结果;将所述处理结果发送至下一级第二节点或外部的存储装置。
所述根据所述部分DAG中各个算子之间的逻辑关系,对所述实时数据流进行计算处理,得到处理结果包括:判断当前算子是否属于第二类算子,当所述当前算子属于第二类算子时,为所述处理结果添加逻辑状态标识。
所述为所述处理结果添加逻辑状态标识包括:为所述处理结果添加更新(update)标识并发送至下一级第二节点;或者,为所述处理结果添加附加/删除(append/delete)标识并发送至下一级第二节点。
所述为所述处理结果添加附加/删除标识并发送至下一级第二节点包括:当根据所述处理结果生成第一数据时,发送带有附加标识的第一数据至下一级第二节点,使所述下一级第二节点添加所述第一数据;当根据所述处理结果所述第一数据变为第二数据时,发送带有删除标识的所述第一数据至所述下一级第二节点,使所述下一级第二节点删除所述第一数据;再发送带有附加标识的所述第二数据至所述下一级第二节点,使所述下一级第二节点添加所述第二数据。
所述根据所述部分DAG中各个算子之间的逻辑关系,对所述实时数据流进行流计算处理,得到处理结果还包括:每隔预设时长停止处理接收到的数据,将正在处理的数据处理完成后,对所述部分DAG中有逻辑状态的第二类算子生成快照;将所述快照的内存镜像文件记录为一个检查点。
所述根据第一节点分配到的部分DAG,从客户端或上一级第二节点接收到 实时数据流之后,所述方法还包括:将所述接收到的实时数据流写入到重做日志;当发生故障时,读取距离当前时间最近的检查点;根据所述检查点的内存镜像文件恢复所述第二类算子的逻辑状态;从所述重做日志中读取所述检查点后接收到的数据并进行处理;当所述重做日志中的数据处理完成时,继续对接收到的实时数据流进行流计算处理。
为了解决上述技术问题,本申请还公开了一种分布式流计算装置,包括:接收模块,用于根据从第一节点分配到的部分DAG,从客户端或上一级第二节点接收到实时数据流;第一处理模块,用于根据所述部分DAG中各个算子之间的逻辑关系,对所述实时数据流进行流计算处理,得到处理结果;发送模块,用于将所述处理结果发送至下一级第二节点或外部的存储装置。
所述第一处理模块包括:判断子模块,用于判断当前算子是否属于第二类算子,处理子模块,用于当所述当前算子属于第二类算子时,为所述处理结果添加逻辑状态标识。
所述处理子模块包括:第一发送单元,用于为所述处理结果添加更新标识并发送至下一级第二节点;或者,第二发送单元,用于为所述处理结果添加附加/删除标识并发送至下一级第二节点。
所述第二发送单元包括:第一发送子单元,用于当根据所述处理结果生成第一数据时,发送带有附加标识的第一数据至下一级第二节点,使所述下一级第二节点添加所述第一数据;第二发送子单元,用于当根据所述处理结果所述第一数据变为第二数据时,发送带有删除标识的所述第一数据至所述下一级第二节点,使所述下一级第二节点删除所述第一数据;再发送带有附加标识的所述第二数据至所述下一级第二节点,使所述下一级第二节点添加所述第二数据。
所述第一处理模块还包括:生成子模块,用于每隔预设时长停止处理接收到的数据,将正在处理的数据处理完成后,对所述部分DAG中有逻辑状态的第二类算子生成快照;镜像子模块,用于将所述快照的内存镜像文件记录为一个检查点。
所述装置还包括:日志模块,用于将所述接收到的实时数据流写入到重做日志;读取模块,用于当发生故障时,读取距离当前时间最近的检查点; 恢复模块,用于根据所述检查点的内存镜像文件恢复所述第二类算子的逻辑状态;第二处理模块,用于从所述重做日志中读取所述检查点后接收到的数据并进行处理;第三处理模块,用于当所述重做日志中的数据处理完成时,继续对接收到的实时数据流进行流计算处理。
与现有技术相比,本申请可以获得包括以下技术效果:将用户熟悉的离线sql运算的算子在流计算系统中实现,用户可以快速将离线sql转换为系统可以支持的流计算处理逻辑,并且系统包含了对于出现故障时的处理逻辑,可以通过检查点和重做日志恢复各个算子的逻辑状态。
当然,实施本申请的任一产品必不一定需要同时达到以上所述的所有技术效果。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1是现有技术中Storm流处理系统的拓扑结构示意图;
图2是本申请实施例提供的一种分布式流计算系统的拓扑结构示意图;
图3是本申请实施例第二节点的内部拓扑结构示意图;
图4是本申请实施例提供的一种分布式流计算方法的流程示意图;
图5是本申请实施例第二类算子添加更新标识时的处理过程示意图;
图6是本申请实施例第二类算子添加附加/删除标识时的处理过程示意图;
图7是本申请实施例提供的一种分布式流计算方法的流程示意图;
图8是本申请实施例提供的一种分布式流计算装置的结构示意图。
具体实施方式
以下将配合附图及实施例来详细说明本发明的实施方式,藉此对本发明 如何应用技术手段来解决技术问题并达成技术功效的实现过程能充分理解并据以实施。
图2是本申请实施例提供的一种分布式流计算系统的拓扑结构示意图,包括第一节点10和第二节点11。其中,第一节点10将由用户输入的离线sql(结构化查询语言,Structured Query Language)运算逻辑转换为DAG(有向无环图,Directed Acyclic Graph)。该DAG包括输入的离线sql运算逻辑中的各个算子,用于表示输入的离线sql运算逻辑中各个算子之间的逻辑关系。
第一节点10根据各个算子之间的逻辑关系将DAG划分成多个部分并分配到对应的多个第二节点11,该多个第二节点11根据分配到的部分DAG被划分为多个级别,从而形成上级节点和下级节点的关系。如果将每个第二节点11分配到的部分DAG按照各个第二节点11的级别关系拼接在一起,即可得到第一节点10转换出的完整DAG。
在用户输入的离线sql运算逻辑中,部分运算需要按照特定的列进行哈希,在哈希方式发生变化时,需要切分节点使用不同的哈希来对数据进行洗牌(shuffle)处理。第一节点10在将转换出的DAG划分成多个部分时,在各个算子之间的逻辑关系中确定已完成对数据进行洗牌处理的位置,根据该已完成洗牌处理的位置将所述DAG划分成相应的多个部分,并分配到多个第二节点11,该多个第二节点11根据分配到的部分DAG形成不同级别。
根据该多个第二节点11形成的不同级别,由最高级别的第二节点11接收来自客户端的实时数据流,并根据DAG逐级完成流计算处理。其中每个第二节点11的内部拓扑结构如图3所示,包括数据驱动模块110、流计算模块111和输出模块112。其中数据驱动模块11接收实时数据流并发送至流计算模块111,最高级别的第二节点11的数据驱动模块110接收来自客户端的实时数据流,而其他级别的第二节点11的数据驱动模块111接收来自上一级第二节点11的实时数据流。数据驱动模块110将接收到实时数据流发送至流计算模块111,流计算模块111保存有分配到的部分DAG,由流计算模块111根据分配到的部分DAG中各个算子之间的逻辑关系完成流计算处理,并将处理结果发送至输出模块112,由输出模块112将处理结果发 送至下一级第二节点11或者外部的存储装置,最低级别的第二节点11的输出模块112将处理结果发送至外部的存储装置,而其他级别的第二节点11的输出模块112将处理结果发送至其下一级第二节点11。如图3所示,输出模块112进一步包括调度子模块1121和写入子模块1122;输出模块112通过调度子模块1121将流计算的处理结果发送至下一级第二节点,或者通过写入子模块1122将流计算的处理结果发送至外部的存储装置。
该DAG包括两类算子,无逻辑状态的第一类算子和有逻辑状态的第二类算子。其中第一类算子不会为数据添加逻辑状态,对实时数据流进行计算处理时不会依赖该数据的逻辑状态,也不会影响其他算子的数据的逻辑状态。例如,filter(过滤器)算子,用于完成sql中的where/having子句实现的功能;transform(转换器)算子,用于提供类似于离线sql中select语句的各种转化函数的处理效果;window(时间窗)算子,用于实现以时间为依据将数据切分的功能,如按天统计网站访问量,在每日0:00结果会被归零,开始下一天的统计;以及各种最终输出的算子,如将数据写入云服务端OTS(Open Table Service,开放结构化数据服务)等。第二类算子对实时数据流的处理过程会依赖逻辑状态,根据不同的逻辑状态分情况进行处理,同时该处理可能会引起数据的逻辑状态的变化,从而影响到其他第二类算子对数据的处理方式。例如,Groupby(分组)算子,用于将一个数据集分为若干小区域分别进行处理,类似于离线sql中的分组,在本系统中,该算子也包括具体使用的聚合,如可返回表中唯一不同值的count(统计)/sum(总计)/average(平均)等函数;top(限定返回数)算子,用于限定返回记录的数目,即在有限集合上依据某种规则取得其中的部分结果;join(连接)算子,在有限集合的多个表之间建立联系以查询数据;以及其他可能由于一条数据输入导致多条数据产生实时变化的其他算子。对于该第二类算子在实时数据流的计算处理中的应用将在后续实施例中进行说明。
本申请实施例提供的分布式流计算系统,将用户熟悉的离线sql运算的算子在流计算系统中实现,用户可以快速将离线sql转换为系统可以支持的流计算处理逻辑,降低了用户的工作量和工作难度,提高了流计算处理的工作效率。
图4是本申请实施例提供的一种分布式流计算方法,适用于第二节点,该方法包括以下步骤。
在步骤S20中,根据从第一节点分配到的部分DAG,从客户端或上一级第二节点接收到实时数据流。
第二节点根据从第一节点分配到的部分DAG而划分为多个级别。最高级别的第二节点从客户端接收实时数据流进行处理,而其他较低级别的第二节点从上一级第二节点接收实时数据流进行处理。
在步骤S21中,根据部分DAG中各个算子之间的逻辑关系,对实时数据流进行流计算处理,得到处理结果。
第二节点分配到的部分DAG中包括各种算子,根据各个算子之间的逻辑关系对接收到的实时数据流进行流计算处理。分配到的部分DAG中包括无逻辑状态的第一类算子和有逻辑状态的第二类算子。在流计算处理的过程中,无逻辑状态的第一类算子对实时数据流的处理相对直接,或修改一条数据上的部分内容(如时间窗算子、转换器算子),或判断是否过滤当前数据(如过滤器算子),或对外输出,这些第一类算子既没有自身的逻辑状态,也不会对数据添加逻辑状态,不会影响其他算子对实时数据流的继续处理。
有逻辑状态的第二类算子在处理实时数据流时,会在每条数据上增加逻辑状态标识,并可能由一条数据输入产生多条数据输出,并且第二类算子收到带有逻辑状态标识的数据时,会根据该逻辑状态标识的不同而进行不同处理。因此,在进行流计算处理的过程中,需要判断当前算子是否属于第二类算子,当该当前算子属于第二类算子时,则会为处理结果添加逻辑状态标识。本申请实施例通过这种方式解决了分布式系统中一条数据输入导致多条数据变化的实时更新问题。下面通过举例对第二类算子的进行流计算处理的过程进行说明。
如图5所示,在一个两级分组的流运算DAG中,第一级按照A列哈希(hash),第二级按照A列的统计(count)值哈希。按照分布式的原理,这两级分组算子必须在两级第二节点上分别按照A列和A列的统计值分别进行哈希。在这个例子中,两级第二节点通过添加“更新(update)”标识来完成流计算处理。由于流计算的特点,数据是没有边界且无穷无尽的,不同 于离线sql,离线sql在第一级处理完成后,才进行第二级的处理。为了保证流计算处理的实时性,本申请实施例在每一级第二节点处理后,都尽快的交给下一级第二节点去处理,导致一条数据的进入可能产生多条数据的变化。在图5中,收到A列值为a的记录(record),上一级第二节点的分组算子增加一条“A:a,Count(A):1”数据,该变化产生一条有“update:count(A)Null->1”逻辑状态标识的记录发送给下一级第二节点的分组算子;则下一级第二节点的分组算子收到后增加Count(A):1的一条数据。当上一级第二节点的分组算子再次收到A列值为a的记录时,上一级第二节点的分组算子的数据变为A:a,Count(A):2;该变化产生一条有“update:count(A)1->2”逻辑状态标识的数据发送给下一级第二节点的分组算子,则下一级第二节点的分组算子收到后解析该逻辑状态标识并将数据Count(A):1更新为Count(A):2。
上述过程用于对采用添加更新标识的流计算处理过程进行说明,并不构成对本申请保护范围的限制。在实际情况中,上一级第二节点向下一级第二节点可能同时产生多条数据进行更新,互相之间还存在其他逻辑关系,为了使上一级第二节点和下一级第二节点之间的框架设计和代码逻辑更加清晰且便于分析,对于上述例子还可以进一步采用添加“附加/删除(append/delete)”标识的方法来进行处理。如图6所示,收到A列值为a的记录时,上一级第二节点的分组算子增加一条“A:a,Count(A):1”数据,上一级第二节点的分组算子为该变化添加“附加”标识并发送至下一级第二节点,则下一级第二节点的分组算子收到后增加Count(A):1的一条数据。当上一级第二节点的分组算子再次收到A列值为a的记录时,上一级第二节点的分组算子的数据变为A:a,Count(A):2;上一级第二节点的分组算子产生一条变化前的数据“A:a,Count(A):1”并添加“删除”标识,下一级第二节点的分组算子接收到这条数据后,将把Count(A):1的数据删除;然后,上一级第二节点的分组算子产生一条变化后的数据“A:a,Count(A):2”并添加“附加”标识,下一级第二节点的分组算子接收到这条数据后,增加Count(A):2的一条数据,由此完成这次实时数据流的计算处理过程。同理可通过上述过程完成多级分组运算处理,或者其他第二类算子(如限定返回数算子、连接算子)的实时数据流计算处理。
在步骤S22中,将处理结果发送至下一级第二节点或外部的存储装置。
如上例所述,第二节点在得到处理结果后,会将处理结果发送至下一级第二节点继续处理。或者,最低级别的第二节点将处理结果发送至外部的存储装置,例如内存、硬盘等存储装置。
在一个实施例中,为了避免由于某个第二节点出现故障而导致整个流计算处理系统无法运行,需要建立针对第二节点出现故障时的处理机制。步骤S21根据部分DAG中各个算子之间的逻辑关系,对实时数据流进行流计算处理,得到处理结果进一步包括以下步骤:
在步骤S210中,每隔预设时长停止处理接收到的数据,将正在处理的数据处理完成后,对部分DAG中有逻辑状态的第二类算子生成快照。
第二节点一直保持接收实时数据流,每隔预设时长停止对接收到的实时数据流的处理,而只是继续处理那些正在处理中但还没有处理完成的数据。当这些正在处理中但还没有处理完成的数据已处理完毕时,第二节点对分配到的部分DAG中有逻辑状态的第二类算子生成快照(snapshot),该快照用于记录这一时刻该第二节点内所有第二类算子中各条数据的逻辑状态。
在步骤S211中,将快照的内存镜像文件记录为一个检查点。
第二节点将该快照的镜像文件(例如dump文件)保存到内存,将该镜像文件记录为一个检查点(check point),用于当第二节点出现故障时将第二类算子中的各条数据恢复到该检查点所在时刻的逻辑状态。该检查点被建立之后,第二节点继续开始处理接收到的实时数据流。
当第二节点出现故障时,可通过建立的检查点使各个第二类算子恢复到以前的状态。通过以下步骤第二节点在发生故障时可自动恢复正确的处理过程,如图7所示,该方法包括以下步骤。
在步骤S301中,根据从第一节点分配到的部分DAG,从客户端或上一级第二节点接收到实时数据流。
在步骤S302中,将接收到的实时数据流写入到重做日志。
重做日志(redo log)用于记录第二节点接收到的每条实时数据,包括数据内容和接收到该条数据时的时间信息。
在步骤S303中,每隔预设时长停止处理接收到的数据,将正在处理的数据处理完成后,对部分DAG中有逻辑状态的第二类算子生成快照。
在步骤S304中,将快照的内存镜像文件记录为一个检查点。
在步骤S305中,当发生故障时,读取距离当前时间最近的检查点。
第二节点发生故障时,从内存中读取距离当前时间最近的检查点,即该检查点的内存镜像文件。
在步骤S306中,根据检查点的内存镜像文件恢复第二类算子的逻辑状态。
读取的内存镜像文件包括该第二节点各个第二类算子的快照,即每条数据在那一时刻的逻辑状态,因此根据该内存镜像文件将第二类算子的数据恢复到该检查点的逻辑状态。
在步骤S307中,从重做日志中读取检查点后接收到的数据并进行处理。
第二节点确定该检查点所在的时刻,从重做日志中读取该检查点所在时刻之后接收到的数据,并由内部算子逐条进行处理。
在步骤S308中,当重做日志中的数据处理完成时,继续对接收到的实时数据流进行流计算处理。
第二节点将重做日志中检查点所在的时刻之后的数据全部处理完成时,能够使第二节点各个算子的数据恢复到发生故障时的逻辑状态。此时,第二节点便可继续对接收到的实时数据流进行流计算处理,从而实现了第二节点在发生故障时通过检查点和重做日志而自动恢复的功能。
在步骤S309中,将处理结果发送至下一级第二节点或外部的存储装置。
通过上述方法用户无需自己实现流计算的处理逻辑,并且第二节点发生故障时可自行恢复全部数据并继续对实时数据流进行流计算处理。
图8是本申请实施例提供的一种分布式流计算装置,包括:
接收模块40,用于根据从第一节点分配到的部分DAG,从客户端或上一级第二节点接收到实时数据流;
第一处理模块41,用于根据部分DAG中各个算子之间的逻辑关系,对 实时数据流进行流计算处理,得到处理结果;
发送模块42,用于将处理结果发送至下一级第二节点或外部的存储装置。
该第一处理模块41包括:
判断子模块,用于判断当前算子是否属于第二类算子,
处理子模块,用于当当前算子属于第二类算子时,为处理结果添加逻辑状态标识。
该处理子模块包括:
第一发送单元,用于为处理结果添加更新标识并发送至下一级第二节点;或者,
第二发送单元,用于为处理结果添加附加/删除标识并发送至下一级第二节点。
该第二发送单元包括:
第一发送子单元,用于当根据处理结果生成第一数据时,发送带有附加标识的第一数据至下一级第二节点,使下一级第二节点添加第一数据;
第二发送子单元,用于当根据处理结果第一数据变为第二数据时,发送带有删除标识的第一数据至下一级第二节点,使下一级第二节点删除第一数据;再发送带有附加标识的第二数据至下一级第二节点,使下一级节点添加第二数据。
在一个实施例中,该第一处理模块41还包括:
生成子模块,用于每隔预设时长停止处理接收到的数据,将正在处理的数据处理完后,对部分DAG中有逻辑状态的第二类算子生成快照;
镜像子模块,用于将快照的内存镜像文件记录为一个检查点。
所述装置还包括:
日志模块,用于将接收到的实时数据流写入到重做日志;
读取模块,用于当发生故障时,读取距离当前时间最近的检查点;
恢复模块,用于根据检查点的内存镜像文件恢复第二类算子的逻辑状 态;
第二处理模块,用于从重做日志中读取检查点后接收到的数据并进行处理;
第三处理模块,用于当重做日志中的数据处理完成时,继续对接收到的实时数据流进行流计算处理。
下面通过应用实例对本申请实施例的技术方案做进一步说明。
对于互联网数据统计分析服务提供商而言,需要为各类网站和企事业单位提供专业、权威、独立的网站数据统计与分析服务。通常,大型互联网数据统计分析服务提供商的服务对象在百万级以上,每天处理的统计数据数量在十亿条以上。网络用户的浏览行为是实时发生的,因此对网站数据的统计属于实时的流计算处理。
对于网站数据的统计通常包括:页面浏览次数(Page View,PV),独立访客(Unique Visitor,UV),IP地址,访问时长和访问次数(访客从进入网站到离开网站的一系列活动记录为一次访问,一次访问可能产生多次页面浏览)等基础统计数据;以及当日回头访客、新独立访客、访客平均访问频度,平均访问时长,平均访问深度和人均浏览页数等高级统计数据。
其中,当日回头访客,为一天之内多次访问网站的独立访客,需要根据统计到的独立访客和访问次数来进一步确定。新独立访客,即每天产生的新访客,需要根据实时统计IP地址与历史记录的IP地址进行比较确定新出现的IP地址,实时统计到的在新出现的IP地址下的独立访客即为新独立访客。访客平均访问频度,为平均每个独立访客一天内访问网站的次数,访客平均访问频度=访问次数/独立访客。平均访问时长,平均每次访问在网站上的停留时间,平均访问时长=访问时长/访问次数。平均访问深度,平均每次访问产生的页面浏览次数,平均访问深度=页面浏览次数/访问次数。人均浏览页数,平均每个独立访客的页面浏览次数,人均浏览页数=页面浏览次数/独立访客。
可见,上述高级统计数据需要根据实时的基础统计数据做进一步计算处理而得出,因此针对每个网站的数据统计都可适用本申请实施例的分布式流 计算系统。可以将针对上述统计数据的统计和处理逻辑由第一节点转化为有向无环图。将有向无环图分成多个部分,并分配到多级第二节点。由较低级别的第二节点完成上述基础统计数据的统计工作,统计页面浏览次数,独立访客、IP地址、访问次数等等,由较高级别的第二节点根据实时统计的基础统计数据完成上述高级统计数据的实时计算工作,计算出当日回头访客、新独立访客、访客平均访问频度,平均访问时长,平均访问深度和人均浏览页数等数据。
例如一个第一级第二节点统计独立访客的页面浏览次数,其内部利用一个第一级第二类算子实时统计进入网站的独立访客,利用一个第二级第二类算子来统计每个独立访客针对该网站的页面浏览次数,并输出至一个第二级第二节点来计算与每个独立访客的页面浏览次数相关的统计数据,例如计算该网站的页面浏览总次数的一个第二级第二节点,即对每个独立访客的页面浏览次数求和。该第一级第二节点同时将统计到的独立访客数输出到另一个第二级第二节点,以用于计算与独立访客相关的统计数据,例如用于计算人均访问页数、平均访问频度的第二级第二节点。其中的第二类算子为实时统计到的独立访客和每个独立访客的页面浏览次数添加状态标识(“更新”标识或者“插入/删除”标识),以不断实时更新独立访客、每个独立访客的页面浏览次数等数据以及下一级第二节点实时计算出的页面浏览总次数、人均访问页数、平均访问频度等数据。第一级第二节点和第二级第二节点将接收到的数据写入重做日志,以备份接收到的数据。第一级第二节点和第二级第二节点每隔预设时长停止处理接收到的数据,将正在处理的数据统计和计算完毕之后,对各自内部的第二类算子生成快照。快照包括每个第二类算子的当前统计数值和该数值的逻辑状态标识。将该快照的内存镜像文件作为一个检查点,以备出现故障时进行数据恢复。当其中的第一级第二节点在独立访客为230时出现故障时,读取距离当前时间最近的检查点,相应的第二类算子恢复到10分钟之前独立访客为220以及当时每个独立访客的页面浏览次数。然后从重做日志中读取这10分钟之内接收到的数据,由第二类算子根据重做日志中的数据重新完成这10分钟之内的数据统计,统计到独立访客为230以及每个独立访客的页面浏览次数后,继续对独立访客进行实时数据统计。上述网站数据的分布式统计系统的每个第二节点都能够在发生故障 时通过以上方式快速自行恢复,从而为用户提供可靠的实时统计数据。
上述网站数据的分布式统计系统的应用实例用于对本申请实施例的示例性说明,并不构成对本申请保护范围的限制,本申请实施例提供的分布式流计算系统和方法同样适用于其他任何数据实时统计系统。
在内容分发网络(Content Delivery Network,CDN)将源站内容分发至全国所有的节点,缩短用户查看对象的延迟,提高用户访问网站的响应速度与网站的可用性,解决网络带宽小、用户访问量大、网点分布不均等问题,将网站内容分发至全网,跨运营商、跨地域加速站点。
将本申请实施例提供的分布式流计算系统应用于CDN时,将用户对网站访问来源做为分布式流计算系统的输入,以检测针对该网站的访问是否出现异常。通过统计独立访客数量、IP地址、每个独立访客的页面浏览次数,进一步计算出访客平均访问频度、每个IP地址的访问频度和页面浏览次数等数据,对每个独立访客的页面浏览次数以及访客平均访问频度进行排序,以预测是否存在针对该网站的攻击,例如分布式拒绝服务(Distributed Denial of Service,DDoS)攻击。分布式流计算系统的第一节点将上述逻辑转化为有向无环图,将有向无环图分为多个部分并分配到多个第二节点中。利用第一级第二节点统计独立访客数量、IP地址、每个独立访客的页面浏览次数等数据,并利用第二级第二节点计算出每个独立访客的页面浏览次数、访客平均访问频度、每个IP地址的访问频度和页面浏览次数等数据并进行排序。在短时间内访问频度或浏览次数的过高访客或IP,有可能正在对网站发动攻击,例如,有几个IP地址在单位时间内同时发起的访问请求或页面浏览请求已超过网站服务器的吞吐量,短时间内几乎占用了网站服务器的全部资源,使其他用户的正常访问无法完成,则说明这几个IP地址的计算机有可能正在对该网站服务器发起攻击。此时分布式流计算系统将异常结果通知CDN,在一定时间之内阻止这几个IP地址对网站服务器的访问,从而防止网络用户针对网站服务器的攻击,维持网站服务器的正常运行。分布式流计算系统中的各个第二节点也同样能够在出现故障时自行恢复,从而不影响对用户访问数据的实时统计。本申请实施例提供的分布式流计算系统还可以在CDN中统计网站的当前的内容分发情况,根据独立访客和IP地址以确认来 自不同地域、不同运营商的用户是否能够正常访问该网站。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
如在说明书及权利要求当中使用了某些词汇来指称特定组件。本领域技术人员应可理解,硬件制造商可能会用不同名词来称呼同一个组件。本说明书及权利要求并不以名称的差异来作为区分组件的方式,而是以组件在功能上的差异来作为区分的准则。如在通篇说明书及权利要求当中所提及的“包含”为一开放式用语,故应解释成“包含但不限定于”。“大致”是指在可接收的误差范围内,本领域技术人员能够在一定误差范围内解决所述技术问题,基本达到所述技术效果。此外,“耦接”一词在此包含任何直接及间接的电性耦接手段。因此,若文中描述一第一装置耦接于一第二装置,则代表所述第一装置可直接电性耦接于所述第二装置,或通过其他装置或耦接手段间接地电性耦接至所述第二装置。说明书后续描述为实施本发明的较佳实施方式,然所述描述乃以说明本发明的一般原则为目的,并非用以限定本发明的范围。本发明的保护范围当视所附权利要求所界定者为准。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非 排他性的包含,从而使得包括一系列要素的商品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种商品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的商品或者系统中还存在另外的相同要素。
上述说明示出并描述了本发明的若干优选实施例,但如前所述,应当理解本发明并非局限于本文所披露的形式,不应看作是对其他实施例的排除,而可用于各种其他组合、修改和环境,并能够在本文所述发明构想范围内,通过上述教导或相关领域的技术或知识进行改动。而本领域人员所进行的改动和变化不脱离本发明的精神和范围,则都应在本发明所附权利要求的保护范围内。