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
fromtpch.customer,tpch.orders,tpch.lineitem,tpch.nation
wherec_custkey = o_custkey and l_orderkey = o_orderkeyand o_orderdate >= date '1993-10-01' and o_orderdate < date '1994-10-01'and l_returnflag = 'R' and c_nationkey = n_nationkey
group byc_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 秒),敬請大家期待 :

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697356.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697356.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697356.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

11.CSS3的媒介(media)查詢

CSS3 的媒介(media)查詢 經典真題 如何使用媒體查詢實現視口寬度大于 320px 小于 640px 時 div 元素寬度變成 30% 媒體查詢 媒體查詢英文全稱 Media Query&#xff0c;顧名思義就是會查詢用戶所使用的媒體或者媒介。 在現在&#xff0c;網頁的瀏覽終端是越來越多了。用戶可…

C++:string類

標準庫中的string類 string類 1. 字符串是表示字符序列的類 2. 標準的字符串類提供了對此類對象的支持&#xff0c;其接口類似于標準字符容器的接口&#xff0c;但添加了專門用于操作單字節字符字符串的設計特性。 3. string類是使用char(即作為它的字符類型&#xff0c;使用…

ChatGPT 是什么

文章目錄 一、ChatGPT 是什么二、ChatGPT的發明者三、ChatGPT的運作方式四、ChatGPT的技術五、ChatGPT的優勢六、ChatGPT的局限性七、ChatGPT的應用八、ChatGPT的未來九、總結 一、ChatGPT 是什么 OpenAI的ChatGPT&#xff0c;即Chat Generative Pre-Trained Transformer&…

3個精美的wordpress企業網站模板

WordPress企業網站模板 https://www.zhanyes.com/qiye/6305.html WordPress企業官網模板 https://www.zhanyes.com/qiye/6309.html WordPress律師模板 https://www.zhanyes.com/qiye/23.html

SQL注入漏洞解析--less-2

首先我們進入第二關 思路&#xff1a; 1.先判斷是什么類型的注入 2.根據類型我們在找注入點 步驟&#xff1a; 1.提示我們輸入id數字&#xff0c;那我們先輸入1猜一下 2.這里正常回顯&#xff0c;當我們后邊加上時可以看到報錯&#xff0c;且報錯信息看不到數字&#xff0…

輕松掌握opencv的8種圖像變換

文章目錄 opencv的8種圖像變換1. 圖像放大、縮小2. 圖像平移3. 圖像旋轉4. 圖像仿射變換5. 圖像裁剪6. 圖像的位運算&#xff08;AND, OR, XOR&#xff09;7. 圖像的分離和融合8. 圖像的顏色空間 opencv的8種圖像變換 1. 圖像放大、縮小 我們先看下原圖 import cv2 import ma…

C++面試:程序的編譯與運行

程序的編譯和運行是軟件開發中的基本環節&#xff0c;尤其是在使用編譯型語言&#xff08;如C/C、Java等&#xff09;進行開發時。這個過程涉及將人類可讀的源代碼轉換成機器能夠執行的指令&#xff0c;然后運行這些指令來完成既定的任務。下面是這一過程的詳細介紹&#xff0c…

基于java+springboot+vue實現的美食信息推薦系統(文末源碼+Lw)23-170

1 摘 要 使用舊方法對美食信息推薦系統的信息進行系統化管理已經不再讓人們信賴了&#xff0c;把現在的網絡信息技術運用在美食信息推薦系統的管理上面可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不能及時糾正等問題。這次開發…

Shell好用的工具: cut

目標 使用cut可以切割提取指定列\字符\字節的數據 介紹 cut 譯為“剪切, 切割” , 是一個強大文本處理工具&#xff0c;它可以將文本按列進行劃分的文本處理。cut命令逐行讀入文本&#xff0c;然后按列劃分字段并進行提取、輸出等操作。 語法 cut [options] filename opti…

樹中枝繁葉茂:探索 B+ 樹、B 樹、二叉樹、紅黑樹和跳表的世界

歡迎來到我的博客&#xff0c;代碼的世界里&#xff0c;每一行都是一個故事 樹中枝繁葉茂&#xff1a;探索 B 樹、B 樹、二叉樹、紅黑樹和跳表的世界 前言B樹和B樹B樹&#xff08;Binary Tree&#xff09;&#xff1a;B樹&#xff08;B Plus Tree&#xff09;&#xff1a;應用場…

