抖音集团 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 ...
随机推荐
- 为什么不推荐使用Linq?
相信很多.NETer看了标题,都会忍不住好奇,点进来看看,并且顺便准备要喷作者! 这里,首先要申明一下,作者本人也非常喜欢Linq,也在各个项目中常用Linq. 我爱Linq,Linq优雅万岁!!!( ...
- 记录一次EF实体跟踪错误
记录一次EF实体跟踪错误 前言 在我写文章编辑接口的,出现了一个实体跟踪的错误,详情如下 System.InvalidOperationException: The instance of entit ...
- LangGraph实战
1.概述 前段时间LangChain发布了LangGraph,它引起了很多关注.LangGraph 的主要优势在于它能够实现循环工作流,这对于在 LLM 应用程序中模拟类似代理的行为至关重要.本篇博客 ...
- RD/RT格式
一.RD RD长度是8字节,包括Type和Value字段. Type字段:2字节 Value字段:6字节 Type字段的取值决定了Value字段的结构.每种类型的Value字段都由两个部分组成,分别是 ...
- Apline部署K3s的Agent
之前我们在Ubuntu上部署了K3s的Server节点(传送门),这次我们加入两台K3s的Agent节点搭建一个K3s的3节点工作环境. 需要准备好网络环境,确保三台VM之间是可以ping通的,设置好 ...
- TI AM64x开发板规格书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)
1 评估板简介 创龙科技TL64x-EVM是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F多核处理器设计的高性 ...
- Redis常见的16个使用场景
1.缓存 String类型 例如:热点数据缓存(例如报表.明星出轨),对象缓存.全页缓存.可以提升热点数据的访问数据. 2.数据共享分布式 String 类型,因为 Redis 是分布式的独立服务,可 ...
- 【原创软件】第6期:极简SciHub论文下载器
一.背景 因为科研需求下载英文论文,省得自己去找有效的scihub网址,特此写了一个基于c#和wpf的小软件. 二.使用方法 只需要输入doi即可,点击[打开浏览器下载论文]即可跳转浏览器进行下载.下 ...
- PHP中substr() mb_substr() mb_struct()的区别和用法
PHP substr() 函数可以分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mb_substr()/mb_strcut这个函 数,mb_substr() /mb_strcut的 ...
- CF709B 题解
洛谷链接&CF 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定 \(N\) 个点,在一条数轴上,位置为 \(x_1,-,x_n\),你的位置为 \(p\) ...