1. 程式人生 > 其它 >教你如何將二進位制檔案匯入到資料庫

教你如何將二進位制檔案匯入到資料庫

摘要:使用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級數倉黑科技,後臺還可獲取眾多學習資料~

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