Apache Flink 的数据流编程模型

抽象层次

Flink 为开发流式应用和批式应用设计了不同的抽象层次

状态化的流

抽象层次的最底层是状态化的流,它通过 ProcessFunction 嵌入到 DataStream API 中,允许用户自由地处理来自一个或多个流的事件(event)以及使用一致的容错状态

此外,用户可以注册事件时间并处理时间回调(callback),这使得程序可以处理更复杂的计算

核心 API

大多数情况下用户不直接在上面描述的这种低的抽象层面上编程,取而代之的是使用所谓的核心 API,包括可以处理 Unbounded 和 Bounded 流的 DataStream API 和处理 Bounded 数据集的 DataSet API

这些 API 提供了数据处理通用的构建手段,包括用户定义的各种类型的转换(transformation),连接(join),聚合(aggregation),Windows 和状态等,经由这些 API 处理的数据类型被表示为所使用的编程语言中的类(class)

低抽象层次的处理函数被整合到 DataStream API 中以实现对特定操作的精细处理

DataSet API 为 Bounded 数据集提供了额外的原语(primitive),包括循环(loop)和迭代(iteration)

Table API

Table API 是处理表的一种 DSL,表代表着流,而Table API 可以动态地修改表

Table API 使用扩展的关系模型,表关联着模式,就像关系数据库中的表一样,API 提供了对应的操作,包括 select,project,join,group-by 和 aggregate 等等

Table API 写成的程序使用声明式的语法指示操作应该在逻辑上怎么运行,而不是具体地指定操作应该怎么应用

虽然 Table API 可以通过用户定义的函数进行拓展,但它的表达能力还是比不上核心 API,不过 Table API 的优点在于使用起来非常简洁,此外,Table API 写成的程序在执行前会被特定的优化器优化

Table API 和 DataStream/DataSet API 可以混用,这是因为,由于对偶性,表和 DataStream/DataSet 可以无缝地转换

SQL

Flink 提供的最高抽象层次是 SQL,这层抽象在语义和表现上都类似于 Table API,但是语法上表现为 SQL 语句

SQL 抽象和 Table API 密切关联,并且 SQL 查询可以在 Table API 定义的表上进行

程序与数据流

Flink 程序的基本块包括流(stream)和转换(transformation),即使是使用 DataSet API 操作的 DataSet,在内部也表现为流

从概念上说,流(stream)是源源不断的数据记录流(flow),转换(transformation)是接收若干个流为输入,产生若干个流为输出的操作,程序中的转换通常和流中的转换操作一一对应,但也可能对应多个转换操作

Flink 程序在执行时被映射为 Streaming Dataflow,包括流(stream)和转换操作(transformation operator),每个数据流开始于若干个源(source)并结束于若干个汇(sink)

数据流表现为任意有向无环图(DAG),虽然通过迭代结构可以产生一些环,但是简单起见我们可以不太在意它

并行的数据流

Flink 的程序自动地是并行的和分布的,在执行的时候,每个流被分成若干个流的部分(stream partition),每个操作对应着若干个子操作(operator subtask)

子操作之间是相互独立的,运行在不同的线程上,这意味着有可能运行在不同的机器或容器上

特定操作的子操作数量代表了它的并行度,流的并行度由它的 Producing Operator 决定,同一个程序的不同操作可能有不同的并行度

流传输数据有两种模式,①一对一的模式 ②重新分配的模式

一对一的流,例如上图中 Sourcemap() 的过程,保持了元素的分组和顺序,也就是说 map()[1] 看到的元素包括顺序都和 Source[1] 一样

重新分配的流,例如上图中 map()keyBy/window() 的过程和 keyBy/window()sink() 的过程,会改变流的划分,每个操作的子任务,根据选定的转换,向不对应的下一个操作的子任务发送数据,例如 keyBy() 使用键的哈希值重新分配,boardcast() 做全频广播,rebalance() 做随机重新分配

窗口(Windows)

事件的聚合,例如 count 和 sum,在流处理和批处理上是不一样的,比如说,我们没办法统计流上的所有的元素,在流上做聚合的一般方法是通过 windows,例如统计最近五分钟的元素或计算最近一百个元素的和

Windows 可以是时间驱动或数据驱动的,类似于上面的两个例子

