有沒有這樣一樣情況受葛,把一個集群中的某個表導到另一個群集中报腔,或者hbase的表結構發(fā)生了更改巫俺,但是數據還要认烁,比如預分區(qū)沒做,導致某臺RegionServer很吃緊介汹,Hbase的導出導出都可以很快的完成這些操作却嗡。
環(huán)境使用
現在環(huán)境上面有一張表logTable
,有一個ext
列簇
但是沒有做預分區(qū)嘹承,雖然可以強制拆分表窗价,但是split的start,end范圍無法精確控制。
方式一 (先導出再導出)
- 創(chuàng)建導出目錄
hadoop fs -mkdir /tmp/hbase-export
- 備份表數據
使用hbase
內置的mr
命令,會默認導出到hdfs
中
hbase org.apache.hadoop.hbase.mapreduce.Export \
-D hbase.mapreduce.scan.column.family=ext \
logTable hdfs:///tmp/hbase-export/logTable
- 刪除表
disable 'logTable'
drop 'logTable'
- 創(chuàng)建表
數據3天過期叹卷,可以根據RegionServer
的個數做預分區(qū)撼港,假設有8臺坪它,則使用下面的方式。
由于我們是使用MD5("uid")
前兩位作為打散,范圍為00~ff
256個分片,可以使用如下方式帝牡。
# scala shell 創(chuàng)建方式
(0 until 256 by 256/8).map(Integer.toHexString).map(i=>s"0$i".takeRight(2))
hbase創(chuàng)表
create 'logTable',{ \
NAME => 'ext',TTL => '3 DAYS', \
CONFIGURATION => {
'SPLIT_POLICY' => 'org.apache.hadoop.hbase.regionserver.KeyPrefixRegionSplitPolicy', \
'KeyPrefixRegionSplitPolicy.prefix_length' => '2'
}, \
COMPRESSION => 'SNAPPY' \
}, \
SPLITS => ['20', '40', '60', '80', 'a0', 'c0', 'e0']
- 導出備份數據
hbase org.apache.hadoop.hbase.mapreduce.Import logTable hdfs:///tmp/hbase-export/logTable
注意事項
- 默認導出所有列簇往毡,可通過指定
-D hbase.mapreduce.scan.column.family=ext,info
參數導出。 - 如果另一張表沒有源表對應的列簇將會出錯靶溜。