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