HBase數據導入工具總結
- 2019 年 10 月 6 日
- 筆記
本文對HBase常用的數據導入工具進行介紹,並結合雲HBase常見的導入場景,給出建議的遷移工具和參考資料。
HBase之間數據導入常用工具
HBase提供了幾種數據遷移工具,其中基於API調用的有CopyTable,Export&Import。基於寫HDFS的有distcp,snapshot。
這裡要說明的是,本文作為一般性的介紹,不能忽略常用的工具distcp和snapshot,但是由於雲HBase默認不開啟HDFS埠,所以在雲HBase上面基於HDFS的方法都是用不了的。我們推薦用戶使用CopyTable進行遷移,根據我們的測試,CopyTable的性能足以支撐10T以下數據的遷移。如果您的數據量比較大(超過10T),可以聯繫雲HBase工作人員單獨為您處理。
CopyTable
CopyTable是HBase提供的一個數據同步工具,可以用於同步表的部分或全部數據。CopyTable通過運行Map-Reduce任務從源表讀出數據再寫入到目標表。 CopyTable使用只需要運行一個命令即可,命令示例:
./bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable -Dhbase.client.scanner.caching=200 -Dmapreduce.local.map.tasks.maximum=16 -Dmapred.map.tasks.speculative.execution=false --peer.adr=$ZK_IP1,$ZK_IP2,$ZK_IP3:/hbase $TABLE_NAME
本文介紹如何使用CopyTable同步HBase數據。針對沒有Hadoop集群的用戶,還介紹單機運行CopyTable的配置和參數。根據我們的測試,在表不壓縮的情況下,單機版CopyTable可以達到1小時100G左右的導入速度。10T以下的數據都可以使用CopyTable導入數據。
準備工作
1.安裝HBase CopyTable依賴於hadoop mapreduce。如果源HBase集群中開啟了mapreduce則可以直接在源集群上運行。否則可以在另一個hadoop集群上安裝HBase客戶端並將hbase-site.xml文件中的zk地址指向源集群。 也可以單機運行,單機運行時,不需要安裝hadoop,只要安裝了HBase就可以使用hadoop的本地模式運行CopyTable。 安裝和配置HBase的過程參考https://help.aliyun.com/document_detail/52056.html?spm=a2c4e.11153940.blogcont176546.17.333c5579bR1Adg。
2.創建目標表 使用CopyTable同步數據前,需要確保目標表存在。如果不存在需要先創建目標表。強烈建議根據數據的分布情況對目標表進行預分裂,這樣能夠提高寫入速度。
3.其他準備工作
需要將運行CopyTable的機器ip加入HBase的ip白名單,確保可以訪問到HBase。 需要修改hbase-site.xml文件中的zk地址指向源集群。
準備工作完成後,就可以運行CopyTable進行數據同步了。
命令示例
./bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable -Dhbase.client.scanner.caching=200 -Dmapreduce.local.map.tasks.maximum=16 -Dmapred.map.tasks.speculative.execution=false --peer.adr=$ZK_IP1,$ZK_IP2,$ZK_IP3:/hbase $TABLE_NAME
參數說明
CopyTable常用選項說明如下:
startrow 開始行。 stoprow 停止行。 starttime 時間戳(版本號)的最小值。 endtime 時間戳的最大值。如果不指定starttime,endtime不起作用。 peer.adr 目標集群的地址。格式為:hbase.zookeeer.quorum:hbase.zookeeper.client.port:zookeeper.znode.parent families 要同步的列族。多個列族用逗號分隔。 all.cells 刪除標記也進行同步。
更多參數參見官方文檔:http://hbase.apache.org/book.html#copy.table
除copytable的參數外, 以下選項也建議在命令中進行設置: (1)對於單機運行的情況,需要指定mapreduce.local.map.tasks.maximum參數,表示並行執行的最大map個數。不指定的話默認是1,所有任務都是串列執行的。(2)hbase.client.scanner.caching建議設置為大於100的數。這個數越大,使用的記憶體越多,但是會減少scan與服務端的交互次數,對提升讀性能有幫助。 (3)mapred.map.tasks.speculative.execution建議設置為false,避免因預測執行機制導致數據寫兩次。
另外,如果是在E-mapreduce集群上執行CopyTable,需要注意E-mapreduce默認的hbase-site.xml文件中配置了phoenix,所以需要導入phoenix的jar包,否則運行時會報錯:
-libjars $HBASE_HOME/lib/phoenix-$PhoenixVersion-HBase-$HBaseVersion-server.jar
性能數據
我們使用兩個雲HBase集群來進行導入數據的測試。兩個集群配置一致:3台region-server,機器配置為4CPU 8GB,數據盤為SSD雲盤。源數據使用hbase pe產生,共16億條數據,表採用SNAPPY壓縮,數據文件大小為71.9GB,共有32個region。數據為單行單列,rowkey長度26位元組,列長度100位元組。
使用一台4CPU 8GB的ECS執行CopyTable,測試結果如下表:
測試輪次 | 測試條件 | 導入時間 | 導入速度(rec/s) | 導入速度(MB/s) |
|---|---|---|---|---|
1 | -Dhbase.client.scanner.caching=100 -Dmapreduce.local.map.tasks.maximum=16 | 1h21min | 329218 | 15.15 |
2 | 在測試1的基礎上修改-Dhbase.client.scanner.caching=500 | 1h14min | 360360 | 16.58 |
3 | 在測試2的基礎上按照源表數據分布對目標表進行預分裂再進行導入 | 1h5min | 410256 | 18.88 |
測試過程中的相關監控如下:
測試1

