教你如何將二進位制檔案匯入到資料庫
摘要:使用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級數倉黑科技,後臺還可獲取眾多學習資料~