Windows 有不同的类型,包括滚动窗口(tumbling windows),滑动窗口(sliding windows)和会话窗口(session windows

时间(Time)

流式程序中的时间通常包括以下几种概念

  1. 事件时间(event time)指的是一个事件被创建的时间,通常由事件中的时间戳(timestamp)描述,例如传感器或服务器,Flink 通过 Timestamp Assigners 获取时间戳

  2. 摄入时间(ingestion time)指的是事件从 Flink 数据流中的源进入的时间

  3. 处理时间(processing time)指的是执行具体操作的机器的本地时间

状态化的操作

数据流中的操作有些对于每次处理每个事件都是单独的,不过也有些需要记住多个事件之间的信息,例如在 windows 操作中,这些操作被称为状态化的

状态化的操作的状态由嵌入式的键值对维护,状态被划分并分布到对应的流中,被状态化操作读取,因此表示为键值对的状态仅能在键化(keyed)的流中获取,首先经过一个 keyBy 函数,然后通过当前事件的键获取

流状态和键的对齐使得状态更新都是本地操作,这就使得一致性无需额外的事务开销,还能支持 Flink 透明地重新分配和调整划分

容错机制中的检查点

Flink 使用流重放(stream replay)和检查点(checkpointing)技术的组合来支持容错

检查点与每个输入流中的特定点和每个操作对应的状态有关,可以通过回滚操作的状态并从检查点重放事件来恢复流式数据流,同时维持一致性,保证 Excatly-once 处理的语义

容错点的间隔是对执行中容错的保障和等待恢复时间的权衡,等待恢复的时间主要取决于需要重放的事件数

流上的批处理

Flink 将批处理程序作为流处理程序的特例来执行,DataSet 在内部作为流式数据处理,因此上面提到的技术也以类似的形式应用到批处理上,大同小异,主要的不同点如下

批处理的容错机制没有检查点,从错误中恢复是通过完全重放整个流来实现的,虽然这使得恢复的时间成本增大,但是因为不需处理检查点,可以加速正常处理流程

DataSet API 中的状态化操作使用简化的内存/外核数据结构取代键/值索引

DataSet API 提供了基于超步(superstep)的专门的同步的迭代过程,这种过程只能在 Bounded 的流上执行

[Note] Apache Flink 的数据流编程模型的更多相关文章

  1. flink原理介绍-数据流编程模型v1.4

    数据流编程模型 抽象级别 程序和数据流 并行数据流 窗口 时间 有状态操作 检查点(checkpoint)容错 批量流处理 下一步 抽象级别 flink针对 流式/批处理 应用提供了不同的抽象级别. ...

  2. Apache Flink 数据流编程模型

    抽象等级(Levels of Abstraction) Flink提供不同级别的抽象来开发流/批处理应用程序. Statefule Stream Processing: 是最低级别(底层)的抽象,只提 ...

  3. Flink(四) —— 数据流编程模型

    分层抽象 The lowest level abstraction simply offers stateful streaming. It is embedded into the DataStre ...

  4. Apache Flink - 常见数据流类型

    DataStream: DataStream 是 Flink 流处理 API 中最核心的数据结构.它代表了一个运行在多个分区上的并行流.一个 DataStream 可以从 StreamExecutio ...

  5. Flink入门(四)——编程模型

    flink是一款开源的大数据流式处理框架,他可以同时批处理和流处理,具有容错性.高吞吐.低延迟等优势,本文简述flink的编程模型. 数据集类型: 无穷数据集:无穷的持续集成的数据集合 有界数据集:有 ...

  6. 第03讲:Flink 的编程模型与其他框架比较

    Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 本课时我们主要介绍 ...

  7. 《从0到1学习Flink》—— Apache Flink 介绍

    前言 Flink 是一种流式计算框架,为什么我会接触到 Flink 呢?因为我目前在负责的是监控平台的告警部分,负责采集到的监控数据会直接往 kafka 里塞,然后告警这边需要从 kafka topi ...

  8. Apache Flink 整体介绍

    前言 Flink 是一种流式计算框架,为什么我会接触到 Flink 呢?因为我目前在负责的是监控平台的告警部分,负责采集到的监控数据会直接往 kafka 里塞,然后告警这边需要从 kafka topi ...

  9. Apache Flink vs Apache Spark——感觉二者是互相抄袭啊 看谁的好就抄过来 Flink支持在runtime中的有环数据流,这样表示机器学习算法更有效而且更有效率

    Apache Flink是什么 Flink是一款新的大数据处理引擎,目标是统一不同来源的数据处理.这个目标看起来和Spark和类似.没错,Flink也在尝试解决 Spark在解决的问题.这两套系统都在 ...

随机推荐

  1. Android ButterKnife注解式开发

    在Android开发中findViewById和setOnClickListener解脱写法. 在任意的一个类中 @Bind(R.id.et) EditText editText; @OnClick( ...

  2. http常见状态码(转载)

    常见HTTP状态码 常见HTTP状态码 200 OK 301 Moved Permanently 302 Found 304 Not Modified 307 Temporary Redirect 4 ...

  3. 主函数特别之处:public static void main(String[] args)

    public static void main(String[] args) public class Test_java {//主函数特殊之处 public static void main(Str ...

  4. LVS负载均衡介绍

    LVS介绍 负载均衡器 • 链路负载均衡 (三层负载均衡) • 服务器负载均衡 (四层负载均衡) • 应用层负载均衡 (七层负载均衡) • 全局负载均衡 基本情况 • 实现服务器负载均衡 • 核心功能 ...

  5. [UWP]合体姿势不对的HeaderedContentControl

    1. 前言 HeaderedContentControl是WPF中就存在的控件,这个控件的功能很简单:提供Header和Content两个属性,在UI上创建两个ContentPresenter并分别绑 ...

  6. template.compile()方法

    template.compile(source, options) source:必传,渲染模板的内容. options:可选,通常不传.(其实是我还没研究明白) return:一个渲染函数. 示例如 ...

  7. Spring Boot快速入门(最新)

    本章通过完成Spring Boot基础项目的构建并实现一个简单的Http请求处理,让大家对Spring Boot有一个初步的了解,并体验其结构简单.开发快速的特性.预计阅读及演练过程将花费约5分钟. ...

  8. 解决axios传递参数后台无法接收问题

    1.根据下面几个方法改变前台传递参数方式 这样后台就可以直接根据传递的参数获取数据,如下图用户登录时直接传递用户名和密码 2.不改变前台传递样式修改后台接收方式

  9. Sonar 常用代码规则整理(一)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 摘要:公司部署了一套sonar,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分 ...

  10. ABP官方文档翻译 9.1 EntityFramework集成

    EntityFramework集成 Nuget包 DbContext 仓储 默认仓储 自定义仓储 应用特定的基础仓储类 自定义仓储示例 仓储最佳实践 事务管理 数据存储 ABP可以使用ORM框架,它内 ...