flink 流批统一优化整理

本文根据的是flink1.12和flink1.13社区文章及分享整理。个人根据社区相关学习理解整理,仅供参考。

流批一体架构

image.png

image.png
image.png
image.png

A.flink 1.11 及之前

  • 统一了Tabel/SQL API & Planner
  • 统一shuffle架构

B.flink1.12

优化总结:
1.DataStreamAPI 批执行模式
2.流批统一Source&Sink API
3.Pipeline Region scheduler

1.DataStream API 批执行模式

背景:flink 中虽然上层Table/Sql已经流批统一,但底层api仍是分开的,DataStream和DataSet。

因为批处理是流处理的特例,所以讲两种合并成统一的API,这样的好处是:

a. 具有好的复用性,作业可以在流和批这两种执行模式之间自由地切换,而无需重写任何代码。因此,用户可以复用同一个作业,来处理实时数据和历史数据。

b.维护简单,统一的 API 意味着流和批可以共用同一组 connector,维护同一套代码,并能够轻松地实现流批混合执行,例如 backfilling 之类的场景。

考虑到这些优点,社区已朝着流批统一的 DataStream API 迈出了第一步:支持高效的批处理(FLIP-134)。

从长远来看,这意味着 DataSet API 将被弃用(FLIP-131),其功能将被包含在 DataStream API 和 Table API / SQL 中。

■ 有限流上的批处理
您已经可以使用 DataStream API 来处理有限流(例如文件)了,但需要注意的是,运行时并不“知道”作业的输入是有限的。为了优化在有限流情况下运行时的执行性能,新的 BATCH 执行模式,对于聚合操作,全部在内存中进行,且使用 sort-based shuffle(FLIP-140)和优化过的调度策略(请参见 Pipelined Region Scheduling 了解更多详细信息)。因此,DataStream API 中的 BATCH 执行模式已经非常接近 Flink 1.12 中 DataSet API 的性能。有关性能的更多详细信息,请查看 FLIP-140。

在 Flink 1.12 中,默认执行模式为 STREAMING,要将作业配置为以 BATCH 模式运行,可以在提交作业的时候,设置参数 execution.runtime-mode:

$ bin/flink run -Dexecution.runtime-mode=BATCH examples/streaming/WordCount.jar

或者通过编程的方式:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setRuntimeMode(RuntimeMode.BATCH); 

2. 流批统一Source & Sink API

  • 1.11版本已经支持了 source connector 工作在流批两种模式下。
    TODO
  • 1.12支持了对Data Sink API的重构。
image.png

现有只支持FileSInkConnector。替换现有的StreamingFileSink Connector。

新的抽象引入了 write/commit 协议和一个更加模块化的接口。Sink 的实现者只需要定义 whathow

SinkWriter,用于写数据,并输出需要 commit 的内容(例如,committables);

Committer 和 GlobalCommitter,封装了如何处理 committables。

框架会负责 whenwhere:即在什么时间,以及在哪些机器或进程中 commit。

3. Pipelined Region 调度 (FLIP-119)

1). 1.12之前方案

(1)前提:两种模式:

a. pipelined result: 数据顺序一个一个的消费

b.blocking result: 在上游所有数据生成完成才开始执行。

(2)版本1.12之前是流批分开的

  • sreaming: (使用的是a方式)
image.png
  • batch: (stage内部使用的是pipelined,stage之间使用的是blocking)

这种方式优点:a.只用调度有数据的stage,所以更高效。 b.stage fail可以单独重启,不需要重新计算其他stage。

image.png

(3) before 1.19 调度策略

统一的调度器需要对每个阶段,包括流处理和批处理,都要好的资源调度。1.12之前采用的是不同的调度策略,分别解决流批问题。

a. “all at once”

立刻执行,用于流处理。对于批处理,立刻执行可能会影响资源利用率,可能导致资源预先分配,等待上游数据而导致资源浪费。

b."lazy from sources"

对于批处理,使用懒加载方式,即input数据准备好之后再分配后续operator的资源。

这个策略独立运行在每个子任务中,所以不会识别同时在运行的所有subtask.

举例:
image.png

A 是批数据,B是流表,C是需要join。

slot=1:B-C chain,那么C因为A未完成而无法执行。flink会尝试部署A,因为没有slot导致job失败。

slot=2:这时可用,flink能部署A,job能成功执行,但是当A在执行的时候,第一个slot会被B和C占用而浪费资源。

失败情况: 如果B→C失败,我们不用再重新执行A,但是1.9之前是不支持的。

