• 理解Flink Window与Watermark


    Flnk作为流式计算平台,他能对源源不断发送过来的数据进行处理。
    对于数据流的处理方式,可以是来一条处理一条(pipeline的方式),还可以获取一些数据然后统一处理。
    对于数据流如何描述一堆数据呢?就是通过Window的概念。

    Window

    Window翻译为窗口,相当于将流式数据进行逻辑切割,那么可以将Window内的数据看成一个整体。我们就可以对Window内的数据进行聚合、排序等操作。
    对于流式数据来说,划分Window的方式必然和Time有关。在Flink中Window分为两种TimeWindow和GlobalWindow。TimeWindow包含起始时间,GlobalWindow是没有结束时间的TimeWindow。其实你也可以理解为只有一种Window。

    划分Window不是目的,目的是能对Window中的数据进行处理。
    那么,我们需要知道Window中的数据什么时候采集结束?所以在Window的操作中需要设置trigger,当Window中的数据满足某个条件时触发trigger,表示Window中的数据已经采集完了,开始下面的计算吧。
    方式可以有:

    • CountTrigger window中事件数量达到某个值时触发计算
    • EventTimeTrigger window中包含某个时间点的事件时触发计算
      ...

    对于,数据到底应该进入哪个Window(有可能一条数据可以进入多个Window)?Flink中通过设置WindowAssigner来实现。其实就是如何划分时间轴。

    • GlobalWindows 表示 整个流为一个整体的Window
    • TumblingEventTimeWindows 表示 两两Window紧密相连
    • SlidingEventTimeWindows 表示 有交集的Window
      ...

    Flink中还为Window添加了一种操作,当触发计算后,你可以删除Window中的某些事件。这个需求可以通过设定Evictor来实现。

    这就是Flink中对于Window的操作。

    Watermark

    那Watermark的作用呢?

    在流式数据中日志不断的进入Flink系统,在Flink中定义了三种时间:EventTime、IngestTime、ProcessTime。

    • EventTime 表示日志中自带的时间
    • IngestTime 表示日志进入Flink系统的时间
    • ProcessTime 表示Flink处理日志的时间

    在上面Window中说道,Window是基于时间对日志进行逻辑切割,那么时间以什么为基准呢?在Flink系统中可以通过设置上述的时间来确定基准时间,默认是ProcessTime。
    虽然有三种时间但是EventTime和IngestTime/ProcessTime有一个很大的区别,对于Flink系统来说IngestTime/ProcessTime一定是有序的,而EventTime而不一定(大概率是乱序的)。

    那么当我们以EventTime为基准来分割Window时,则可能就会出现原本是Window A中的数据,而在Window D时才进入Flink系统(认为在时间上Window A比Window D早)。
    如果我们希望晚到的数据也能进入在本来应该进入的Window A中去呢?这时候Flink设计了Watermark来解决这个问题。
    Watermark实现的功能是用户通过设置Watermark的生成规则来手工的指定何时触发Window计算。
    常用的方式是让Watermark延时一段时间生成。这也可以将Window之外的一部分日志也计入该Window。但是,这个预估的延时不能完美的解决乱序的问题。

    所以Watermark是在当基准时间设置为EventTime时解决日志乱序的工具。

    引用

  • 相关阅读:
    pexpect模块
    Python正则表达式
    telnetlib
    paramiko
    threadpool和Queue
    logging
    Python异常
    Python迭代器
    程序员工资那么高,却从不炫富?网友回复让人“笑喷了”!
    小白到web前端工程师需要学习哪些知识?
  • 原文地址:https://www.cnblogs.com/hnrainll/p/12930879.html
Copyright © 2020-2023  润新知