抖音集团 FlinkSQL 性能优化探索及实践
更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群
背景
Engine优化
查询优化
View Reuse
- Multi-sink
- Union all
Remove Redundant Streaming Shuffle
- 对于本身没有数据分布特征的节(如 Calc 和 Correlate Node),判断它们能否满足一个特定数据分布的需求,只需检查自身输入中是否包含 hash key。
- 对于本身有数据分布特征的节点(如 Aggregate 和 Rank nodes),需要确认本身的数据分布特征是否满足给定的 distribution requirements。如下图所示,首先要检查 aggregate 节点是否满足数据分布特征,这需要查看它的输入,即 rank 节点是否满足要求。如果 rank 节点不满足,则需要在其上游添加 exchange 节点。添加后,rank 算子满足了数据分布特征。由于 rank 和 aggregate 的 hashkey 相同,因此 aggreagte 也满足了。
查询执行优化
Streaming MultipleInput Operator
- 首先,在 Planner 层构建出 MultipleInputExecNode。
- MultipleInputExecNode 是在 logical physical 计划后,当 plan 被转换为ExecNode DAG时,从 ExecNodeDAG 中推导而出。获得 ExecNodeDAG 后,先从根节点进行广度优先搜索,从而获取图的拓扑排序。构建 MultipleInputExecNode 是在 Covert ExecNode DAG 环节进行的,完成这一系列操作后,它将在 ExecNode Graph 中构建出来。
- 在生成 StreamMultipleInputExecNode 后,被 translate 成 StreamMultipleInput transformation。
- 在 transformation 中,包含了创建 MultipleInput Operator 的一些信息,通过 TableOperatorWrapper 存储 sub-op 信息。
- 生成 Job Graph。这需要满足以下2个条件:
- StreamConfig 需要兼容 Multiple Input 从 two Input 的 TypeSerializer1,2变成 TypeSerializer[],这主要用于 state/key 数据传输。
- Stream Graph 可以添加 MultipleInputOperator 节点,通过方法 addMultipleInputOperator,将 Transformation 对应的 properties 添加到 vertex 中构成 Stream Graph 中的节点。
- Operator initialization:
- 不只要创建 StreamingMultipleInputOperator,也要创建对应的 sub-op;
- sub-op 本质上是 Abstract StreamOperator,sub-op id = op id + index;
- 在 createAllOperator 创建每个 sub-op 对象,并构建 DAG 的输入输出。
- ProcessElement :
- 处理数据过程中要保证 key 的传递。
- State
- MultipleInputStreamOperato 和 sub-op 分享state handler;
- 创建新的 API stateNameContext 来解决状态名字冲突。
- Timer && Watermark
- MultipleInputStreamOperator和sub-op 分享 timeServiceManager;
- 创建新的 api TimerNameContext来解决状态名字冲突;
- timeServiceManager 以 sub-op粒度管理 timer;
- 使用Combindedwatermark 来保证 Watermark 对齐。
- barrier:此处无需过多考虑,MultipleInput Operator 内部没有 buffer 中的数据,因此按照拓扑顺序进行 checkpoint 不会丢失数据。但需要注意的是,需要将 prepareSnapshotPreBarrier 从 MultipleInputStreamOperator 传播到所有子算子。
Optimization of Long Sliding Windows
- 长滑动窗口及其底层实现逻辑
- 长滑动窗口优化思路
- 在窗口算子中定义全局状态,存储当前窗口的计算结果;
- 在聚合函数中新增 retractMerge 方法,窗口向后滑动时,移除被划走窗口的数据;
- 触发下一次计算时,合并新增窗口的数据。
数据处理(Format侧)
Native Json Format
- 针对 Json 反序列化开销使用支持向量化编程的 c++ json 解析库, 选择字节内部自研的 sonic-cpp,来提高性能。
- 针对序列化为 binaryRowData 的开销使用 native 方法直接产出 BinaryRowData 所需要的二进制表示,再使用 BinaryRowData 指向这一部分数据,从而免去序列化对应的开销。
优化实践
- 工具层
a. 支持 SQL 任务元信息实时上报;
b. 算子粒度离线数仓,提供算子粒度的任务监控;
c. Commits 粒度 DAG 兼容性检查 :可以提前发现哪些优化项会影响任务状态恢复;
d. 优化项分优先级灰度:可以限制风险暴露范围;
e. 数据准确性链路构建:保证了上线优化项不会导致数据准确性发现问题。
- 优化层
- 引擎&平台层
未来展望
抖音集团 FlinkSQL 性能优化探索及实践的更多相关文章
- React 组件性能优化探索实践
转自:http://www.tuicool.com/articles/Ar6Zruq React本身就非常关注性能,其提供的虚拟DOM搭配上Diff算法,实现对DOM操作最小粒度的改变也是非常的高效. ...
- 读<jquery 权威指南>[7]-性能优化与最佳实践
一.优化选择器执行速度 1. 优先使用ID选择器和标记选择器 使用选择器时应该首选ID选择器($("#id")),其次是标记选择器($("div")),最后再选 ...
- 01 性能优化基础怀实践 之 ASH分析
1.模拟一个会话阻塞的场景. 通过update 同一行数据达到模拟阻塞的效果 : SQL> create table t1 (id number ,name varchar2(20)) ; ...
- React 组件性能优化
React组件性能优化 前言 众所周知,浏览器的重绘和重排版(reflows & repaints)(DOM操作都会引起)才是导致网页性能问题的关键.而React虚拟DOM的目的就是为了减少浏 ...
- 如何对react进行性能优化
React本身就非常关注性能,其提供的虚拟DOM搭配上DIff算法,实现对DOM操作最小粒度的改变也是非常高效的,然而其组件的渲染机制,也决定了在对组件更新时还可以进行更细致的优化. react组件 ...
- Sql Server查询性能优化之走出索引的误区
据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...
- 百万并发中间件系统的内核设计看Java并发性能优化
“ 这篇文章,给大家聊聊一个百万级并发的中间件系统的内核代码里的锁性能优化. 很多同学都对Java并发编程很感兴趣,学习了很多相关的技术和知识.比如volatile.Atomic.synchroniz ...
- Mysql数据库调优和性能优化
1. 简介 在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响.MySQL是目前使用最多的开源数据库,但是mysql数据库的默认设置性能非常 ...
- K8S 性能优化 - OS sysctl 调优
前言 K8S 性能优化系列文章,本文为第一篇:OS sysctl 性能优化参数最佳实践. 参数一览 sysctl 调优参数一览 # Kubernetes Settings vm.max_map_cou ...
- 手淘架构组最新实践 | iOS基于静态库插桩的⼆进制重排启动优化 抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15% 编译期插桩
抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15% 原创 Leo 字节跳动技术团队 2019-08-09 https://mp.weixin.qq.com/s/Drmmx5JtjG ...
随机推荐
- Controller-runtime模块
Controller-runtime框架 Controller-runtime是社区提供的用于开发Controller的框架,包含了各种已封装的代码库.Kubebuilder与Operator SDK ...
- ClickHouse介绍(三)MergeTree系列表引擎
MergeTree系列表引擎 ClickHouse中最核心的引擎当属MergeTree系列引擎,其中基础表引擎为MergeTree,常用的表引擎还有ReplacingMergeTree.Summing ...
- 搭建redis-sentinel(哨兵)
1.先创建redis一主两从的配置文件 2.编辑配置文件 cat >> /data/8012/redis.conf <<EOF port 8012 daemonize yes ...
- 三屏异显案例分享,基于全国产RK3568J工业平台!
在工业领域中,能否更灵活.更高效地在主屏幕进行主要任务,并在其他副屏幕上进行其他次要任务(例如查看参考资料.监控其他应用程序),一直都是许多工业领域客户面临的刚需,而"多屏异显"功 ...
- 配置hive环境步骤(zookeeper高可用集群已搭建)
安装mysql:1. 检查当前环境是否安装mysql服务(命令:rpm -qa | grep -i mysql)2. 卸载自带的mysql3. 卸载软件:rpm -e --nodeps mysql-l ...
- 基于Bootstrap Blazor开源的.NET通用后台权限管理系统
前言 今天大姚给大家分享一个基于Bootstrap Blazor开源的.NET通用后台权限管理系统,后台管理页面兼容所有主流浏览器,完全响应式布局(支持电脑.平板.手机等所有主流设备),可切换至 Bl ...
- Linux 命令指南
做这个东西有两个用处,一是初赛会考,二是考场上用 windows 哪里数组越界你都不知道直接 RE 爆炸. sudo -s 输入后填写密码获得管理员权限. cd 打开文件或者目录,用法是 cd 目录名 ...
- Codeforces Round 935 (Div. 3)
A. Setting up Camp 题目描述 The organizing committee plans to take the participants of the Olympiad on a ...
- Java FastJson解析json字符串
json转map Map<String, 实体类> titleMap=JSON.parseObject(JSON字符串, new TypeReference<HashMap<S ...
- C++ Constructor And Destructor
if you have problems with constructors and destructors, you can insert such print statements in cons ...