一种可变间隔的去除重复流数据的会话窗口设计方法与流程

文档序号:17900926发布日期:2019-06-13 16:30阅读:466来源:国知局
一种可变间隔的去除重复流数据的会话窗口设计方法与流程

本发明属于流计算技术领域,具体涉及一种流计算系统中会话窗口的设计,特别是一种可变间隔的去除重复的流数据会话窗口设计方法。



背景技术:

流数据可以看成是一组组离散事件集合体,由成千上万的数据源,源源不断的持续生成,生成的数据流以log(非传统意义上的系统日志)方式传送。流数据具有四个特点:1)数据实时到达;2)数据到达次序独立,不受应用系统所控制;3)数据规模宏大且不能预知其最大值;4)数据一经处理,除非特意保存,否则不能被再次取出处理,或者再次提取数据代价昂贵。

流计算的产生即来源于对于流数据加工时效性的严苛需求:数据的业务价值随着时间的流失而迅速降低,因此在数据发生后必须尽快对其进行计算和处理。通常而言,流计算具备三大类特点:1)实时且无界的数据流;2)持续且高效的计算3)流式且实时的数据集成。

在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理。当有时我们需要做一些聚合类的处理,而聚合操作只能作用在特定的数据集,也即有界的数据集上。因此需要通过某种方式从无界的数据集上按特定的语义选取出有界的数据。窗口是一种非常常用的设定计算边界的方式。窗口可以是时间驱动的,也可以是数据驱动的。一种经典的窗口分类可以分成:翻滚窗口,滚动窗口,和会话窗口。

会话窗口是针对分析用户的一段交互的行为事件需求,将用户的事件流按照“session”来分组。session是指一段持续活跃的期间,由活跃间隙分隔开。消息之间的间隔小于超时阈值(sessiongap)的,则被分配到同一个窗口,间隔大于阈值的,则被分配到不同的窗口。

一般而言,窗口是在无限的流上定义了一个有限的元素集合。这个集合可以是基于时间的,元素个数的,时间和个数结合的,会话间隙的,或者是自定义的。窗口的选择与设计是流数据处理的基础,对于后续处理分析有着重要的影响。

现有技术中,对于一般会话窗口来说,当元素被分配到窗口之后,这些窗口是固定的不会改变的,而且窗口之间不会相互作用。对于某些场景存在数据重复冗余的问题,比如需要对窗口中的数据求和的情况,或者需要前期去除重复数据以减少处理函数的计算与存储所需的资源的情况。因此,针对同一种要素(key)在相同的时间间隔内(gap)同一种访问操作重复出现多次的情况,需要提出一种简便,高效的去重会话窗口设计方法。



技术实现要素:

有鉴于此,本发明旨在提出一种可变间隔的去除重复流数据的会话窗口设计方法,以解决流数据处理中特定应用场景中数据重复冗余的问题。

为达到上述目的,本发明的技术方案是这样实现的:

一种可变间隔的去除重复流数据的会话窗口设计方法,包括如下内容:

步骤1、构建分配器(assigner),用于创建窗口并为窗口分配元素;

步骤2、为每一个窗口构建驱动器(trigger),用于对窗口进行操作;

步骤3、构建输出器(evictor),用于按照预设业务规则输出窗口中的元素;

步骤4、为会话窗口(sessionwindow)创建合并机制。

进一步的,所有窗口的组件都位于一个算子(operator)中,数据流源源不断地进入算子,每一个到达的元素都会被交给分配器。分配器按照预设好的规则将每一个到达的元素放入一个或者多个窗口(window)中,并且按照需求创建新窗口。

进一步的,为了节省空间,窗口本身只是一个id标识符,其内部存储了其他的元数据,如窗口的开始时间和结束时间,但是并不会存储窗口中的元素。

进一步的,每一个窗口都拥有一个属于自己的驱动器,每个驱动器包含一个定时器,用来决定一个窗口何时能够被计算或清除。每当有元素加入到该窗口,或者之前注册的定时器超时了,那么驱动器就会被调用。驱动器的返回结果可以是continue(不做任何操作),fire(处理窗口数据),purge(移除窗口和窗口中的数据),或者fire+purge(处理窗口数据后销毁窗口)。一个驱动器的调用结果如果只是fire的话,那么只会处理窗口中的数据元素并保留窗口原样,也就是说窗口中的数据仍然保留不变,等待下次驱动器的操作。一个窗口可以被重复计算多次直到它被purge。在purge之前,窗口会一直占用着内存。

进一步的,当处理器对窗口中的数据进行计算,窗口中的元素集合就会交给输出器;输出器主要用来遍历窗口中的元素列表,并根据业务规则,移除或者过滤掉无效元素,决定最先进入窗口的多少个元素需要被移除。剩余的元素会交给用户指定的函数进行窗口的计算。如果没有输出器的话,窗口中的所有元素会一起交给函数进行计算。计算函数收到了窗口的元素(经过输出器的过滤),并计算出窗口的结果值,并发送给下游。窗口的结果值可以是一个也可以是多个。

