【巨杉數據庫SequoiaDB】巨杉Tech | 巨杉數據庫數據高性能數據導入遷移實踐

SequoiaDB 一款自研金融級分佈式數據庫產品,支持標準SQL和分佈式事務功能、支持複雜索引查詢,兼容 MySQL、PGSQL、SparkSQL等SQL訪問方式。SequoiaDB 在分佈式存儲功能上,較通常的大數據產品提供更多的數據切分規則,包括:水平切分、範圍切分、主子表切分和多維切分方式,用戶能夠根據不用的場景選擇相應的切分方式,以提升系統的存儲能力和操做性能。mysql

爲了可以提供簡單便捷的數據遷移和導入功能,同時更方便地與傳統數據庫在數據層進行對接,巨杉數據庫支持多種方式的數據導入,用戶能夠根據自身需求選擇最適合的方式加載數據。sql

本文主要介紹巨杉數據庫集中常見的高性能數據導入方法,其中包括巨杉工具矩陣中的 Sdbimprt導入工具,以及使用SparkSQL, MySQL和原生API 接口進行數據導入,一共四種方式。數據庫

Sdbimprt工具導入
sdbimprt 是 SequoiaDB 的數據導入工具,是巨杉數據庫工具矩陣中重要組成之一,它能夠將 JSON 格式或 CSV 格式的數據導入到 SequoiaDB 數據庫中。apache

關於工具說明與參數介紹,請參考:
http://doc.sequoiadb.com/cn/sequoiadb-cat_id-1479195620-edition_id-0json

1、示例
下面簡單介紹一下如何使用 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:指定導入數據的字段名、類型、默認值

2、導入性能優化
下面說明使用 sdbimprt 工具時如何提高導入性能:

  1. 使用 --hosts 指定多個節點
    導入數據時,儘可能指定多個 coord 節點的地址,用「,」分隔多個地址,sdbimprt 工具會把數據隨機發到不一樣機器上的 coord,起到負載均衡的做用(如圖1)。
    【巨杉數據庫SequoiaDB】巨杉Tech | 巨杉數據庫數據高性能數據導入遷移實踐
  2. 使用 --insertnum(-n) 參數
    在導入數據時,使用 --insertnum(-n) 參數,能夠實現批量導入,減小數據發送時的網絡交互的次數,從而加快數據導入速度。取值範圍爲1~100000,默認值爲100。

  3. 使用 --jobs(-j) 參數
    指定導入鏈接數(每一個鏈接一個線程),從而實現多線程導入。

  4. 切分文件
    sdbimprt 在導入數據時支持多線程併發導入,但讀數據時是單線程讀取,隨着導入線程數的增長,數據讀取就成爲了性能瓶頸。這種狀況下,能夠將一個大的數據文件切分紅若干個小文件,而後每一個小文件對應啓動一個 sdbimprt 進程併發導入,從而提高導入性能。若是集羣內有多個協調節點,分佈在不一樣的機器上,那麼能夠在多臺機器上分別啓動 sdbimprt 進程,而且每一個 sdbimprt 鏈接機器本地的協調節點,這樣數據發送給協調節點時避免了網絡傳輸(如圖2)。
    【巨杉數據庫SequoiaDB】巨杉Tech | 巨杉數據庫數據高性能數據導入遷移實踐
  5. 數據加載完後再建索引
    對於導入數據量大,且索引多的表,建議先把索引刪除,待到數據導入完成後再重建索引,這樣有利於加快數據導入。在數據導入的過程當中,若是目標表存在大量的索引,數據庫除了寫入數據外,還須要寫入索引文件,這會下降導入數據的性能。此方式對提高其它方式的數據導入速度一樣適用。

SparkSQL 導入
SparkSQL 能夠方便的讀取多種數據源,經過 SequoiaDB 提供的 Spark 鏈接器,能夠使用 SparkSQL 向 SequoiaDB 中寫入數據或從中讀取數據。
關於 SparkSQL 如何與 SequoiaDB 鏈接,請參考:
http://doc.sequoiadb.com/cn/sequoiadb-cat_id-1432190712-edition_id-0

1、示例
下面舉例說明如何將 HDFS 中的 csv 文件經過 SparkSQL 導入 SequoiaDB 集合中,以及如何優化導入性能。

一、將 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"
)

  1. 將 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'
);

  1. 導入
    sparkSession.sql("insert into sdbtable select * from hdfstable");

2、導入性能優化
SparkSQL 數據寫入有如下兩個參數能夠優化:
host

儘可能指定多個 coord 節點的地址,用「,」分隔多個地址,數據會隨機發到不一樣 coord 節點上,起到負載均衡的做用。
bulksize

該參數默認值爲500,表明鏈接器向 SequoiaDB 寫入數據時,以 500 條記錄組成一個網絡包,再向 SequoiaDB 發送寫入請求,能夠根據數據的實際大小調整 bulksize 的值。

MySQL 導入
SequoiaDB 以存儲引擎的方式與 MySQL 對接,使得用戶能夠經過 MySQL 的 SQL 接口訪問 SequoiaDB 中的數據,並進行增、刪、改、查等操做。
關於如何與MySQL對接,請參考:

http://doc.sequoiadb.com/cn/sequoiadb-cat_id-1521595283-edition_id-302

1、示例
使用 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';

2、導入性能優化
提高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。

相關文章
相關標籤/搜索