Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Flink 内部原理之编程模型

Flink 内部原理之编程模型

作者头像
smartsi
发布于 2019-08-07 03:47:06
发布于 2019-08-07 03:47:06
1.6K00
代码可运行
举报
文章被收录于专栏:SmartSiSmartSi
运行总次数:0
代码可运行

1. 抽象层次

Flink提供不同级别的抽象层次来开发流处理和批处理应用程序。

(1) 最低级别的抽象只是提供有状态的数据流。通过Process Function集成到DataStream API中。它允许用户不受限制的处理来自一个或多个数据流的事件,并可以使用一致的容错状态(consistent fault tolerant state)。另外,用户可以注册事件时间和处理时间的回调函数,允许程序实现复杂的计算。

(2) 在实际中,大多数应用程序不需要上述描述的低级抽象,而是使用如DataStream API(有界/无界流)和DataSet API(有界数据集)的核心API进行编程。这些核心API提供了用于数据处理的通用构建模块,如用户指定的各种转换,连接,聚集,窗口,状态等。在这些API中处理的数据类型被表示为对应编程语言中的类。

低级别的Process FunctionDataStream API集成在一起,使得可以对特定操作使用较低级别的抽象接口。DataSet API为有限数据集提供了额外的原语(primitives),如循环/迭代。

(3) Table API是以表为核心的声明式DSL,可以动态地改变表(当表表示流数据时)。Table API遵循(扩展的)关系模型:每个表都有一个schema(类似于关系数据库中的表),对应的API提供了类似的操作(offers comparable operations),如selectprojectjoingroup-byaggregate等。Table API程序声明性地定义了如何在逻辑上实现操作,而不是明确指定操作实现的具体代码。尽管Table API可以通过各种类型的用户自定义函数进行扩展,它比核心API表达性要差一些,但使用上更简洁(编写代码更少)。另外,Table API程序也会通过一个优化器,在执行之前应用优化规则。

可以在表和DataStream/DataSet之间进行无缝转换,允许程序混合使用Table APIDataStreamDataSet API

(4) Flink提供的最高级抽象是SQL。这种抽象在语法和表现力方面与Table API类似,但是是通过SQL查询表达式实现程序。SQL抽象与Table API紧密交互,SQL查询可以在Table API中定义的表上执行。

2. 程序与数据流

Flink程序的基本构建块是流和转换操作。

备注:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Flink的DataSet API中使用的数据集也是内部的流 - 稍后会介绍这一点。

从概念上讲,流是数据记录(可能是永无止境的)流,而转换是将一个或多个流作为输入,并产生一个或多个输出流。

执行时,Flink程序被映射到由流和转换算子组成的流式数据流(streaming dataflows)。每个数据流从一个或多个source开始,并在一个或多个sink中结束。数据流类似于有向无环图(DAG)。尽管通过迭代构造允许特殊形式的环,但是为了简单起见,大部分我们都会这样描述。

程序中的转换与数据流中的算子通常是一一对应的。然而,有时候,一个转换可能由多个转换算子组成。

3. 并行数据流图

Flink中的程序本质上是分布式并发执行的。在执行过程中,一个流有一个或多个流分区,每个算子有一个或多个算子子任务。算子子任务之间相互独立,并且在不同的线程中执行,甚至有可能在不同的机器或容器上执行。

算子子任务的数量是该特定算子的并发数。流的并发数总是产生它的算子的并发数。同一程序的不同算子可能具有不同的并发级别。

在两个算子之间的流可以以一对一模式或重新分发模式传输数据:

(1) 一对一流(例如上图中的Source和map()算子之间的流)保留了元素的分区和排序。这意味着将会在map()算子的子任务[1]中看到在Source算子的子任务[1]中产生的相同元素,并且具有相同的顺序。

