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. 二、Html基本语法

    1,XHTML的基本结构和规则 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> < ...

  2. 如何书写优雅、漂亮的SQL脚本?

    本篇来聊聊如何书写漂亮.整洁.优雅的SQL脚本,下面这些是我个人总结.整理出来的.姑且做个抛砖引玉吧,呵呵,欢迎大家一起来讨论.   我们首先来看看一段创建数据表的脚本(如下所示),你是否觉得有什么不 ...

  3. js二维码插件总结

    jquery.qrcode.js生成二维码插件&转成图片格式 http://blog.csdn.net/u011127019/article/details/51226104

  4. tomcat-users.xml 配置

    一:tomcat6配置管理员信息 1:打开tomcat6下的~/conf/tomcat-users.xml文件,关于用户角色.管理员的信息都在这个配置文件中. 2:在配置文件<tomcat-us ...

  5. 企业级Docker私有仓库部署(https)

    部署环境 Centos7.3 x64 docker-ce-17.06.0 docker-compose-1.15.0 Python-2.7.5(系统默认) 部署目标 使用HTTPS协议 支持Clair ...

  6. css正三角倒三角

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  7. win7:你需要来自Administrators的权限才能对此文件进行修改的一个文件

    win7:你需要来自Administrators的权限才能对此文件进行修改的一个文件 Posted on 2010-11-29 09:54 寒宵飞飞 阅读(36117) 评论(1) 编辑 收藏 新建一 ...

  8. C#中的out参数/ref参数/params可变参数

    out参数: out关键字 通过引用来传递参数,在定义方法和调用方法的时候都必须使用out关键字 简单来讲out可以用来返回多个参数类型. static void Main(string[] args ...

  9. 在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?

    在高并发.高负载的情况下,如何给表添加字段并设置DEFAULT值? 在Oracle 12c之前,当Oracle表数据量上亿时,对表执行“ALTER TABLE XXX ADD COLUMN_XX VA ...

  10. Swing EDT引起的客户端卡死

    最近调试程序时发现,点击某个界面时会出现卡死的情况,出现的频率还是比较频繁的. 再次出现卡死的情况后,利用jvisualvm查看线程的运行情况,dump操作之后发现线程间出现了死锁: Found on ...