Cobra在ubuntu中設置自動補全

Cobra在ubuntu中設置自動補全 yourprogram指的是你程序&#xff0c;并且必須是使用了Cobra cli bash設置 $ source <(yourprogram completion bash)$ yourprogram completion bash > /etc/bash_completion.d/yourprogramzsh設置 $ echo "autoload -U compinit; …

Linux之用戶和用戶組用戶賬號系統文件

一、簡介 1.用戶的定義 在linux系統中用戶&#xff08;User&#xff09;需要用用戶賬號來訪問系統&#xff0c;服務和信息&#xff0c;系統中的每個進程&#xff08;運行的程序&#xff09;都是使用一個特定的用戶運行。每個文件都屬于一個特定的用戶所有。對文件和目錄的訪…

STM32Cubemx TB6612直流電機驅動

一、TB6612FNG TB6612是一個支持雙電機的驅動模塊&#xff0c;支持PWM調速。PWMA、AIN1、AIN2 為一組控制引腳&#xff0c;PWMA 為 PWM 速度控制引腳&#xff0c;AIN1、AIN2 為方向控制引腳&#xff1b;PWMB、BIN1、BIN2 為一組控制引腳&#xff0c;PWMB 為 PWM 速度控制引腳&…

【力扣hot100】刷題筆記Day11

前言 科研不順啊......又不想搞了&#xff0c;隨便弄弄吧&#xff0c;多花點時間刷題&#xff0c;今天開啟二叉樹&#xff01; 94. 二叉樹的中序遍歷 - 力扣&#xff08;LeetCode&#xff09; 遞歸 # 最簡單遞歸 class Solution:def inorderTraversal(self, root: TreeNode) …

idea運行項目時右下角彈出“Lombok requires enabled annotation processing”

文章目錄 錯誤描述原因分析解決方式參考 錯誤描述 Lombok requires enabled annotation processing&#xff1a;翻譯過來就是Lombok 需要啟用注釋處理 原因分析 idea安裝了Lombok插件&#xff0c;但有些設置未做。 解決方式 參考 idea配置和使用Lombok

全文搜索的工作原理講解

Elasticsearch全文搜索是一種強大的搜索技術&#xff0c;它基于Lucene構建&#xff0c;能夠處理大規模數據集&#xff0c;提供快速、準確的搜索結果。要充分利用Elasticsearch的全文搜索能力&#xff0c;關鍵在于理解和應用其核心組件&#xff1a;分詞&#xff08;Tokenization…

【FPGA】高云FPGA之數字鐘實驗->HC595驅動數碼管

高云FPGA之IP核的使用 1、設計定義2、設計輸入2.1 數碼管譯碼顯示2.2 74HC595驅動2.3 主模塊設計 3、分析和綜合4、功能仿真6.1 hex8模塊仿真6.2 HC595模塊 5、布局布線6、時序仿真7、IO分配以及配置文件&#xff08;bit流文件&#xff09;的生成8、配置&#xff08;燒錄&#…

代碼檢測規范和git提交規范

摘要&#xff1a;之前開發的項目&#xff0c;代碼檢測和提交規范都是已經配置好的&#xff0c;最近自己新建的項目就記錄下相關配置過程。 1. ESlint配置 2013年6月創建開源項目&#xff0c;提供一個插件化的JavaScript代碼檢測工具&#xff0c;創建項目是生成的eslintrc.js文…

【算法分析與設計】

&#x1f4dd;個人主頁&#xff1a;五敷有你 &#x1f525;系列專欄&#xff1a;算法分析與設計 ??穩中求進&#xff0c;曬太陽 題目 編寫一個函數&#xff0c;輸入是一個無符號整數&#xff08;以二進制串的形式&#xff09;&#xff0c;返回其二進制表達式中數字位…

如何使用Express框架構建一個簡單的Web應用

在這個數字化時代&#xff0c;Web應用的需求越來越多樣化和復雜化。在前端開發領域&#xff0c;Express框架作為一個快速、靈活的Node.js Web應用程序框架&#xff0c;擁有強大的功能和豐富的生態系統&#xff0c;深受開發者們的青睞。本篇博客將帶您一步步探索如何使用Express…