(2) 重分发流(例如上图的的map()keyBy()/window()/apply()之间,以及在keyBy()/window()/apply()Sink之间的数据流)改变了流的分区。每个算子子任务根据所选的转换操作将数据发送到不同的目标子任务。比如keyBy()(根据key的哈希值重新分区),broadcast(),或者rebalance()(随机重新分区)。在重新分配交换中,只会在每对发送与接受子任务(比如,map()的子任务[1]与keyBy()/window()/apply()的子任务[2])中保留元素间的顺序。在上图的例子中,尽管在子任务之间每个 key 的顺序都是确定的,但是由于程序的并发引入了不确定性,最终到达Sink的元素顺序就不能保证与一开始的元素顺序完全一致。

关于配置并发的更多信息可以参阅并发执行文档

4. 窗口

聚合事件(比如计数、求和)在流上的工作方式与批处理不同。比如,不可能对流中的所有元素进行计数,因为通常流是无限的(无界的)。相反,流上的聚合(计数,求和等)需要由窗口来划定范围,比如在最近5分钟内计算,或者对最近100个元素求和

窗口可以是时间驱动的(比如:每30秒)或者数据驱动的(比如:每100个元素)。窗口通常被区分为不同的类型,比如滚动窗口(没有重叠),滑动窗口(有重叠),以及会话窗口(由不活动的间隙所打断)

更多的窗口示例可以在这篇博客中找到。更多详细信息在窗口文档。

5. 时间

当提到流程序(例如定义窗口)中的时间时,你可以参考不同的时间概念:

(1) 事件时间是事件创建的时间。它通常由事件中的时间戳描述,例如附接在生产传感器,或者生产服务。Flink通过时间戳分配器访问事件时间戳。

(2) 摄入时间是事件进入Flink数据流源(source)算子的时间。

(3) 处理事件是每一个执行基于时间操作算子的本地时间。

更多关于如何处理时间的详细信息可以查看事件时间文档.

6. 有状态操作

尽管数据流中的很多操作一次只查看一个独立的事件(比如事件解析器),但是有些操作会记录多个事件间的信息(比如窗口算子)。这些操作被称为有状态的 。

有状态操作的状态保存在一个可被视为嵌入式键值对存储中。状态与由有状态算子读取的流一起被严格地分区与分布(distributed)。因此,只有在应用keyBy()函数之后,才能访问keyed streams上的键/值对状态,并且仅限于与当前事件key相关联的值(access to the key/value state is only possible on keyed streams, after a keyBy() function, and is restricted to the values associated with the current event’s key. )。对齐流和状态的key(Aligning the keys of streams and state)确保了所有状态更新都是本地操作,保证一致性,而没有事务开销(guaranteeing consistency without transaction overhead)。这种对齐还使得Flink可以透明地重新分配状态与调整流的分区。

7. 容错性检查点

Flink组合使用流重放与检查点实现了容错。检查点与每一个输入流以及每一个算子对应的状态所在的特定点相关联(A checkpoint is related to a specific point in each of the input streams along with the corresponding state for each of the operators.)。一个流数据流可以可以从一个检查点恢复出来,其中通过恢复算子状态并从检查点重放事件以保持一致性(一次处理语义)

检查点时间间隔是在恢复时间(需要重放的事件数量)内消除执行过程中容错开销的一种手段。

更多关于检查点与容错的详细信息可以查看容错文档。

8. 批处理操作

Flink将批处理程序作为流处理程序的一种特殊情况来执行,只是流是有界的(有限个元素)。在内部DataSet被视为数据流(A DataSet is treated internally as a stream of data)。因此上述适用于流处理程序的概念同样适用于批处理程序,除了一些例外:

(1) 批处理程序的容错不使用检查点。通过重放全部流来恢复。这是可能的,因为输入是有限的。这使恢复的成本更高(This pushes the cost more towards the recovery),但是使常规处理更便宜,因为它避免了检查点。

(2) DataSet API中的有状态操作使用简化的in-memory/out-of-core数据结构,而不是键/值索引。

(3) DataSet API引入了特殊的同步(基于superstep的)迭代,而这种迭代仅仅能在有界流上执行。详细信息可以查看迭代文档。

