分享

彻底明白Flink系统学习4:功能点介绍

问题导读
1.为什么说Flink是高性能?
2.什么是Flink状态计算?
3.Flink如何实现容错的?
4.Flink为何要内存管理?
5.Flink中流处理和批处理的关系是什么?

关注最新经典文章,欢迎关注公众号


上一篇:
彻底明白Flink系统学习3:编程知识之Flink程序结构
http://www.aboutyun.com/forum.php?mod=viewthread&tid=26371


在前面的部分中,我们尝试了解Flink体系结构及其执行模型。 由于其强大的架构,Flink充满了各种功能。如下:

  • 高性能
  • Exactly-once状态计算
  • 灵活的流窗口
  • 容错
  • 内存管理
  • 优化
  • 平台中流和批处理
  • Libraries
  • 事件时间语义


1.高性能
Flink旨在实现高性能和低延迟。 与其他流式框架(如Spark)不同,你无需执行许多手动配置即可获得最佳性能。 Flink的流水线数据处理与同类产品相比具有更好的性能。

为什么说是高性能?
更高的性能Flink体现在什么地方?大家看懂下面,这样无论你是面试,还是懂原理,都能有一个很好的了解和回答
如下代码:
[codeDataStream<String> data = env.addSource(...);
data.map(x->new Tuple2(x,1)).keyBy(0).timeWindow(Time.seconds(60)).sum(1).addSink(...)
][/code]
Flink会将程序中每一个算子解析成Operator,然后按照算子之间的关系,将operator组合起来,形成一个Operator组合成的Graph。如下面的代码解析之后形成的执行计划。


1.png
图1.0

解析形成执行计划之后,JobClient的任务还没有完,还负责执行计划的优化,这里执行的主要优化是将相邻的Operator融合,形成OperatorChain,因为Flink是分布式运行的,程序中每一个算子,在实际执行中被分隔为多个SubTask,数据流在算子之间的流动,就对应到SubTask之间的数据传递,SubTask之间进行数据传递模式有两种一种是one-to-one的,数据不需要重新分布,也就是数据不需要经过IO,节点本地就能完成,比如上图中的source到map,一种是re-distributed,数据需要通过shuffle过程重新分区,需要经过IO,比如上图中的map到keyBy。显然re-distributed这种模式更加浪费时间,同时影响整个Job的性能。所以,Flink为了提高性能,将one-to-one关系的前后两类subtask,融合形成一个task。而TaskManager中一个task运行一个独立的线程中,同一个线程中的SubTask进行数据传递,不需要经过IO,不需要经过序列化,直接发送数据对象到下一个SubTask,性能得到提升,除此之外,subTask的融合可以减少task的数量,提高taskManager的资源利用率。图1.0中的执行计划,优化结果如下图,Flink的subTask融合规则可以参考官方文档。


  • 值得注意的是,并不是每一个SubTask都可以被融合,对于不能融合的SubTask会独立形成一个Task运行在TaskManager中。
  • 改变operator的并行度,可能会导致不同的优化结果,同时这也是性能调优的一个重要方式,例如不显式设置operator的并行度的时候,默认所有算子的并行度是一样的,所以会有下图中的优化结果。


2.png


2.Exactly-once状态计算
正如我们在前面讨论的那样,Flink的分布式检查点处理有助于保证每个记录只处理一次。 在高吞吐量应用的情况下,Flink为我们提供了一个允许至少一次处理的开关。
这里面比较难以理解的是:什么是状态计算?什么是状态?
下面解说或许对你有所帮助
有状态的函数和操作在处理各个元素或者事件时存储数据,使得state称为任何类型的复杂操作的关键构建部件,例如:
当一个应用程序搜索某些特定的事件模式时,状态会保存截止到目前为止遇到过的事件的顺序;
当通过数据点来训练机器学习模型时,状态会保存当前版本的模型参数。为了使state容错,Flink需要识别state并checkpoint它, 在许多情况下,Flink还管理着应用程序的状态,这意味着Flink处理内存管理(如果需要,可能会将内存中的数据溢出到磁盘)来保存非常大的state。

上面事件的顺序对于状态的理解是非常重要的,我们知道传统数据库存储的是数据,而非状态,也就是说对于数据到达的先后顺序,数据库中你是看不出来的。而对于Flink则会记录这些内容。


如果上面你还没有理解,这里在引用下面内容:
什么是State(状态)?
某task/operator在某时刻的一个中间结果
快照(shapshot)
在flink中状态可以理解为一种数据结构
举例
对输入源为<key,value>的数据,计算其中某key的最大值,如果使用HashMap,也可以进行计算,但是每次都需要重新遍历,使用状态的话,可以获取最近的一次计算结果,减少了系统的计算次数
程序一旦crash,恢复
程序扩容

状态相关文章推荐
Flink状态流处理:State Backends三种方式详解
http://www.aboutyun.com/forum.php?mod=viewthread&tid=26230


3.容错
Flink的分布式轻量级快照机制有助于实现高度的容错能力。 它允许Flink提供高吞吐量的性能和有保证的交付。Flink的容错,是需要快照的,如果这里不理解,可倒回去看
Flink实时性、容错机制、窗口等介绍
http://www.aboutyun.com/forum.php?mod=viewthread&tid=25540


4.内存管理
Flink在JVM中提供了自己的内存管理,使其独立于Java的默认垃圾收集器。 它通过使用散列,索引,缓存和排序有效地进行内存管理。

首先我们需要想到为什么要内存管理?
我们都知道Flink是用Java和Scala开发,那么它肯定要使用JVM,那么比如Spark也有内存管理,为何不直接使用JVM那?那么JVM肯定有自己的问题,比如
1.JVM的OOM问题
2.Full GC
3.Java对象存储密度低

那么Flink是如何内存管理的那?
1.flink的内存划分
2.flink使用堆外内存
3.flink量身打造序列化方案
4.flink采用数据和引用分开存储的方式操作数据
至于想了解更多,推荐参考

Flink内存管理
http://www.aboutyun.com/home.php?mod=space&uid=61&do=blog&id=3656

5.优化
Flink的批处理数据处理API经过优化,以避免消耗内存,排序等操作。 它还确保使用缓存以避免繁重的磁盘IO操作。
Flink的优化其实也是非常多的,如同Spark、hive优化,网上的资料也挺多,这里只说其中一些比如1.使用Flink Tuples
2.复用Flink对象
3.使用注解功能
4.Select Join Type
更多可参考
https://blog.csdn.net/dev_csdn/article/details/78330867

6.平台流处理和批处理
Flink为批处理和流数据处理提供API。 因此,一旦设置了Flink环境,它就可以轻松地托管流和批处理应用程序。 事实上,Flink在Streaming第一原理上工作,并将批处理视为流的特殊情况。
注解:
这里面需要说明的是Flink为什么称之为终极流式框架,原因就在于这里,它统一了流处理和批处理。它认为批处理是流处理的一个特殊情况。始终认为数据是流式的。对于数据的划分,Flink把数据分为有界数据和无界数据,二者对应批处理和流处理。

7.Libraries
Flink拥有丰富的库来进行机器学习,图形处理,关系数据处理等。 由于其架构,很容易执行复杂的事件处理和警报。 在后续章节中看到有关这些库的更多信息。这里Flink其实跟Spark一样有各种组件。后续我们继续学习。

8.事件时间语义
Flink支持事件时间语义。 这有助于处理事件无序到达的流。 有时事件可能会延迟。 Flink的架构允许我们根据time,counts和sessions定义窗口,这有助于处理这些场景。

对于Flink窗口大家可参考
Flink实时性、容错机制、窗口等介绍
http://www.aboutyun.com/forum.php?mod=viewthread&tid=25540




参考链接:
https://blog.csdn.net/sxiaobei/article/details/80861070
https://www.jianshu.com/p/e9a330399b30
https://www.jianshu.com/p/ba22be0dc7ca

本帖被以下淘专辑推荐:

已有(8)人评论

跳转到指定楼层
jiangzi 发表于 2018-11-23 11:23:08
link系统学习4:功能点~
回复

使用道具 举报

xiaobaiyang 发表于 2018-11-27 09:44:52

flink系统学习4:功能点~
回复

使用道具 举报

linux_oracle 发表于 2018-11-27 11:19:34
flink系统学习4:功能点~
回复

使用道具 举报

wx_rB9jY0e0 发表于 2019-2-15 17:48:59
p哥,我看到文章里高性能那里只说了一下One-To-One的优化,即SubTask合并,减少数据传输。但是没有提到Shuffle的优化,Flink没有针对Shuffle内置的优化策略吗?
回复

使用道具 举报

若无梦何远方 发表于 2019-8-21 16:57:58
wx_rB9jY0e0 发表于 2019-2-15 17:48
p哥,我看到文章里高性能那里只说了一下One-To-One的优化,即SubTask合并,减少数据传输。但是没有提到Shuf ...

没有Shuffer把 JObManager直接将任务发送给TaskSolt  TastSolt中的Task是可以共享JVm的
回复

使用道具 举报

金瞳 发表于 2019-12-9 18:24:28
1.为什么说Flink是高性能?
- dataFlow:Operator -> OperatorChain-> JobGraph
- State:状态的保存,增量checkpoint
- Memory:自己管理内存,减少GC次数和时间

2.什么是Flink状态计算?
- 某task/operator在某时刻的一个中间结果,可以通过状态累加,和排序等操作
- 可以存储状态进行恢复

3.Flink如何实现容错的?
- checkpoint,错误就从已经完成的checkpoint恢复状态数据

4.Flink为何要内存管理?
- 避免JVM的内存缺点(OOM,Full GC,对象密度低)
- 二进制操作更高效,缓存操作更友好

5.Flink中流处理和批处理的关系是什么?
- 批处理视为流的特殊情况,批是有界数据,流是无界数据
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条