Flink Mailbox模型
Flink在1.10版本中完成了对StreamTask的运行机制进行了重构,引入了Mailbox机制。本文对这次改动做了哪些修改,以及对比之前的实现有哪些好处进行一些简要的介绍。
通过MailBoxProcessor优先处理特殊事件(checkpoint,窗口的timer),以及处理InputChannel中的数据
Flink线程模型的变化
flink之前是通过一个CheckPointLock加锁来实现多线程之间的互斥操作,之后引入Actor模型的mailbox机制来取代现有的多线程模型。变为了单线程(mailboxprocessor)+阻塞队列(mailbox)的形式。flink重构核心线程模型,所有算子的Task都是StreamTask,Source算子由于历史原因是SourceStreamTask(兼容的核心思想是以两个不同的线程来独立运行,SourceFunction对应的事件生成在一个线程上,而Mailbox是另一个线程,并且两者以检查点锁来保持互斥)
这样针对遗留的Source循环还是以独立的一套机制运行,而绝大部分算子的task则运行在mailbox线程上。
个人理解:mailbox是task级别的,每个task都有一个mailboxprocessor线程处理特殊事件和inputChannel数据
Flink处理模型
Flink将任务代码转换为DAG后,每个节点有各自的并发度p,节点间依靠网络传输消息。每个Task的每个并发都是独立的线程,可以简单的理解为
class Task implements Runnable {public void run() {while(true) {// 从输入缓冲区中读取数据,经过处理逻辑后继续写到输出缓冲区processInput();}}
}
但是除了常规的处理逻辑,还有其他线程可能会访问Task线程数据,比如
- checkpoint:checkpoint的同步阶段
- processTimeTimer:timer触发时,比如窗口结束触发计算就是使用timer实现(eventTimeTimer由watermark消息触发,所以包含在Task线程中)
- Async IO:异步IO在结果返回时
上面这些逻辑需要与Task线程的处理逻辑互斥,否则就可能会有并发问题,造成数据错乱。最简单的解决办法就是-加锁,在Flink-1.10以前也是这么做的。
Before 1.10
每个Task都有一把锁,名曰checkpointLock
,对于所有互斥操作都需要抢到锁后再进行处理。这样虽然看起来简单方便,但也造成了很多问题…
checkpointLock
四处乱飞,可读性较差,对Flink开发人员不够友好。- 在
SourceContext
中将checkpointLock直接暴露给用户代码,造成了一定的不稳定性。如果没有正确处理好,可能无法保证"exactly-once"语义。
Flink-1.10: mailbox-based approach
如果能将互斥的操作全部放在同一个线程中执行,是不是就不需要加锁了,天然串行执行。
所以在1.10版本中引入了Mailbox机制,外层抽象为类型Executor
的接口,所有的互斥操作全部作为Runnable
提交到MailboxExecutor
,构建为Mail
后加入Mailbox
队列,MailboxProcessor
在Task-Thread中运行,主要分为3种情况
- 有特殊事件,即Mailbox不为空,优先处理完特殊事件。主要有checkpoint、timer
- 无特殊事件且有network.buffer不为空,执行processInput处理数据
- 无事可做,执行await等待唤醒
调用关系图
MailboxProcessor主要逻辑
while (processMail(localMailbox)) {mailboxDefaultAction.runDefaultAction(); //defaultAction == processInput
}
唤醒机制
在很多时刻,Mailbox
队列中没有待处理事件,且没有数据流入,这时线程会进入等待,这里使用了ReentrantLock.newCondition().await()/signal()
替代了Object.wait()/notify()
。
在Mailbox加入新任务时,执行signal()
唤醒线程继续处理。如果有新的输入数据时,会在Mailbox中加入一类特殊的ControlMail,不执行具体逻辑,目的是为了唤醒线程继续工作。
这样可以保证可以在第一时间响应且不会浪费资源。
不足之处:LegacySourceFunction
原本API中的SourceFunction
只提供了run方法,即Task-Thread永远在SourceFunction.run()
内部死循环,这与现在的Mailbox机制不能很好的融合。现在暂时对SourceTask进行了兼容,每个SourceTask包含两个线程,一个运行MailboxProcessor,另一个执行SourceFunction,通过对关键操作加锁保证逻辑正确。
我们可以做些什么
在引入Mailbox机制后,所有的任务逻辑都会收敛在Task-Thread中执行,也就是MailboxProcessor
,lock不会堆外暴露(现阶段SourceFunction除外)。只需要记录MailboxProcessor中实际运行时间的占比(即除去await时间),就可以作为Task的负载指标,越接近1时代表已经接近处理能力的极限,需要对任务进行扩容。
这样相比阶段使用bufferpool指标进行判断,会更加直观,而且在机器资源充足的情况下,负载与流量基本是线性的关系,对配置优化更有知道意义。
Flink Mailbox模型相关推荐
- Flink内存模型、网络缓冲器、内存调优、故障排除
Flink内存模型.网络缓冲器.内存调优.故障排除 1 JVM 1.1 JVM 数据运行区 1.2 堆内内存(on-heap memory) 1.3 GC 算法 1.4 堆外内存(off-heap m ...
- linux创建mbox设备,Linux运维知识之linux mailbox模型
本文主要向大家介绍了Linux运维知识之linux mailbox模型,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 一.device tree中的写法 二. mailbox框 ...
- 学习笔记Flink(二)—— Flink数据流模型、时间窗口和核心概念
一.Flink编程数据流模型 1.1.Flink – API封装 Flink 提供不同级别的API封装来支持流/批处理应用程序. 1.2.Flink-编程数据流 Source:一个不会结束的数据记录流 ...
- linux mailbox模型
一.device tree中的写法 二. mailbox框架 (driver/mailbox/mailbox.c) struct mbox_controller {struct device *dev ...
- linux创建mbox设备,linux mailbox模型
一.device tree中的写法 二. mailbox框架 (driver/mailbox/mailbox.c) structmbox_controller {struct device *dev; ...
- 【Flink】Flink 源码阅读笔记(20)- Flink 基于 Mailbox 的线程模型
1.概述 转载:Flink 源码阅读笔记(20)- Flink 基于 Mailbox 的线程模型 相似文章:[Flink]Flink 基于 MailBox 实现的 StreamTask 线程模型 Fl ...
- 【Flink】Flink 基于 MailBox 实现的 StreamTask 线程模型
1.概述 转载:Flink 基于 MailBox 实现的 StreamTask 线程模型 先来给介绍一下目前 StreamTask 中基于 MailBox 实现的线程模型,这个模型从 1.9 开始实现 ...
- flink checkpoint 恢复_Flink断点恢复机制
作为流式计算,Flink通过checkpoint机制和kafka的可回溯性来保证作业在failover时不丢失状态. 作为生产环境的flink,我们期待做到快速failover.弹性扩缩容和平滑迁移, ...
- 2021年大数据Flink(二十五):Flink 状态管理
目录 Flink-状态管理 Flink中的有状态计算 无状态计算和有状态计算 无状态计算 有状态计算 有状态计算的场景 状态的分类 Managed State & Raw State Keye ...
最新文章
- 我,14岁初中生,从零开始拿到了Kaggle竞赛冠军
- 你的火狐很慢吗? - Firefox启动和运行速度优化
- mysql 二十条记录_记 MySQL优化 20条
- u盘插入linux系统没有反应_linux系统无法挂载U盘
- 内容分发网络 CDN 是如何提高网页加载时间的?
- BugkuCTF-Crypto题贝斯家
- 1.3编程基础之算术表达式与顺序执行 19 AXB问题
- 如何在C / C ++中使用continue语句
- 【车牌识别】基于matlab投影模板匹配车牌识别【含Matlab源码 1359期】
- JavaScript学习指南(非常详细)
- LoadRunner压力测试:测试报告结果分析
- 正逆运动学解(三维)
- 初学者之路—————Cycle GAN
- 传美团支付无证经营被央行叫停 限期三个月整改
- 从输入网址到收到响应的详细过程
- 树选择排序(Tree Selection Sorting)介绍
- 【OpenCV】Linux 下用 g++ 编译 OpenCV 程序
- 惯性导航原理(1):导航坐标系及相互转换
- 为何TCP/IP协议栈设计成沙漏型的
- 使用NCBI数据库查询并使用BLAST比对新冠病毒及九种变种的核酸序列