写Oracle表耗时25分钟缩短到23秒——SeaTunnel性能优化

本文主要给大家介绍JDBC Source批处理任务动态切分优化,希望大家批评指正

JDBC Source 如果配置了table_pathpartition_column,引擎会对数据进行动态切分,可以通过分析样本数据优化切分区间,规避数据倾斜问题。

目前发现任务即使配置了where_condition,动态切分算法仍然会把数据进行全表切分,在从大表中读取少量数据的场景下,任务切分阶段会耗费大量的时间,需要修改下面相关的流程进行优化。

下面所有出现SQL语句的地方均以MySQL为例子进行说明,具体不同的数据源有不同的子类方法overwrite实现。

数据切分主流程

数据动态切分的代码入口位于DynamicChunkSplitter类中的splitTableIntoChunks方法,流程图中标红的方框表示需要修改的部分,详细在下面的子流程中展开说明。

查询最大最小值

需要加上Source的where_condition配置的判断和拼接。

通用字段切分

查询数据总条数部分

(1)增加且where_condition配置为空才走"是"的分支

(2)修改"否"分支,增加where_condition的判断和对应查询语句的拼接,子查询和表查询的规则如下:

  • 如果配置了Query则查询SQL为

    SELECT COUNT(*) FROM (<子查询>) T

  • 否则查询SQL为

    SELECT COUNT(*) FROM <表名>

  • 如果配置了where_condition则拼接到末尾

切分数据区间部分

详情见子流程

分页查询分片

查询下一个分片的结束边界nextChunkEnd

1.max查询部分

判断如果配置了where_condition则在limit那层查询添加条件拼接

2.min查询部分

判断如果配置了where_condition则添加条件拼接

样本查询分片

判断如果配置了where_condition则添加条件拼接

日期字段切分

复用了通用字段切分的1部分,只需修改一次即可。

分片使用流程

这里相关的流程不需要修改,这里分析是为了弄清楚分片是如何被使用的,以评估前面修改的必要性、正确性和风险。

数据被切分为分片后会被分发到Worker的SourceSeaTunnelTask中,最终在JdbcInputFormat类的open方法中被使用,主要流程如下

由上面流程可知,由分片生成的SQL在最后会判断拼接where_condition,如果在生成分片的阶段没有考虑where_condition,则生成的分片中可能有部分分片在追加上where_condition条件限制后查询不到数据,当这样的分片很多时,不但会影响分片切分的性能,也会影响数据读取的性能,因为过程中产生了大量的无效查询。

优化效果

优化之后本地测试从一个55G的MySQL表使用where_condition过滤读取多条数据的耗时从25分钟缩短到23秒

提交的PR链接:https://github.com/apache/seatunnel/pull/8760

相关推荐
ManageEngineITSM20 分钟前
技术的秩序:IT资产与配置管理的现代重构
大数据·运维·数据库·重构·工单系统
档案宝档案管理3 小时前
档案宝:企业合同档案管理的“安全保险箱”与“效率加速器”
大数据·数据库·人工智能·安全·档案·档案管理
wangjialelele3 小时前
mysql库操作二
数据库·mysql
Chloeis Syntax3 小时前
MySQL初阶学习日记(1)--- 数据库的基本操作
数据库·学习·mysql
workflower4 小时前
FDD(Feature Driven Development)特征驱动开发
大数据·数据库·驱动开发·需求分析·个人开发
韩立学长5 小时前
基于Springboot的旧物公益捐赠管理系统3726v22v(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
苦学编程的谢5 小时前
Redis_4_常见命令(完)+认识数据类型和编码方式
数据库·redis·缓存
小光学长5 小时前
基于Vue的儿童手工创意店管理系统as8celp7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
睡前要喝豆奶粉5 小时前
.NET Core Web API开发需引入的三个基本依赖配置说明
oracle·c#·.netcore