社区为支持流批统一,设计了一个统一的调度和失败策略,Pipelined region scheduling.

2). pilelined region scheduling

image.png

新调度策略在开始substask之前,通过分析ExecutionGraph,识别出pipelined region。

region内部使用的是pipelined方式,外部使用的是blocking方式。

(1)调度策略:

在region内,消费者需要不断消费生产的数据,以保证生产者不被block,并且避免背压。因此region的所有子任务必须被调度,失败是整体重启,同时运行。

图中r1→( r2,r3)→ r4,如果jobmanager有足够资源,那么在上游数据finished之后,将尽可能的执行更多的下游region。子任务执行是根据region分配的,要么成功,要么失败。

(2)失败策略

当然子任务失败,那么region重启,重新消费输入数据。如果一些输入数据丢失,那么flink会重新执行上游生产region。

好处:

1.可以在有限资源情况下,尽可能的执行批任务。

2.可以提高资源利用率并消除死锁。

参考:https://flink.apache.org/2020/12/15/pipelined-region-sheduling.html

C. flink1.13

优化总结:
1.大规模作业调度优化
2.sort-Merge Shuffle
3.有限作业一致性保证

1.大规模作业调度

背景:
image.png

由于在创建图的时候,边会存储对象,那么在大规模作业调度时,会占用大量内存。

引入

A. 在ExecutionGraph中有两种,一种是pointwise模式(一对一或一对多),还有一种是alltoall(多堆多)

B. 什么情况是pointwise模式?

partition 分区方式

image.png

参考:区别https://blog.csdn.net/lvwenyuan_1/article/details/103722226

代码中:


forward Edge

ForwardPartitioner 和RescalePartitioner 属于pointwise模式,其他的均属于多对多。

C. 针对这两种方式,将多消费者合成消费组,减少对象创建,将O(n)变成了O(1)


image.png
image.png

2.sort-merge shuffle

中间数据是如何保存和读取的?

在1.10以前实现了统一shuffle机制,参考:https://ververica.cn/developers/shuffle-mechanism/

  1. flink 网络流控和反压机制:https://ververica.cn/developers/advanced-tutorial-2-analysis-of-network-flow-control-and-back-pressure/

背景:
针对批作业,在数据shuffle的优化。
上游跑完写中间文件
节省资源,不需要上游和下游同时起来。
失败不需要重新执行。

image.png

flink 默认的shuffle,给每个下游输出单独文件。

  • 大量小文件
  • 内存浪费,每个文件至少用1个buffer
  • 下游数据读取产生大量随机I/O

新方案:sort shuffle

image.png
  1. 先写缓冲区,把数据按照不同的下游分组,最后写入文件


    image.png

(1)申请固定大小缓冲区,避免缓冲区随着规模增大而增大
(2)数据写入缓冲区,在缓冲区满的时候会对数据进行排序(合并分区),然后写入单独文件。后边数据接着写到文件后边。文件有多个段,每个段内有序。

没有采用外排序,merge不划算。

  1. 下游上层做I/O调度,下游读取是通过一个调度器。


    image.png

    image.png

参考:https://wiki.apache.org/confluence/display/FLINK/FLIP-148%3A+Introduce+Sort-Based+Blocking+Shuffle+to+Flink

3. 有限作业一致性保证

image.png

背景:有限流不能做checkpoint,无法保证一致性。

优化:


image.png

所有subtask结束,只存标记
部分subtask结束,会存储剩下部分的数据。

结束语义整理:
数据有限正常结束
savepoint结束

image.png

endofinput 通知,统一做checkpoint,保证最后数据一定会提交到系统中。

stopwithsavepoint,不同统一做checkpoint,
正常结束,认为任务不再重启,调用endofinput,提交最后数据。
stop-with-savepoint,通过savepoint结束,后期会重启,不会提交最后数据
stop-with-savepoint --drain ,通过savepoint结束,后期不会重启,调用endofinput,提交最后数据。

image.png

参考:https://developer.aliyun.com/live/246712?spm=a2c6h.12873639.0.0.2f9612a824wQIq

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,536评论 28 53
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,187评论 4 8
  • 步骤:发微博01-导航栏内容 -> 发微博02-自定义TextView -> 发微博03-完善TextView和...
    dibadalu阅读 3,134评论 1 3
  • 回这一趟老家,心里多了两个疙瘩。第一是堂姐现在谈了一个有妇之夫,在她的语言中感觉,她不打算跟他有太长远的计划,这让...
    安九阅读 3,502评论 2 4