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. maven的聚合和继承

    Maven的聚合特性能够把项目的各个模块聚合在一起构建: 而Maven的继承特性则能帮组抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能促进各个模块配置的一致性. 聚合:新建一个项目demo ...

  2. Azure Functions + Azure Batch实现MP3音频转码方案

    客户需求 客户的环境是一个网络音乐播放系统,根据网络情况提供给手机用户收听各种码率的MP3歌曲,在客户没购买歌曲的情况下提供一个三十秒内的试听版本.这样一个系统非常明确地一个需求就是会定期需要将一批从 ...

  3. R语言-单一变量分析

    R语言简介: R语言是一门专用于统计分析的语言,有大量的内置函数和第三方库来制作基于数据的表格 准备工作 安装R语言 https://cran.rstudio.com/bin/windows/base ...

  4. jQuery选择器概述

    1.基本选择器:1) #id : 根据给定的id匹配一个元素:2) .class: 根据给定的类名匹配元素:3)element: 根据给定的元素名匹配元素:4)* : 匹配所有元素:5)selecto ...

  5. 一道python面试题引发的血案

    这里说的是一道阿里校招的面试题:一行代码实现对列表a中的偶数位置的元素进行加3后求和? 今天去面试同样遇到了这个题目,这道题考察的是对python高阶函数map/filter的灵活运用(具体的使用方法 ...

  6. chromedriver禁用图片,禁用js,切换UA

    selenium 模拟chrome浏览器,此时就是一个真实的浏览器,一个浏览器该加载的该渲染的它都加载都渲染,所以爬取网页的速度很慢.如果可以不加载图片等操作,网页加载速度就会快不少,代码中列出了了禁 ...

  7. c#控制WPF程序自动登录(Automation方式实现)

    说明:winForm窗体,可以通过win32接口dll的findWindow之类的函数来实现查找winform窗口,mfc窗口等. 但是wpf却是不实用这些,可以靠automation方式来进行操作. ...

  8. python中的列表排序

    对列表进行排序是常见的操作,最简单的方式是使用sort()函数. 1.一般用法 不管列表元素是数.字符串还是元组,函数sort()总是就地操作列表,按升序进行排列元素,并返回None. #数 > ...

  9. Kibana安装配置

    Kibana 是一个开源的分析和可视化平台,是ELK的重要部分.Kibana提供搜索.查看和与存储在 Elasticsearch 索引中的数据进行交互的功能.开发者或运维人员可以轻松地执行高级数据分析 ...

  10. 【深度学习】批归一化(Batch Normalization)

    BN是由Google于2015年提出,这是一个深度神经网络训练的技巧,它不仅可以加快了模型的收敛速度,而且更重要的是在一定程度缓解了深层网络中"梯度弥散"的问题,从而使得训练深层网 ...