Flink 六脉神剑秘诀
Flink是什么?
Flink是一款实时计算框架,能够实现ms级别甚至更低的延时计算(流式处理 -- 有状态的计算处理),不少同学肯定会提及spark streaming(可认为是批处理,类似Hive -- 无状态计算;这几个框架只能做到准实时,ms级别的延时是达不到要求)。当然,如果你对延时容忍度高,那么可以选择这两个框架
最具代表性的使用场景:阿里双11大屏交易总金额的实时刷新
Flink如何实现流式处理?
对于批处理而言,当前提条件限制之后,数据的输入是固定的;并且,在执行一次计算计划的时候,要么全部成功或者失败。
对于流处理而言,数据如流水一般由源头奔涌向下。那么通过什么准则去如何去抽取、约定你需要的数据呢?-----时间。更重要的是,由于流式计算中间也会遇到宕机、数据处理失败等等问题,时间点也能作为恢复范围点重要参考
在Flink中有三个时间定义
- Event time:事件本身发生的时间,与flink引擎无关。例如:用户在某个时刻下单一个商品,订单产生时间是事件时间
- Processing Time:Flink处理数据时间
- Ingestion Time:进入Flink框架时间。例如:订单产生在9:00,那么9:00是Event time;数据在9:00 30s时进入flink中(如果有较大延时),那么9:00 30s这个时刻是Ingestion Time,然后数据在9:01被计算,9:01是Processing Time
Flink如何应对延时?
- 延时产生原因:网络抖动、计算资源不够等一系列的原因,会导致在整个流处理过程中有较大的延时
- 延时影响:可能导致部分计算结果不准确
- 例如:我们用长度为1h 的时间窗口 计算 9:00 -- 10:00 交易累计金额。在9:59 40s的时候确实产生了一条交易数据,那么该条数据的事件时间是 9:59 40s。由于延时的问题,导致该条数据在 10:01 才被Flink读取,因此该数据未能被计算(不在9:00 -10:00 窗口范围内);一般在流计算的时候会进行批计算,在核对结果的时候就会发现总金额少了 9:59 40s 这份数据
- 如何处理延时:watermark (水位)
- watermark:基于event time,告诉窗口函数,可能有数据还没有来,你再等一等执行计算
- watermark影响:但是watermark设置的越大,会带来更大的延时,效果会越准确(最后可理解为转成了批处理?) ,具体根据业务场景来
- 处理延时:在进行计算之前,设置一个水位点,例如设置2min。还是看上面的例子,假如不设水位那么 9:59 40s 的数据必然会丢,那么设置会怎么样呢?
- 设置2min之后,在10:00 窗口触发时间,窗口函数不会立马触发,而是会再等 2min,等到10:02触发窗口计算。然后看这两分钟内是否还会有event time 在窗口内的数据(这段话细品、你细品)。因此,尽管9:59 40s 延时到 10:01 ,但是10:01 < 10:02 因此该条数据不会丢
Flink窗口函数(主要讲复杂事件处理cep)
- 滑动窗口
- 滚动窗口
- 会话窗口
- cep机制(Complex event processing) -- 复杂事件处理:可认为是一种为事件窗
- cep与前面三个窗口的区别在于:前面三个窗口是基于时间来处理流数据,而cep是根据事件定义来处理流数据。前面三个可以自行csdn 或者百度,都比较好理解,接下来主要讲cep
- cep如何工作?
- 举个例子:你开车从 A -> B点,然后你要计算这段行程中发生了哪些不良驾驶行为,如急加速、减速等(如果有埋点数据次采集的话)。但是在这里你用不了时间窗口进行聚合累加,因为你不知道 A->B点得用多久,不同人也不一样。为什么cep可以?因为cep可以将一个事件流定义为一个窗口,如A->B,点火可以认为是行程开始,熄火可以认为是行程的结束,(这里不是很严谨,肯定有很多爱开车的同学要跟我杠了,为什么不是从刷卡开始//手动狗头)
- cep 完整定义
- 事件开始
- 中间事件
- 事件结束
- 通过上面事件定义,能够将一个事件流从数据流从以窗口的方式剥离出来
Flink容错
由于Flink是流式计算,整个计算过程不断持续,区别于批计算(无状态计算 --- 错了整段重跑一次)。对于Flink而言,是增量计算,不可能全部重跑。一般都是在某个时间范围内重跑,那么就需要两个条件。1、出错的时间点,也就是你需要重跑的时间点 2、当时的计算状态(state)
- 针对重跑时间
- 为了保证数据的正确性,可以选择在出错时间点更提前的位置进行重跑(比如10点的时候数据报错,你可以选择在9点进行重跑),付出的代价就是需要去追数据。因为现在可能是下午3点了,你从上午9点跑,这期间的数据都会被刷新一次,所以会考验资源的一个配置,如果资源配置过低,很可能追不上现阶段的数据,造成大延时。如果是追数据的话,建议整个资源配比调高一点
- 针对计算状态(这里面的东西很多)
- 为什么需要state,像之前提到的,Flink是增量计算,因此需要保存在计算过程中节点的中间计算结果或者元数据属性,这两块统称为state。State可以分类两大类
- keyState:进行group by的字段
- operatorState:读取数据流的offest,类似于kafka消息队列位移
- 为什么需要state,像之前提到的,Flink是增量计算,因此需要保存在计算过程中节点的中间计算结果或者元数据属性,这两块统称为state。State可以分类两大类
有了状态跟时间,那么Flink是怎么进行容错处理的呢?下面我们仔细介绍
- 首先对于每个增量计算过程中,需要有快照保存类似timer、connector、window、state等信息 --- 该部分可以理解为信息保存,也就是Checkpoint -- 检查点
- 既然有了检查点,如何实现呢?
- 由于Flink的语法会被抽象为DAG(有向无环图),在次过程中,由source端会下发一个叫barrier的数据标志
- barrier会将source下发的数据,分到不同的checkpoint中
- 如果是exactly_once语义,那么会需要进行barrier对齐,保证结果一致性
- 对齐之后进行checkpoint,生成snapshot,进行持久化存储
- 完成snapshot之后,下发barrier直至sink,表明此次快照结束
- 针对Checkpoint而言,有两种模式
- at_least_once语义:即事件消息至少被消费一次
- 对于 at_least_once,消息在经过各个operator时,不会进行堵塞,而是来了一份数据消费一份,进行快照
- exactly_once语义:事件消息仅被消费一次
- 对于消费一次而言,当其他barrier在算子端未对齐的时候,消息不被消费,而是被缓存进barrierbuff,等到barrier对齐之后,数据从barrierbuff中被消费,因此该语义也会造成比较大的延时
- at_least_once语义:即事件消息至少被消费一次
- 当任务在某个点fail之后,我们进行重启,比如我们重启9点的数据,进行计算,但是在flink内部,如果9点没有相应的checkpoint,那么会向前找最近的一个点,比如8.59分这种
Flink查询
- 对于流计算而言,数据查询是动态的,是持续查询。原因是因为每个时刻数据内容都在发生改变,那么流数据是如何做到结果一致性的呢?
- 接下来我们以Mysql的存储过程举例,说明Flink的持续查询是如何实现
- Mysql的任何操作都会被记录在binlog中,将binlog转为中继日志可以实现备份的功能。我们也可以利用该日志来模型持续查询
- 我们可以写一个触发器,一旦有新的数据进来之后,就进行查询。然后通过一条条的数据插入,对应会有一次次的查询结果
- 对于无PK(主键)的表而言,事实上实现的是append
- 对于有PK的表而言,实现的是update,但是Mysql
- 需要注意:Mysql实现的是全量查询,而在Flink中实现的是增量查询Flink的持续查询也可以这样理解,当有一条数据来的时候Flink会进行一次查询,数据流源源不断,查询结果也会不断刷新,这个过程就是Flink的持续查询
Flink中文文档
https://flink.apachecn.org/#/
后续会更新flink的相关优化技巧,毕竟未来流是主要方向
Flink 六脉神剑秘诀相关推荐
- 融合趋势下基于 Flink Kylin Hudi 湖仓一体的大数据生态体系
简介:本文由 T3 出行大数据平台负责人杨华和资深大数据平台开发工程师王祥虎介绍 Flink.Kylin 和 Hudi 湖仓一体的大数据生态体系以及在 T3 的相关应用场景. 本文由 T3 出行大数据 ...
- 如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(3)
前文回顾: 如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1) 如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2) 目录 秘诀一:拿捏SQL引擎 openGau ...
- flink生产环境参数配置
1.flink生产环境配置 2.flink 可配置参数 2.1常用选项 键 默认 描述 jobmanager.heap.size 1024MB JobManager的JVM堆大小. taskmanag ...
- 大数据处理架构演进历程,文末留言有机会获取Flink图书
关注 iteblog_hadoop 公众号并在本文末评论区留言(认真写评论,增加上榜的机会).留言点赞数排名前6名的粉丝,各免费赠送一本<深入理解Flink - 实时大数据处理实战>,活动 ...
- hadoop,spark,scala,flink 大数据分布式系统汇总
20220314 https://shimo.im/docs/YcPW8YY3T6dT86dV/read 尚硅谷大数据文档资料 iceberg相当于对hive的读写,starrocks相当于对mysq ...
- 2021年大数据Flink(四十八):扩展阅读 Streaming File Sink
目录 扩展阅读 Streaming File Sink 介绍 场景描述 Bucket和SubTask.PartFile 案例演示 扩展阅读 配置详解 PartFile PartFile序列化编码 ...
- 2021年大数据Flink(四十六):扩展阅读 异步IO
目录 扩展阅读 异步IO 介绍 异步IO操作的需求 使用Aysnc I/O的前提条件 Async I/O API 案例演示 扩展阅读 原理深入 AsyncDataStream 消息的顺序性 扩展阅读 ...
- 2021年大数据Flink(四十五):扩展阅读 双流Join
目录 扩展阅读 双流Join 介绍 Window Join Interval Join 代码演示1 代码演示2 重点注意 扩展阅读 双流Join 介绍 https:// ...
- 2021年大数据Flink(四十四):扩展阅读 End-to-End Exactly-Once
目录 扩展阅读 End-to-End Exactly-Once 流处理的数据处理语义 At-most-once-最多一次 At-least-once-至少一次 Exactly-once-精确一次 En ...
最新文章
- java nio channel原理_Java NIO 选择器(Selector)与通道(Channel) 原理 | 学步园
- [原创] nunit2report V1.2.2 release 汉化修正版 V1.0
- python莫比乌斯_莫比乌斯函数 - osc_7eqzxl4g的个人空间 - OSCHINA - 中文开源技术交流社区...
- 自动计算请假工时 排除周六周日
- 洛谷——P1067 多项式输出
- LeetCode 315. 计算右侧小于当前元素的个数(二叉查找树二分查找归并排序逆序数总结)
- python前端开发招聘_[昆明] EMQX 招聘 Python ,前端开发工程师
- spark第十篇:Spark与Kafka整合
- java中将一个字符数组赋值给另一个,两者同时变化
- 动态图php打不开,PHP如何判断一个gif图片是否为动态图片
- 下载外网资源慢的解决办法
- 计算机毕业论文房地产营销,万科集团四季花城房地产营销策略研究(毕业论文)...
- 【Linux服务器运行jar包】
- i5 6600 HD530联想扬天S5250黑苹果
- sd卡格式化后还能恢复吗?恢复小技巧分享!
- C语言中取整数的几种方法
- 20189220余超 2019年密码与安全新技术讲座-课程总结报告
- 跟主页劫持的浏览器再见了,被恶意劫持修改方法!
- mppdb 查看建表语句_内存MPP数据库介绍.pptx
- 命令行把java项目打成jar包
热门文章
- Centos7安装Nessus教程
- 【数据结构】【期末复习】知识点总结
- 多线程06-(sdwebimage 总结3)
- PHP解决微信昵称带有表情
- 【数据库】MySQL中的锁机制
- Java项目:超市购物商城管理系统(java+SSM+JSP+jQuery+Mysql)
- [报错]执行npm install.报If you are behind a proxy,please make sure that the proxy cinfig is set property.
- Jmeter获取当前时间、历史时间、未来时间的方式
- android opengl es 2.0 编程指南,Android OpenGL ES 2.0 初次体验
- iMobile for ReactNative入门使用介绍