SequoiaDB 一款自研金融級分布式資料庫產品,支持標準SQL和分布式事務功能、支持複雜索引查詢,兼容 MySQL、PGSQL、SparkSQL等SQL訪問方式。SequoiaDB 在分布式存儲功能上,較一般的大數據產品提供更多的數據切分規則,包括:水平切分、範圍切分、主子表切分和多維切分方式,用戶可以根據不用的場景選擇相應的切分方式,以提高系統的存儲能力和操作性能。
為了能夠提供簡單便捷的數據遷移和導入功能,同時更方便地與傳統資料庫在數據層進行對接,巨杉資料庫支持多種方式的數據導入,用戶可以根據自身需求選擇最適合的方式加載數據。
本文主要介紹巨杉資料庫集中常見的高性能數據導入方法,其中包括巨杉工具矩陣中的 Sdbimprt導入工具,以及使用SparkSQL, MySQL和原生API 接口進行數據導入,一共四種方式。
Sdbimprt工具導入
sdbimprt 是 SequoiaDB 的數據導入工具,是巨杉資料庫工具矩陣中重要組成之一,它可以將 JSON 格式或 CSV 格式的數據導入到 SequoiaDB 資料庫中。
http://doc.sequoiadb.com/cn/sequoiadb-cat_id-1479195620-edition_id-0。
一、示例
下面簡單介紹一下如何使用 sdbimprt 工具將 csv 文件導入到 SequoiaDB 集合空間 site 的集合 user_info 中:
1. 數據文件名稱為「user.csv」,內容如下:
「Jack」,18,」China」
「Mike」,20,」USA」
2.導入命令
sdbimprt --hosts=localhost:11810 --type=csv --file=user.csv -c site -l user_info --fields='name string default "Anonymous", age int, country'
--hosts:指定主機地址(hostname:svcname)--type:導入數據格式,可以是csv或json--file:要導入的數據文件名稱-c(--csname):集合空間的名字-l(--clname):集合的名字--fields:指定導入數據的欄位名、類型、默認值
二、導入性能優化
下面說明使用 sdbimprt 工具時如何提升導入性能:
1. 使用 --hosts 指定多個節點
導入數據時,儘量指定多個 coord 節點的地址,用「,」分隔多個地址,sdbimprt 工具會把數據隨機發到不同機器上的 coord,起到負載均衡的作用(如圖1)。
2. 使用 --insertnum(-n) 參數
在導入數據時,使用 --insertnum(-n) 參數,可以實現批量導入,減少數據發送時的網絡交互的次數,從而加快數據導入速度。取值範圍為1~100000,默認值為100。
3. 使用 --jobs(-j) 參數
指定導入連接數(每個連接一個線程),從而實現多線程導入。
4. 切分文件
sdbimprt 在導入數據時支持多線程並發導入,但讀數據時是單線程讀取,隨著導入線程數的增加,數據讀取就成為了性能瓶頸。這種情況下,可以將一個大的數據文件切分成若干個小文件,然後每個小文件對應啟動一個 sdbimprt 進程並發導入,從而提升導入性能。如果集群內有多個協調節點,分布在不同的機器上,那麼可以在多臺機器上分別啟動 sdbimprt 進程,並且每個 sdbimprt 連接機器本地的協調節點,這樣數據發送給協調節點時避免了網絡傳輸(如圖2)。
5. 數據加載完後再建索引
對於導入數據量大,且索引多的表,建議先把索引刪除,待到數據導入完成後再重建索引,這樣有利於加快數據導入。在數據導入的過程中,如果目標表存在大量的索引,資料庫除了寫入數據外,還需要寫入索引文件,這會降低導入數據的性能。此方式對提升其它方式的數據導入速度同樣適用。
SparkSQL 導入
SparkSQL 可以方便的讀取多種數據源,通過 SequoiaDB 提供的 Spark 連接器,可以使用 SparkSQL 向 SequoiaDB 中寫入數據或從中讀取數據。
http://doc.sequoiadb.com/cn/sequoiadb-cat_id-1432190712-edition_id-0。
一、示例
下面舉例說明如何將 HDFS 中的 csv 文件通過 SparkSQL 導入 SequoiaDB 集合中,以及如何優化導入性能。
1、將 HDFS 中 csv 文件映射成 spark 的臨時表
CREATE TABLE
hdfstable
USING
org.apache.spark.sql.execution.datasources.csv.CSVFileFormat
OPTIONS (
path "hdfs://usr/local/data/test.csv",
header "true"
)
2. 將 SDB 的集合映射成 spark 的臨時表
create temporary table sdbtable (
a string,
b int,
c date
)
using
com.sequoiadb.spark
OPTIONS
(
host 'sdbserver1:11810,sdbserver2:11810,sdbserver3:11810',
username 'sdbadmin',
password 'sdbadmin',
collectionspace 'sample',
collection 'employee',
bulksize '500'
);
3. 導入
sparkSession.sql("insert into sdbtable select * from hdfstable");
二、導入性能優化
SparkSQL 數據寫入有以下兩個參數可以優化:
host儘量指定多個 coord 節點的地址,用「,」分隔多個地址,數據會隨機發到不同 coord 節點上,起到負載均衡的作用。
bulksize該參數默認值為500,代表連接器向 SequoiaDB 寫入數據時,以 500 條記錄組成一個網絡包,再向 SequoiaDB 發送寫入請求,可以根據數據的實際大小調整 bulksize 的值。
MySQL 導入
SequoiaDB 以存儲引擎的方式與 MySQL 對接,使得用戶可以通過 MySQL 的 SQL 接口訪問 SequoiaDB 中的數據,並進行增、刪、改、查等操作。
http://doc.sequoiadb.com/cn/sequoiadb-cat_id-1521595283-edition_id-302。
一、示例
使用 mysql 向 SequoiaDB 導入數據有以下幾種方式:
1. SQL 文件導入
mysql> source /opt/table1.sql
2. CSV 文件導入。mysql 中提供了 load data infile 語句來插入數據:
mysql> load data local infile '/opt/table2.csv' into table table2 fields terminated by ',' enclosed by '"' lines terminated by '\n';
二、導入性能優化
提升MySQL的導入性能有如下建議:
1. sequoiadb_conn_addr 指定多個地址
引擎配置參數「sequoiadb_conn_addr」儘量指定多個coord節點的地址,用「,」分隔多個地址,數據會隨機發到不同coord節點上,起到負載均衡的作用。
2. 開啟 bulkinsert
引擎配置參數「sequoiadb_use_bulk_insert」指定是否啟用批量插入,默認值為「ON」,表示啟用。配置參數「sequoiadb_bulk_insert_size」指定批量插入時每批的插入記錄數,默認值2000。可以通過調整bulkinsert size提高插入性能。
3. 切分文件
可以將一個大的數據文件切分為若干個小文件,然後為每個小文件啟動一個導入進程,多個文件並發導入,提高導入速度。
API 接口導入
SequoiaDB 提供了插入數據的 API 接口,即「insert」接口。insert 接口會根據傳入的參數不同而使用不同的插入方式,如果每次只傳入一條記錄,則接口也是將記錄逐條的發送到資料庫引擎,如果每次傳入一個包含多條記錄的集合或數組,則接口會一次性把這批記錄發送到資料庫引擎,最後通過引擎一條一條寫入資料庫中。
因此,insert 接口的兩種插入方式的區別在於發送數據到資料庫引擎這一過程,一次傳入多條記錄這種方式稱為「bulkinsert」,相對來說會減少數據發送時的網絡交互的次數,插入性能更佳。
小結
如何達到最大數據加載速度,是資料庫遷移/數據導入中常遇到的問題,本文從以下四個方面分別介紹了 SequoiaDB 數據遷移/導入過程中性能最優化的方法:
1)基於巨杉工具矩陣 sdbimprt 導入可以採用修改參數 host 指定多個節點、修改連接數、切分文件、修改參數 insertnum、重建索引等等對數據導入速度進行優化。
2)基於 MySQL 導入可以採用修改參數 host 地址及 bulksize 進行優化。
3)基於 Spark 導入可以採用指定多個協調節點IP、設置 bulkinsert 參數、切分文件進行優化。
4)基於API接口進行優化可以採用 bulkinsert 批量插入數據,減少網絡交互。
大家可以參考本文的數據導入方法進行實踐驗證,從傳統資料庫遷移到巨杉資料庫SequoiaDB。