学习
实践
活动
专区
工具
TVP
写文章

Flink概念:编程模型下

Window

对于流的聚合事件(如:counts、sum)的工作与批处理是不同的。例如,是不可能统计一个流的所有元素的数据量的,因为流通常是无限的(没有边界的)。取而代之地,流的聚合事件(如:counts、sum)是限制在窗口范围之内的,比如“统计最近五分钟的数量”或者“最近100个元素的和”。

窗口可以是时间驱动(比如:每30秒)或者数据驱动(比如:每100个元素)。通常有区分出几种不同类型的窗口,比如tumbling windows(没有重复)、sliding windows (有重复)以及session windows(中间有不活跃的间隙)。

更多window的例子,可以参考这边博客(https://flink.apache.org/news/2015/12/04/Introducing-windows.html)。更多细节可以参考 window docs(https://flink.apache.org/news/2015/12/04/Introducing-windows.html)。

Time

在流式程序中涉及到时间的时候(比如定义窗口),将会涉及到三种不同的时间概念:

Event Time是一个事件创建的时间。它通常在事件中以时间戳的形式来描述,比如被传感器或者生产服务添加上去的。Flink 通过timestamp assigners(https://ci.apache.org/projects/flink/flink-docs-release-1.5/dev/event_timestamps_watermarks.html)来访问时间。

Ingestion time是事件在source操作中进入到Flink数据流中的时间。

Ingestion time是执行基于时间操作的操作器的本地时间。

更多关于如何处理时间的细节在event time docs(https://ci.apache.org/projects/flink/flink-docs-release-1.5/dev/event_time.html)。

Stateful Operations

在一个数据流中有很多操作在某个时间仅仅查看一个独立的事件(比如事件解析器),但是有些操作会记住多个操作的信息(比如窗口操作)。这些操作被称作有状态的

这些有状态的操作符的状态是保存在可以认为是一个内嵌的key/value存储器中。状态与被有状态的操作符的读取的流是严格地分区和分布式的。因此,只有在keyBy() 函数以后,keyed streams才能访问 key/value 状态,但是只能访问当前事件key相关的值。调整流的键以及状态确保了所有的状态更新是本地操作,这保证了一致性而没有事务开销。这个调整可以让Flink很容易地重新分配留的状态和调整流的分区。

更多信息,可以查看State的文档(https://ci.apache.org/projects/flink/flink-docs-release-1.5/dev/stream/state/index.html)

检查点的容错

Flink结合流重播(stream replay)检查点来实现容错。检查点与每个输入流特定的点以及每个操作符对应的状态相关。通过从检查点恢复操作符的状态以及重新执行事件,可以使流式的数据流可以从检查点开始重新执行,以保持一致性(exactly-once处理语义)。

检查点的间隔是一种平衡执行期间容错性开销和恢复时间的方式(需要重新执行的事件的数量)。

fault tolerance internals(https://ci.apache.org/projects/flink/flink-docs-release-1.5/internals/stream_checkpointing.html)的描述中提供了更多关于Flink管理检查点的信息以及相关的话题。更多关于配置检查点的细节在 checkpointing API docs(https://ci.apache.org/projects/flink/flink-docs-release-1.5/dev/stream/state/checkpointing.html)中。

批处理流媒体

Flink把其看成流式程序的一种特殊场景来执行批处理程序。这时候流是有边界的(有限的元素数量)。DataSet内部是当做数据流来对待的。因此,上述概念同样适用于批处理程序以及流处理程序,只有一些小的例外:

批处理的容错性(https://ci.apache.org/projects/flink/flink-docs-release-1.5/dev/batch/fault_tolerance.html)不使用检查点。通过重新执行全部的流来进行恢复。这大概是由于输入是有限的吧。这使恢复的成本消耗更多,但是让常规的执行更加简单,因为它避免了检查点。

在DataSet API中有状态的操作使用简化的in-memory/out-of-core 数据结构,而不是key/value 索引。

DataSet API 介绍了特定的同步的(基于时序图的)操作,这仅仅在有限的流中才有可能。更多细节,请查看iteration 文档(https://ci.apache.org/projects/flink/flink-docs-release-1.5/dev/batch/iterations.html)。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180729G0226V00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

同媒体快讯

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券