TiDB 7.5.0 LTS 高性能数据批处理方案

过去,TiDB 由于不支持存储过程、大事务的使用也存在一些限制,使得在 TiDB 上进行一些复杂的数据批量处理变得比较复杂。

TiDB 在面向这种超大规模数据的批处理场景,其能力也一直在演进,其复杂度也变得越来越低:

○ 从 TiDB 5.0 开始,TiFlash 支持 MPP 并行计算能力,在大批量数据上进行聚合、关联的查询性能有了极大的提升

○ 到了 TiDB 6.1 版本,引入了 BATCH DML ( https://docs.pingcap.com/zh/tidb/stable/non-transactional-dml ) 功能,该功能可以将一个大事务自动拆成多个批次去处理,在单表基础上进行大批量更新、删除、写入时能够大幅提升处理效率,同时避免了大事务所产生的一些影响。

○ 而到了 7.1 LTS 版本,正式 GA 了 TiFlash 查询结果物化 ( https://docs.pingcap.com/zh/tidb/stable/tiflash-results-materialization#tiflash-查询结果物化 ) 的功能,使得 insert/replace into ... select ... 这种操作中的复杂 select 能够利用 TiFlash MPP 并行处理的能力,大幅提升了这种操作的处理性能。

○ 前不久刚发布的 7.5 LTS,正式 GA 了一个 IMPORT INTO ( https://docs.pingcap.com/zh/tidb/stable/sql-statement-import-into#import-into ) 的功能,该功能将原本 tidb-lightning 的物理导入能力集成到 TiDB 计算节点上,使用一条 SQL 语句就可以完成大批量数据的导入,大幅简化了超大规模数据写入时的复杂度。

TiDB 上之前有哪些批处理方案

  1. INSERT INTO ... SELECT 完成查询和写入

● 现状:适用于小批量数据处理,性能较高

● 挑战:大批量数据写入时,会产生大事务,消耗内存较高

 说明:写入+单表查询场景可使用 BATCH DML 功能自动拆批

  1. 针对 INSERT INTO/INSERT INTO ... ON DUPLICATE .../REPLACE INTO 这些 SQL 使用批量接口执行,降低应用与数据库之间的交互次数,提升批量写入时的性能

● 现状:在合适的拆批方案、表结构设计上,处理性能非常高

● 挑战:编码不合理、表结构设计不合理时,可能会遇到热点问题,导致性能不佳

  1. 通过 ETL 和调度平台提供的数据读取和写入能力实现大批量数据的处理

● 现状:主流的 ETL 平台,如 datax、spark、kettle 等,在合理表结构设计时,性能也比较高

● 挑战:多线程并行写入时,也有可能会遇到热点问题

  1. 针对上游传过来的 csv 文件的数据,使用 LOAD DATA 来完成批量数据的写入,提升批量写入时的性能

● 现状:在对文件进行拆分+多线程并行后,处理性能非常高

● 挑战:当 LOAD DATA 一个大文件时此时是大事务,导致性能不佳;多线程处理时也有可能遇到热点问题,导致性能不佳

针对以上几种批处理方案,以及最新推出的 IMPORT INTO 功能,我们开展了一次测试,探索哪种批处理方案效率最高,消耗资源更低,以及使用上更加简单。

TiDB 中不同批处理方案的测试

1 测试环境

  1. TiDB 资源:3 台 16VC/64GB 虚拟机 + 500GB SSD 云盘(3500 IOPS + 250MB/S 读写带宽)

a. TiDB 版本:TiDB V7.5.0 LTS

b. TiDB 组件:TiDB/PD/TiKV/TiFlash(混合部署)

  1. 存储资源:8C/64GB 虚拟机 + 500GB SSD 云盘(3500 IOPS + 250MB/S 读写带宽)

● 存储服务:NFS 服务、Minio 对象存储

  1. 测试资源:8C/64GB 虚拟机 + 500GB SSD 云盘(3500 IOPS + 250MB/S 读写带宽)

● datax + Dolphin 调度/java 程序/dumpling、tidb-lightning 工具以及 MySQL 客户端

2 测试场景

将大批量查询结果快速写入到目标表,既考验查询性能,同时也考验批量写入的性能。

2.1 查询部分:多表关联+聚合

基于 TPCH 100GB 数据,扩展 Q10 查询中的字段和查询范围,返回 8344700 行数据。

select  c_custkey,c_name,sum(l_extendedprice * (1 - l_discount)) as revenue,
        c_acctbal,n_name,c_address,c_phone,c_comment,min(C_MKTSEGMENT),min(L_PARTKEY), 
        min(L_SUPPKEY,min(L_LINENUMBER),min(L_QUANTITY), max(L_TAX), max(L_LINESTATUS), 
        min(L_SHIPDATE), min(L_COMMITDATE), min(L_RECEIPTDATE), min(L_SHIPINSTRUCT), 
        max(L_SHIPMODE), max(O_ORDERSTATUS), min(O_TOTALPRICE), min(O_ORDERDATE), 
        max(O_ORDERPRIORITY), min(O_CLERK), max(O_SHIPPRIORITY), 
        @@hostname as etl_host,current_user() as etl_user,current_date() as etl_date
from
        tpch.customer,tpch.orders,tpch.lineitem,tpch.nation
where
        c_custkey = o_custkey and l_orderkey = o_orderkey
        and o_orderdate >= date '1993-10-01' and o_orderdate < date '1994-10-01'
        and l_returnflag = 'R' and c_nationkey = n_nationkey
group by
        c_custkey,c_name,c_acctbal,c_phone,n_name,c_address,c_comment
order by c_custkey;

源表数据量

2.2 写入:29 列,1 个主键+2 个索引

CREATE TABLE `tpch_q10` (
  `c_custkey` bigint(20) NOT NULL,
  `c_name` varchar(25) DEFAULT NULL,
  `revenue` decimal(15,4) DEFAULT NULL,
   ...
  `etl_host` varchar(64) DEFAULT NULL,
  `etl_user` varchar(64) DEFAULT NULL,
  `etl_date` date DEFAULT NULL,
  PRIMARY KEY (`c_custkey`) /*T![clustered_index] CLUSTERED */,
  KEY `idx_orderdate` (`o_orderdate`),
  KEY `idx_phone` (`c_phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

3 测试结果

4 测试分析

4.1 JAVA 程序使用 SQL 进行批处理

使用 JAVA 处理时,StreamingResult 流式读取+多并发写入方式能够获得非常好的性能。 强烈不建议使用 limit 分页这种形式拆批 ,这种逻辑数据库将执行 844 条查询 SQL,效率极低,消耗的资源极高。同时 StreamingResult 这种流式读取还可以使用于数据导出的场景,对比使用 limit 分页处理,效率也更高。

在程序 4 中,将原本查询 SQL 里的 order by c_custkey 换成了 order by revenue desc 后,对性能也有一定影响,原因主要是多线程写入时 RPC 开销严重放大。

在程序 5 中,将原本查询 SQL 中的 c_phone 换成 '132-0399-0111' as c_phone,模拟索引热点。

4.2 LOAD DATA 方式

如果使用 LOAD DATA 要获得比较高的性能,建议对单个文件进行拆分,同时 csv 中文件的顺序建议与目标表主键顺序一致,如一个 CSV 文件存储 20000 行,再通过多线程并行来写入,此时写入性能也比较高。

如果仅 LOAD DATA 导入单个大文件,那么性能较低,且消耗内存较高。

4.3 ETL+调度平台方式

 作业类型:datax(mysqlreader + mysqlwriter),简单,效率一般

调度平台执行 datax 作业:使用 mysqlreader 方式读取时,默认就使用流式读取,但是对于多表查询的 query 时,写入时无法并发

 作业类型:shell + datax(txtfileread + mysqlwriter),较复杂,效率较高

 调度平台执行 shell:使用 dumpling 导出成多个 csv 文件

 再调度 datax 作业:使用 txtfilereader + mysqlwriter,此时可以多线程并发写入,效率较高

 作业类型:**SQL,简单高效**

 调度平台执行 SQL:select ... into outfile

 调度平台执行 SQL:import into

4.4 SELECT ... INTO OUTFILE 导出查询结果(当前仅支持导出到文件系统)

该功能大家平时可能使用比较少,但该功能非常有价值,它可以高效的将数据一批导出、并且数据是完全一致的状态,可以用于:

a. 批量数据处理:JAVA 程序可直接执行该 SQL 完成结果的导出

b. 在简单的数据导出场景,使用导出 csv 替换原本 limit 处理逻辑,应用将查询结果导出到一个共享 NFS/S3 对象存储中,再读取 NFS/S3 对象存储中的 CSV,进行结果的处理,极大的降低了数据库的压力,同时性能将比之前使用 limit 分批处理更高。

4.5 IMPORT INTO 导入 CSV(当前支持 S3 协议对象存储以及文件系统)

该功能 7.5.0 引入,极大的简化了数据导入的难度,JAVA 程序可直接执行该 SQL 完成 CSV 数据的导入,在进行批处理时应用节点几乎不需要消耗 CPU/内存资源。以下是使用示例:

IMPORT INTO test.tpch_q10 FROM '/mnt/nfs/test.tpch_q10.csv' with FIELDS_TERMINATED_BY='\t',split_file,thread=8;

需要注意的是:IMPORT INTO 导入过程中,不会产生日志,所以针对需要 CDC 同步或 Kafka 分发的场景,该方案不适用。

5 测试小结

部分测试代码示例 : https://github.com/Bowen-Tang/batch-samples

总结与展望

TiDB 7.5.0 引入的 IMPORT INTO 功能,结合 SELECT ... INTO OUTFILE、以及 NFS/对象存储,让 TiDB 上增加了一种更加简单且非常高效的批处理方案,JAVA 应用程序处理时更加简单,ETL 调度也更简单。

以下是 TiDB 使用 IMPORT INTO、SELECT ... INTO OUTFILE 的架构示例:

I MPORT INTO 功能当前仅支持 CSV 导入,未来 TiDB 8.x 版本中 IMPORT INTO 将直接集成 IMPORT INTO ... SELECT ... 功能,极致简化批处理操作,性能也更进一步提升(187 秒),敬请大家期待 :

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/396858.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker环境常用容器安装

目录 1.安装partainer 2.安装myql 3.安装redis 4.安装Minio 5.安装zibkin 6.安装nacos 7.安装RabbitMq 8.安装RocketMq 8.1启动service 8.2修改对应配置 8.3启动broker 8.4启动控制台 9.安装sentinel 10.安装elasticsearch 11.安装Kibana 12.安装logstash/file…

python遍历键值对kw.items()、 kw.keys()、 kw.values()、enumerate(kw.keys())

代码如下&#xff1a; 运行报错如下&#xff1a; 我想要的输出结果为&#xff1a; 这里引用一段解释&#xff1a; 示例代码中 “for key,value in kw:” 其实是遍历 keys() 但是用了两个参数来接收&#xff0c;所以会报错 “ValueError: too many values to unpack”&#xff…

MySQL5.7.24解压版安装教程

一、MySQL5.7.24解压版安装步骤 1.在指定目录下解压压缩包。比如在D:\Program Files\mysql下解压 2.在D:\Program Files\mysql\mysql-5.7.24-winx64目录下新建data文件夹&#xff0c;如果此目录下没有my.ini也需要手动创建 3.my.ini 文件配置内容如下 [mysqld] # 设置3306端口…

南京哪家证券公司融资融券利率最低?两融利率最低多少?4.5%

融资融券利率 融资融券利率最低是4.5%&#xff0c;市场上两融利率的最低标准&#xff0c;只有个别券商可以办理做到&#xff0c;无门槛利率5%&#xff0c;量大4.5%~4.8%&#xff01; 市场上的融资融券利率差异是较大的&#xff0c;平均利率水平在6%左右&#xff0c;最低利率4…

MySQL环境搭建

目录 一、MySQL安装完成特征 二、MySQL的卸载 三、MySQL安装 四、安装失败原因 五、MySQL的登录 5.1 服务的启动与停止 5.2 登录服务器 六、MySQL的基本操作 七、MySQL图形化管理工具 八、MySQL目录结构 九、常见问题解决 十、总结 一、MySQL安装完成特征 安装好D…

Redis第一关之常规用法

简介 Redis不用多说&#xff0c;已经火了很多年了&#xff0c;也用了很多年了。现在做一些归纳总结。 这篇文章主要介绍Redis的常规知识及用法&#xff0c;包括数据结构、使用场景、特性、过期机制、持久化机制。 Redis与Mysql Mysql是一款基于磁盘的关系型SQL数据库。 Redi…

Debezium发布历史139

原文地址&#xff1a; https://debezium.io/blog/2023/02/04/ddd-aggregates-via-cdc-cqrs-pipeline-using-kafka-and-debezium/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. DDD Aggregates via CDC-CQRS Pi…

MySQL--SQL解析顺序

前言&#xff1a; 一直是想知道一条SQL语句是怎么被执行的&#xff0c;它执行的顺序是怎样的&#xff0c;然后查看总结各方资料&#xff0c;就有了下面这一篇博文了。 本文将从MySQL总体架构—>查询执行流程—>语句执行顺序来探讨一下其中的知识。 一、MySQL架构总览&a…

使用kubeadm快速部署一个k8s集群

前言 此文所使用服务的环境为&#xff1a; docker 版本&#xff1a; v25.0.3 kubernetes版本&#xff1a;v1.25.0 1 安装准备 部署k8s集群的节点按照用途可以分为如下2类角色 master&#xff1a;集群的master节点&#xff0c;集群的初始化节点slave&#xff1a; 集群的slave节…

【力扣白嫖日记】1873.计算特殊奖金

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1873.计算特殊奖金 表&#xff1a;Employees 列名类型employee_idintnamevarcharsalaryint employee_id 是…

展示用HTML编写的个人简历信息

展示用HTML编写的个人简历信息 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document…

Soul CEO张璐引领社交创新,拓展年轻人的社交体验

随着互联网的迅速崛起,社交方式已经历了翻天覆地的变化,年轻人们对社交的需求也愈发多样化。在这个充满创新和竞争的社交领域,新型开放式社交平台Soul App 在CEO张璐的带领下一直在不断探索和引领着新的方向,以满足年轻一代的社交需求,为他们打造了一个全新、自由、创新的社交平…

PostgreSQL使用session_exec和file_fdw实现失败次数锁定用户策略

使用session_exec 、file_fdw以及自定义函数实现该功能。 缺陷&#xff1a;实测发现锁用户后&#xff0c;进去解锁特定用户。只能允许一次登陆&#xff0c;应该再次登陆的时候&#xff0c;触发函数&#xff0c;把之前的日志里的错误登陆的信息也计算到登录次数里了。而且foreig…

《英伟达-本地AI》--NVIDIA Chat with RTX-本机部署

阿丹&#xff1a; 突然发现公司给配置的电脑是NVIDIA RTX 4060的显卡&#xff0c;这不搞一搞本地部署的大模型玩一玩&#xff1f;&#xff1f;&#xff1f; 从0-》1记录一下本地部署的全过程。 本地模型下载地址&#xff1a; Build a Custom LLM with Chat With RTX | NVIDIA…

「Java同步原理与底层实现解析」

原理概要&#xff1a; java虚拟机中的同步基于进入与结束Monitor对象实现&#xff0c;无论是显式同步&#xff08;同步代码块进入在jvm是根据monitorenter标志、结束是monitorexit标志&#xff0c;那最后一个是monitorexit是异常结束时被执行的释放指令&#xff09;、隐式同步…

Codeforces Round 926(Div.2) A~F

A.Sasha and the Beautiful Array&#xff08;递推&#xff09; 题意&#xff1a; 萨沙决定送给女友一个数组 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1​,a2​,…,an​。他发现女友会将数组的美丽度评估为所有从 2 2 2到 n n n的整数 i i i的 ( a i − a i − 1 ) (a_i−…

探索虚拟世界的程序员之路

计算机专业必看的几部电影 计算机专业必看的几部电影&#xff0c;就像一场精彩的编程盛宴&#xff01;《黑客帝国》让你穿越虚拟世界&#xff0c;感受高科技的魅力&#xff1b;《社交网络》揭示了互联网巨头的创业之路&#xff0c;《源代码》带你穿越时间解救世界&#xff0c;…

好书推荐丨《细说机器学习:从理论到实践》

文章目录 写在前面机器学习推荐图书内容简介编辑推荐作者简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家推荐一本有关机器学习的全新正版书籍&#xff0c;对机器学习、人工智能感兴趣的小伙伴们快来看看吧~ 机器学习 机器学习&#xff08;Machine Learning, ML&…

Elasticsearch查询报错 Result window is too large

一现象&#xff1a; es数据分页查询前端提示系统异常&#xff0c;后端报错日志 二根本原因&#xff1a; 默认情况下&#xff0c;Elasticsearch 限制了 from size 参数的组合不能超过 10,000 条记录&#xff0c;用于防止查询大数据集时对系统资源的过度消耗 三解决办法&#…

MySQL 基础知识(十)之 MySQL 架构

目录 1 MySQL 架构说明 2 连接层 3 核心业务层 3.1 查询缓存 3.2 解析器 3.3 优化器 3.4 执行器 4 存储引擎层 5 参考文档 1 MySQL 架构说明 下图是 MySQL 5.7 及其之前版本的逻辑架构示意图 MySQL 架构大致可分为以下三层&#xff1a; 连接层&#xff1a;负责跟客户…