原文:https://ci.apache.org/projects/flink/flink-docs-release-1.4/concepts/programming-model.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
全网最详细4W字Flink入门笔记(上)
因为公司用到大数据技术栈的缘故,离线用的是Spark,实时用的是Flink,所以这篇文章是关于Flink的,这篇文章对Flink的相关概念介绍的比较全面,希望对大家学习Flink能有所帮助。
BookSea
2023/10/16
1.7K0
全网最详细4W字Flink入门笔记(上)
Apache Flink:数据流编程模型
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
王小雷
2019/09/18
1.4K0
Apache Flink:数据流编程模型
Flink数据流编程模型
低级处理函数集成了DataStream API,使得它可以在某些特定操作中进入低级抽象层。DataSet API在有限数据集上提供了额外的原语,比如循环/迭代(loops/iterations )。
黑光技术
2019/03/08
1.7K0
全网最详细4W字Flink入门笔记(下)
Flink是一个有状态的流式计算引擎,所以会将中间计算结果(状态)进行保存,默认保存到TaskManager的堆内存中,但是当task挂掉,那么这个task所对应的状态都会被清空,造成了数据丢失,无法保证结果的正确性,哪怕想要得到正确结果,所有数据都要重新计算一遍,效率很低。想要保证 At -least-once 和 Exactly-once,需要把数据状态持久化到更安全的存储介质中,Flink提供了堆内内存、堆外内存、HDFS、RocksDB等存储介质。
BookSea
2023/10/16
9760
全网最详细4W字Flink入门笔记(下)
Flink 极简教程: 架构及原理 Apache Flink® — Stateful Computations over Data Streams
Apache Flink 是一个分布式流计算引擎,用于在无边界和有边界数据流上进行有状态的计算。
一个会写诗的程序员
2022/01/04
3.4K0
Flink 极简教程: 架构及原理 Apache Flink® — Stateful Computations over Data Streams
统一批处理流处理——Flink批流一体实现原理
实现批处理的技术许许多多,从各种关系型数据库的sql处理,到大数据领域的MapReduce,Hive,Spark等等。这些都是处理有限数据流的经典方式。而Flink专注的是无限流处理,那么他是怎么做到批处理的呢?
用户6070864
2019/09/10
4.7K0
统一批处理流处理——Flink批流一体实现原理
五万字 | Flink知识体系保姆级总结
一、Flink简介 二、Flink 部署及启动 三、Flink 运行架构 四、Flink 算子大全 五、流处理中的 Time 与 Window 六、Flink 状态管理 七、Flink 容错 八、Flink SQL 九、Flink CEP 十、Flink CDC 十一、基于 Flink 构建全场景实时数仓 十二、Flink 大厂面试题
五分钟学大数据
2021/09/22
4.6K0
Flink面试通关手册「160题升级版」
主要是当Flink开启Checkpoint的时候,会往Source端插入一条barrir,然后这个barrir随着数据流向一直流动,当流入到一个算子的时候,这个算子就开始制作checkpoint,制作的是从barrir来到之前的时候当前算子的状态,将状态写入状态后端当中。然后将barrir往下流动,当流动到keyby 或者shuffle算子的时候,例如当一个算子的数据,依赖于多个流的时候,这个时候会有barrir对齐,也就是当所有的barrir都来到这个算子的时候进行制作checkpoint,依次进行流动,当流动到sink算子的时候,并且sink算子也制作完成checkpoint会向jobmanager 报告 checkpoint n 制作完成。
大数据真好玩
2021/07/07
2.8K0
Flink吐血总结,学习与面试收藏这一篇就够了!!!
所有的数据都天然带有时间的概念,必然发生在某一个时间点。把事件按照时间顺序排列起来,就形成了一个事件流,也叫作数据流。「无界数据」是持续产生的数据,所以必须持续地处理无界数据流。「有界数据」,就是在一个确定的时间范围内的数据流,有开始有结束,一旦确定了就不会再改变。
大数据老哥
2021/10/11
9220
Flink吐血总结,学习与面试收藏这一篇就够了!!!
万字长文深度解析WordCount,入门Flink,看这一篇就够了!
要想熟练掌握一个大数据框架,仅仅是学习一些网络上的样例程序是远远不够的,我们必须系统地了解它背后的设计和运行原理。
PP鲁
2019/12/26
1.9K0
万字长文深度解析WordCount,入门Flink,看这一篇就够了!
全网第一 | Flink学习面试灵魂40问答案!
Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供了诸多更高抽象层的API以便用户编写分布式任务:
大数据真好玩
2019/09/17
10.6K0
全网第一 | Flink学习面试灵魂40问答案!
全网最详细4W字Flink全面解析与实践(上)
在大数据技术栈的探索中,我们曾讨论了离线计算的Spark,而当谈到实时计算,就不得不提Flink。本文将集中讨论Flink,旨在详尽展示其核心概念,从而助力你在大数据旅程中向前迈进。
BookSea
2023/10/28
1.2K2
全网最详细4W字Flink全面解析与实践(上)
Flink核心概念:系统架构、时间处理、状态与检查点
上图的Flink示例程序对一个数据流做简单处理,整个过程包括了输入(Source)、转换(Transformation)和输出(Sink)。程序由多个DataStream API组成,这些API,又被称为算子 (Operator),共同组成了逻辑视角。在实际执行过程中,逻辑视角会被计算引擎翻译成可并行的物理视角。
PP鲁
2019/12/25
2.3K0
统一批处理流处理——Flink批流一体实现原理
无限流处理:输入数据没有尽头;数据处理从当前或者过去的某一个时间 点开始,持续不停地进行
大数据流动
2019/09/11
4K0
统一批处理流处理——Flink批流一体实现原理
学习Flink,看这篇就够了
批处理在大数据世界有着悠久的历史。早期的大数据处理基本上是批处理的天下。批处理主要操作大容量的静态数据集,并在计算过程完成之后返回结果。所以批处理面对的数据集通常具有以下特征:
saintyyu
2021/11/22
3.2K1
学习Flink,看这篇就够了
Flink入门(四)——编程模型
flink是一款开源的大数据流式处理框架,他可以同时批处理和流处理,具有容错性、高吞吐、低延迟等优势,本文简述flink的编程模型。
大数据流动
2019/12/19
1K0
Flink流式处理概念简介
一,抽象层次 Flink提供不同级别的抽象来开发流/批处理应用程序。 1,stateful streaming 最底层。它通过Process Function嵌入到DataStream API中。它允
Spark学习技巧
2018/01/30
2K0
Flink流式处理概念简介
Flink面试通关手册
2019 年是大数据实时计算领域最不平凡的一年,2019 年 1 月阿里巴巴 Blink (内部的 Flink 分支版本)开源,大数据领域一夜间从 Spark 独步天下走向了两强争霸的时代。Flink 因为其天然的流式计算特性以及强大的处理性能成为炙手可热的大数据处理框架。
大数据真好玩
2019/12/09
1.4K0
Flink面试通关手册
Flink核心概念之有状态的流式处理
虽然数据流中的许多操作一次只查看一个单独的事件(例如事件解析器),但有些操作会记住跨多个事件的信息(例如窗口操作符)。 这些操作称为有状态的。
从大数据到人工智能
2022/01/28
1.2K0
Flink核心概念之有状态的流式处理
Flink1.13架构全集| 一文带你由浅入深精通Flink方方面面(二)
之前所介绍的流处理API,无论是基本的转换、聚合,还是更为复杂的窗口操作,其实都是基于DataStream进行转换的;所以可以统称为DataStream API,这也是Flink编程的核心。而我们知道,为了让代码有更强大的表现力和易用性,Flink本身提供了多层API,DataStream API只是中间的一环,如图所示:
857技术社区
2022/12/18
1.6K0
Flink1.13架构全集| 一文带你由浅入深精通Flink方方面面(二)
相关推荐
全网最详细4W字Flink入门笔记(上)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验