教你如何將二進制文件導入到數據庫


摘要:使用copymanager接口,讀取二進制文件流,將二進制文件中的數據導入到數據庫中。

本文分享自華為雲社區《從二進制文件導入到GaussDB(DWS)》,作者:你怎么這么好看。

1.1 現網業務場景

源數據推送二進制流-->解析二進制-->解析后的數據導入數據庫

為了模擬生產的業務場景,客戶提供了一個二進制文件及二進制文件的解析程序,需要我們解析二進制文件后導入數據庫。

1.2 測試方案

由於客戶給出的解析程序是單條解析,為了提升數據導入的性能,需要微批導入的方式,在內存中積攢一定量的數據后,再調用copymanager接口導入數據庫中。最終測試方案的整體流程如下所示:

1.3 測試過程

從上圖可以看出,一批數據的耗時由三部分組成:

  • 解析二進制文件
  • 積攢一批數據
  • 數據導入數據庫

1)解析二進制文件

這是客戶提供的Java程序,按行讀取二進制文件中的數據,每行解析成一個String對象。

2)積攢數據

積攢的數據最終是要通過copymanager接口導入數據庫中的,因此其對象類型需要是copymanager接口可以調用的。從下圖中可以看出,其對象類型為InputSream。

初步采用的解決方案是將解析后的String對象拼接起來,然后在copymanager接口中將String轉為InputStream。在測試過程中發現,由於String類型在處理這種大對象的時候效率較低隨着積攢數據的增多,這部分耗時越來越久,因此,最終方案是將解析后的數據存放到StringBuffer對象中。

3)調用copymanager接口

在Java中引用GaussDB(DWS)安裝包中的JDBC驅動后,需要import CopyManager及BaseConnection

import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;

在創建copymanager對象的時候,需要將Connection對象轉為BaseConnection,如下所示:

CopyManager copyManager = new CopyManager((BaseConnection)conn);

1.4 測試結果

在單連接的情況下,解析+入庫可處理10.1W/S,導入性能可達到64.5W/S;

在255並發情況下,解析+入庫可處理1252.1 W/S,導入性能可達到4132.4W/S。

1.5 總結

  • 在本地執行測試代碼

在本地用idle調試中需要一個二進制文件,可以從客戶給出的文件中執行head –n 1000 ***.dat>1.dat 截取一部分文件內容放在本地。

  • 各個時間收集

為了更好的給客戶展現我們數據庫的強大性能,需要把數據庫導入的時間單獨列出來,給客戶一個更加直觀的感受。

  • 高並發的設計

首先,將並發程序布置在集群外的服務器上, 然后為了避免單盤IO性能瓶頸,在每塊盤上存放一份數據文件及解析程序。由於是把一批數據積攢到內存中的,因此在啟動並發時需要注意內存的使用情況。

在客戶端服務器並發75、內存已經飽和的情況下,查看集群的cpu及內存使用率仍然不高,因此,在集群內部的所有節點上每個增加30並發,達到最大並發數。

注意事項:

  • JDBC連接時,把所有並發平均分配到各個CN節點上;
  • 集群內部節點JDBC連接時可能會報gss錯誤,需要修改conf配置文件,將本地ip的連接方式由gss改為sha256。

想了解GuassDB(DWS)更多信息,歡迎微信搜索“GaussDB DWS”關注微信公眾號,和您分享最新最全的PB級數倉黑科技,后台還可獲取眾多學習資料~

 

點擊關注,第一時間了解華為雲新鮮技術~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM