【笔记】现代流计算的基石:Google DataFlow

流计算精品翻译:The Dataflow Model

假设

  • 我们永远无法知道数据流是否终结,何时数据会变完整。
  • 新的数据会源源不断而来,老的数据可能会被撤销或更新。

设计思想

目标

抽象模型

  • 对无边界,无序的数据源,允许按数据本身的特征进行窗口计算,得到基于事件发生时间的有序结果,并能在准确性、延迟程度和处理成本之间调整。
  • 解构数据处理管道的四个相关维度,使得它们透明地,灵活地进行组合。
    • 计算什么结果
    • 按事件发生时间计算
    • 在流计算处理时间时被真正触发计算
    • 早期的计算结果如何在后期被修正
  • 分离数据处理的计算逻辑表示和对逻辑的物理实现,使得对批处理,微批处理,流计算引擎的选择成为简单的对准确性、延迟程度和处理成本之间的选择。

语义

窗口

窗口操作把一个数据集切分为有限的数据片以便于聚合处理。

  • 对齐:窗口应用于所有落在窗口时间范围内的数据
  • 非对齐:窗口应用于部分特定的数据子集(如按某个键值筛选的数据子集)
    【笔记】现代流计算的基石:Google DataFlow_第1张图片
  • 固定窗口(翻滚窗口):按固定窗口大小定义的,比如说小时窗口或天窗口。它们一般是对齐窗口,也就是说,每个窗口都包含了对应时间段范围内的所有数据。有时为了把窗口计算的负荷均匀分摊到整个时间范围内,有时固定窗口会做成把窗口的边界的时间加上一个随机数,这样的固定窗口则变成了不对齐窗口。
  • 滑动窗口:按窗口大小和滑动周期大小来定义,比如说小时窗口,每一分钟滑动一次。这个滑动周期一般比窗口大小小,也就是说窗口有相互重合之处。滑动窗口一般也是对齐的。
  • 会话窗口:在数据的子集上捕捉一段时间内的活动。一般来说会话按超时时间来定义,任何发生在超时时间以内的事件认为属于同一个会话。会话是非对齐窗口。

时间域

  • 事件发生时间。事件发生时间是指当该事件发生时,该事件所在的系统记录下来的系统时间。
  • 处理时间。处理时间是指在数据处理管道中处理数据时,一个事件被数据处理系统观察到的时间,是数据处理系统的时间。注意我们这里不假设在分布式系统中时钟是同步的。
  • 水位标记:记录全局数据处理进度的标记,它是一个时间戳,代表小于这个时间戳的数据已经完全被系统处理了(通常用启发式方法建立)。

触发器

触发器是一种受内部或者外信号激励的激发GroupByKeyAndWindow执行并输出执行结果的机制。他们对窗口模型是互补的,各自从不同的时间维度上影响系统的行为:

  • 窗口 决定哪些事件发生时间段(where)的数据被分组到一起来进行聚合操作
  • 触发 决定在什么处理时间(when)窗口的聚合结果被处理输出成一个窗格(计算结果何时触发)

基于窗口的完成度估计的预定义触发器:完成度估计基于水位标记。完成度估计也包括水位标记完成百分位。它提供了一种有效的处理迟到记录的语义。允许使用者处理少量的一部分的记录来快速获得结果,而不是痴痴地等待最后的一点点数据到来。

  • 模式
    • 抛弃 窗口触发后,窗口内容被抛弃,而之后窗口计算的结果和之前的结果不存在相关性。
    • 累积:触发后,窗口内容被完整保留住持久化的状态中,而后期的计算结果成为对上一次结果的一个修正的版本。(类似Lambda架构)
    • 累积和撤回:出发后,在进行累积语义的基础上,计算结果的一份复制也被保留到持久化状态中。当窗口将来再次触发时,上一次的结果值先下发做撤回处理,然后新的结果作为正常数据下发。

设计原则

  • 永远不要依赖任何的数据完整性标记(译者注:如水位标记)
  • 灵活性,要能覆盖已知的多样化的使用用例,并且覆盖将来可能的使用用例
  • 对于每个预期中的执行引擎,(模型抽象)不但要正确合理,而且要有额外的附加价值
  • 鼓励实现的透明性
  • 支持对数据在它们产生的上下文中进行健壮的分析。

你可能感兴趣的:(【笔记】现代流计算的基石:Google DataFlow)