三歪第402篇原创文章
作者:三歪
本文已收录至我的GitHub
最近一直在迁移Flink
相关的工程,期间也踩了些坑,checkpoint
和反压
是其中的一个。
![49fdbd09265fd7f92f5cb13cf9e3715e.png](https://i-blog.csdnimg.cn/blog_migrate/e143352abcebd8dd26c22705a7a98ac3.jpeg)
敖丙太菜了,Flink
都不会,只能我自己来了。
看敖丙只能图一乐,学技术还是得看三歪
平时敖丙黑我都没啥水平,拿点简单的东西来就说我不会,麻烦专业点@敖丙。
今天来分享一下 Flink
的checkpoint
机制和背压
原理,我相信通过这篇文章,大家在玩Flink
的时候可以更加深刻地了解Checkpoint
是怎么实现的,并且在设置相关参数以及使用的时候可以更加地得心应手。
上一篇已经写过Flink
的入门教程了,如果还不了解Flink
的同学可以先去看看:《Flink入门教程》
前排提醒,本文基于Flink 1.7
《浅入浅出学习Flink的背压知识》
开胃菜
在讲解Flink
的checkPoint
和背压
机制之前,我们先来看下checkpoint
和背压
的相关基础,有助于后面的理解。
作为用户,我们写好Flink
的程序,上管理平台提交,Flink
就跑起来了(只要程序代码没有问题),细节对用户都是屏蔽的。
![02e3cf576db46ea25e1f088fa929c81d.png](https://i-blog.csdnimg.cn/blog_migrate/16671b5a68f8a973d16c694f9f7d4529.jpeg)
实际上大致的流程是这样的:
Flink
会根据我们所写代码,会生成一个StreamGraph
的图出来,来代表我们所写程序的拓扑结构。- 然后在提交的之前会将
StreamGraph
这个图优化一把(可以合并的任务进行合并),变成JobGraph
- 将
JobGraph
提交给JobManager
JobManager
收到之后JobGraph
之后会根据JobGraph
生成ExecutionGraph
(ExecutionGraph
是JobGraph
的并行化版本)TaskManager
接收到任务之后会将ExecutionGraph
生成为真正的物理执行图
![87f29812525c47b048770165fe315d75.png](https://i-blog.csdnimg.cn/blog_migrate/a7e77c70cf671faf04c0f49e75f7e974.jpeg)
可以看到物理执行图
真正运行在TaskManager
上Transform
和Sink
之间都会有ResultPartition
和InputGate
这俩个组件,ResultPartition
用来发送数据,而InputGate
用来接收数据。
![fef6616e133445851fc5beba63998914.png](https://i-blog.csdnimg.cn/blog_migrate/8c62cd8fec1eb92b59447a7568e53000.jpeg)
屏蔽掉这些Graph
,可以发现Flink
的架构是:Client
->JobManager
->TaskManager
![abd341495e5b7c443096420cd140b8cc.png](https://i-blog.csdnimg.cn/blog_migrate/b6ab8a72f4b3d28df6b6be771dd96a8c.jpeg)
从名字就可以看出,JobManager
是干「管理」,而TaskManager
是真正干活的。回到我们今天的主题,checkpoint
就是由JobManager
发出。
![5292770d965957d9db2a763ac1ceb1a3.png](https://i-blog.csdnimg.cn/blog_migrate/076fe4ac73ed197ab81157d6b5a7dffb.jpeg)
而Flink
本身就是有状态的,Flink
可以让你选择执行过程中的数据保存在哪里,目前有三个地方,在Flink
的角度称作State Backends
:
- MemoryStateBackend(内存)
- FsStateBackend(文件系统,一般是HSFS)
- RocksDBStateBackend(RocksDB数据库)
同样的,checkpoint
信息也是保存在State Backends
上
![47b6aa386d29686d0ac07a1ca0c03b5d.png](https://i-blog.csdnimg.cn/blog_migrate/793199ec46c9569d069ae30bed37cab6.jpeg)
耗子屎
最近在Storm
迁移Flink
的时候遇到个问题,我来简单描述一下背景。
我们从各个数据源从清洗出数据,借助Flink
清洗,组装成一个宽模型,最后交由kylin
做近实时数据统计和展示,供运营实时查看。
![b463621115d26b80902c5f34765440c8.png](https://i-blog.csdnimg.cn/blog_migrate/5d8aeed6030689ffcb6912f9b8921df6.jpeg)
迁移的过程中,发现订单的topic
消费延迟了好久,初步怀疑是因为订单上游的并发度
不够所影响的,所以调整了两端的并行度重新发布一把。
发布的过程中,系统起来以后,再去看topic
消费延迟的监控,就懵逼了。什么?怎么这么久了啊?丝毫没有降下去的意思。
这时候只能找组内的大神去寻求帮忙了,他排查一番后表示:这checkpoint
一直没做上