測試2

測試3

Export&Import
Export將HBase表內容dump到一個順序文件(sequence)中。Import將Export得到的順序文件內容寫入HBase表。和CopyTable一樣,Export和Import也是通過運行map-reduce任務來執行的。 Export和Import命令格式:
bin/hbase org.apache.hadoop.hbase.mapreduce.Export <tablename> <outputdir> [<versions> [<starttime> [<endtime>]]] bin/hbase org.apache.hadoop.hbase.mapreduce.Import <tablename> <inputdir>
distcp
distcp是Hadoop提供的用於複製HDFS文件的工具,經常也被用來同步HBase數據。 使用distcp進行數據同步的步驟如下: (1)源集群停止寫入。 (2)將數據文件複製到目標集群上。運行
hadoop distcp $SrcFilePath $DstFilePath
(3)然後在目標集群上執行
hbase hbck -fixAssignments -fixMeta
snapshot
HBase snapshot可以在對region-server影響很小的情況下創建快照、將快照複製到另一個集群。 使用snapshot遷移數據的操作步驟如下: (1)在源表上創建snapshot。
hbase snapshot create -n $SnapshotName -t $TableName
(2)將snapshot拷貝到目標集群的HDFS上。
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot $SnapshotName -copy-from $SrcSnapshotPath -copy-to $DstSnapshotPath
(3)在目標集群恢復snapshot。在hbase shell中執行
restore_snapshot '$SnapshotName'
異構數據導入HBase常用工具
其他類型數據向HBase導入常見的工具有: (1)關係資料庫可以使用Sqoop導入。 (2)其他類型數據可以使用DataX。 (3)如果是周期性數據導入需求,可以使用數據集成。
Sqoop
Sqoop是一個用來將Hadoop和關係型資料庫中的數據相互轉移的工具。Sqoop的數據同步也是通過map-reduce實現的。 使用Sqoop同步數據只需要運行一個命令即可,命令示例:
sqoop import -Dmapreduce.local.map.tasks.maximum=8 --connect jdbc:mysql://$mysqlURL:3306/$database --table $table --hbase-table $hbaseTable --column-family $columnFamily --hbase-row-key $mysqlColumn --username $mysqlUser -m 8 -P
Sqoop是一個用來將Hadoop和關係型資料庫中的數據相互轉移的工具。本文介紹如何使用sqoop將數據從Mysql導入到HBase。從成本的角度考慮,針對沒有hadoop集群的用戶,重點介紹單機運行sqoop的配置和參數。
安裝
要完成從MyDW向HBase導入數據的任務,需要安裝和配置的軟體包括hadoop,sqoop,mysql-connector和HBase。我們針對單機運行sqoop的情況提供了四合一的安裝包簡化安裝流程。如果是在hadoop集群上運行sqoop,可以參考Sqoop官方文檔進行配置。 以下介紹單機版的安裝流程。
1.下載安裝包。把文件放在~目錄。
cd ~ wget http://public-hbase.oss-cn-hangzhou.aliyuncs.com/installpackage/sqoop-all.tar.gz
2.解壓文件:解壓,進入解壓後的目錄sqoop-all。
tar -xzvf sqoop-all.tar.gzcd scoop-all
3.設置環境變數。
cp sqoop-env.sh /etc/profile.d; source /etc/profile
4.修改hbase-1.1.9/conf/hbase-site.xml文件,添加集群的 ZK 地址。可參考雲HBase幫助文檔:https://help.aliyun.com/document_detail/52056.html?spm=a2c4e.11153940.blogcont176524.13.1c1ba954n0tDas
準備工作
1.設置ip白名單。需要把運行sqoop的機器ip添加到雲HBase的ip白名單中。如果Mysql是雲上的RDS,也需要修改RDS的ip白名單。總之就是保證這台機器能夠訪問mysql和HBase。 2.確保目標表存在。如果不存在需要先建表。
運行
安裝完成並配置好ip白名單之後,就可以運行sqoop進行數據導入了。
命令示例
以下是單機運行sqoop的命令示例:
sqoop import -Dmapreduce.local.map.tasks.maximum=8 --connect jdbc:mysql://$mysqlURL:3306/$database --table $table --hbase-table $hbaseTable --column-family $columnFamily --hbase-row-key $mysqlColumn --username $mysqlUser -m 8 -P
常用參數說明
--connect JDBC連接字元串 --table 要導入的mysql表名 --columns 要導入的列 --where 過濾條件 --hbase-table hbase表名 --column-family hbase列族 --hbase-row-key 用來做HBase rowkey的mysql列名 --username mysql用戶名 -m map個數,默認為4
此外,對於單機運行,還需要指定mapreduce.local.map.tasks.maximum參數,表示並行執行的最大map個數,否則默認為1,map就變成串列執行的了。也可以根據需要調整其他hadoop參數。 sqoop import的其他參數可參考[sqoop-import文檔]( http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_literal_sqoop_import_literal)。
公網運行
一般來說,我們不建議在公網執行數據同步任務,因為可能會有潛在的安全隱患以及繞行公網帶來的延時增大、性能問題等。但是考慮到開發測試階段的便利,HBase也提供了公網訪問的功能,我們可以通過配置HBase公網訪問實現在公網運行數據同步任務。
開通公網訪問
開通公網訪問的方法參見公網訪問方案。 公網訪問需要使用阿里雲訂製的客戶端,具體的下載和配置參見使用 Shell 訪問。 完成後,如果能通過hbase shell訪問,就說明這一步的配置已經成功了。
修改sqoop環境變數
sqoop環境變數中和HBase相關的環境變數主要是HBASE_HOME,需要把這個變數改成阿里雲訂製客戶端所在的目錄。運行vi sqoop-en.sh,修改如下內容:
#export HBASE_HOME=~/sqoop-all/hbase-1.1.9 注釋這一行,替換成: export HBASE_HOME=~/sqoop-all/alihbase-1.1.4 #改成阿里雲客戶端所在的目錄
然後
cp sqoop-env.sh /etc/profile.d; source /etc/profile
環境變數生效之後,就可以在公網執行導入操作了。
DataX
DataX 是廣泛使用的離線數據同步工具/平台,實現包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、OTS、ODPS 等各種異構數據源之間高效的數據同步功能。 DataX本身作為數據同步框架,將不同數據源的同步抽象為從源頭數據源讀取數據的Reader插件,以及向目標端寫入數據的Writer插件,理論上DataX框架可以支援任意數據源類型的數據同步工作。同時DataX插件體系作為一套生態系統, 每接入一套新數據源該新加入的數據源即可實現和現有的數據源互通。 使用DataX進行數據同步的步驟如下: (1)編寫作業的配置文件。配置文件為json格式,具體格式可參考這裡:
https://github.com/alibaba/DataX
(2)運行DataX。執行命令
python datax.py $config.json
DataX的使用參考官方文檔:https://github.com/alibaba/DataX/wiki/Quick-Start?spm=a2c4e.11153940.blogcont178446.21.dacd1078SCL03L
數據集成
數據集成是阿里集團對外提供的的數據同步平台,其底層也基於DataX。由於數據集成提供了調度的功能,所以很適合用於周期性導入數據或是與其他任務有依賴關係的情況。 使用數據集成同步數據的步驟較複雜,具體請參考這裡:
https://yq.aliyun.com/articles/165981?spm=a2c4e.11153940.blogcont178446.22.dacd1078SCL03L
雲HBase數據遷移指南
場景 | 建議遷移工具 | 參考資料 |
|---|---|---|
HBase->HBase,數據量<10T | CopyTable | 使用CopyTable同步HBase數據:https://yq.aliyun.com/articles/176546?spm=a2c4e.11153940.blogcont178446.23.dacd1078SCL03L |
HBase->HBase,數據量>10T | 聯繫雲HBase工作人員處理 | |
HBase經典網路集群遷移到vpc網路 | 使用ClassicLink打通網路。遷移工具參考具體場景 | HBase經典網路集群遷移到vpc網路:https://yq.aliyun.com/articles/328405?spm=a2c4e.11153940.blogcont178446.24.dacd1078SCL03L |
關係型資料庫->HBase | Sqoop | 使用Sqoop從MySQL向雲HBase同步數據:https://yq.aliyun.com/articles/176524?spm=a2c4e.11153940.blogcont178446.25.dacd1078SCL03L |
其他類型數據源一次性導入HBase | DataX | DataX官方文檔:https://github.com/alibaba/DataX/wiki/Quick-Start?spm=a2c4e.11153940.blogcont178446.26.dacd1078SCL03L |
導入Phoenix表 | Datax | HBase11xsqlwriter插件文檔:https://github.com/alibaba/DataX/blob/master/hbase11xsqlwriter/doc/hbase11xsqlwriter.md?spm=a2c4e.11153940.blogcont178446.27.dacd1078SCL03L&file=hbase11xsqlwriter.md |
其他類型數據源周期性導入HBase | 數據集成 | step-by-step通過數據集成同步數據到HBase 數據集成概述:https://yq.aliyun.com/articles/165981?spm=a2c4e.11153940.blogcont178446.28.dacd1078SCL03L |