进一步的,会话窗口的分配器会为每个进入的元素分配一个窗口,该窗口以元素的时间戳作为起始点,时间戳加会话超时时间为结束时间。举例来说,先到达的两个元素被分配到两个独立的窗口中,两个窗口目前不相交。当第三个元素进入时,分配到的窗口与现有的两个窗口发生了叠加。由于支持了窗口的合并,会话窗口分配器可以合并这些窗口。它会遍历现有的窗口,并告诉系统哪些窗口需要合并成新的窗口。

合并的主要内容有两部分:(1)需要合并的窗口的底层状态的合并(也就是窗口中缓存的数据,或者对于聚合窗口来说是一个聚合值)(2)需要合并的窗口的触发器的合并(比如会删除旧窗口注册的定时器,并注册新窗口的定时器)。对于每一个新进入的元素,都会分配一个属于该元素的窗口,都会检查并合并现有的窗口。在触发窗口计算之前,每一次都会检查该窗口是否可以和其他窗口合并,直到驱动器trigger发出purge命令后,会将该窗口从窗口列表中移除。

进一步的,所述分配器会为新进入的元素分配一个窗口,窗口以元素的时间戳作为起始点,时间戳加会话超时时间为结束时间;当队列中已存在窗口时,每次新进入一个元素分配器建立窗口后,分配器会遍历现有的窗口,将这个元素的时间戳与上一个元素窗口的第一个元素的时间戳相比较,如果两者之间的差值超过预先设定的间隔,则认定为两个窗口;否则按照时间顺序合并两个窗口中的元素,并且保持每种元素仅出现一次。

相对于现有技术,本发明具有以下优势:

本发明解决了流数据处理中特定应用场景中数据重复冗余的问题,通过会话窗口底层结构的设计,减少了会话窗口占用的内存资源。并且在窗口中就完成了对重复数据的去除,不需要在后续的计算函数中再次过滤数据,不仅大大节省了计算资源也减少了数据存储的内存资源。

附图说明

构成本发明的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1为本发明实施例流计算系统窗口机制及组建工作流程图;

图2为本发明实施例流计算会话窗口示意图;

图3为本发明实施例会话窗口合并示意图。

具体实施方式

需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。

下面将参考附图并结合实施例来详细说明本发明。

本实施例以交通卡口流量监测场景为例,正常情况下车辆不会在短时间内重复多次通过一个卡口,如果短时间出现车辆重复数据,可能车辆停在了附近,或出现了拥堵。在这种情况下,必须去除重复数据才能真实反映车流量(流量突然大幅降低)情况,为了实时去重(在统计流量前去重,而不是入库后再去重)和节省存储资源,提供一种可变间隔的去除重复流数据的会话窗口设计方法,如图1至3所示,包括如下内容:

构建分配器assigner,用于创建窗口并为窗口分配元素;分配器assigner接收交通录像中已经被识别的车辆信息,每一辆车的信息作为一个单独的元素,为每一个新进入的元素创建一个新的窗口,保存这个元素的存储位置、进入时间等元数据,并不存储具体的车辆信息。

为每一个新建的窗口分配驱动器trigger,用于对窗口进行操作,具体负责对该窗口中存储的车辆信息进行处理与销毁。

为会话窗口sessionwindow创建合并机制,当队列中已存在窗口时,每次新进入一个元素并建立窗口后将这个元素的时间戳与上一个元素窗口的第一个元素的时间戳相比较,如果两者之间的差值超过预先设定的间隔(gap),则认定为两个窗口。否则按照时间顺序合并两个窗口中的元素,并且保持每种元素仅出现一次,对重复元素进行去重操作。

具体的,合并窗口时,由驱动器trigger对两个窗口进行操作,需要合并窗口的底层状态(也就是窗口中缓存的数据)和窗口的驱动器trigger(删除旧窗口注册的定时器,并注册新窗口的定时器)。

构建输出器evictor,用于按照预设业务规则输出窗口中的元素;输出器evictor遍历窗口中的元素列表,根据业务规则过滤掉无效元素,即决定最先进入窗口的多少个元素需要被移除。剩余的元素会交给用户指定的函数进行窗口的计算。对于每一个窗口中的元素,由于在处理步骤中就已经去除了gap内的重复,因此后续的计算函数只需要统计当前窗口中的元素,就可以统计当前的交通流量。或者比较连续窗口中的车辆信息判断是否有异常的车辆。

本发明会话窗口能便捷,高效的完成特定场景下流数据的采样,为后续处理节省了大量时间与运算资源。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

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