> 有沒有這樣一樣情況爷辱,把一個(gè)集群中的某個(gè)表導(dǎo)到另一個(gè)群集中晕翠,或者h(yuǎn)base的表結(jié)構(gòu)發(fā)生了更改,但是數(shù)據(jù)還要担映,比如預(yù)分區(qū)沒做废士,導(dǎo)致某臺(tái)RegionServer很吃緊,Hbase的導(dǎo)出導(dǎo)出都可以很快的完成這些操作蝇完。
![](https://upload-images.jianshu.io/upload_images/9028759-4fb9aa8ca3777969.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
## 環(huán)境使用
現(xiàn)在環(huán)境上面有一張表`logTable`官硝,有一個(gè)`ext`列簇
但是沒有做預(yù)分區(qū),雖然可以強(qiáng)制拆分表短蜕,但是split的start,end范圍無法精確控制氢架。
## 方式一 (先導(dǎo)出再導(dǎo)出)
1. 創(chuàng)建導(dǎo)出目錄
```
hadoop fs -mkdir /tmp/hbase-export
```
2. 備份表數(shù)據(jù)
使用`hbase`內(nèi)置的`mr`命令,會(huì)默認(rèn)導(dǎo)出到`hdfs`中
```
hbase org.apache.hadoop.hbase.mapreduce.Export \
-D hbase.mapreduce.scan.column.family=ext \
logTable hdfs:///tmp/hbase-export/logTable
```
3. 刪除表
```
disable 'logTable'
drop 'logTable'
```
4. 創(chuàng)建表
數(shù)據(jù)3天過期,可以根據(jù)`RegionServer`的個(gè)數(shù)做預(yù)分區(qū)朋魔,假設(shè)有8臺(tái)岖研,則使用下面的方式。
由于我們是使用`MD5("uid")`前兩位作為打散,范圍為`00~ff` 256個(gè)分片,可以使用如下方式警检。
```
# 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']
```
5. 導(dǎo)出備份數(shù)據(jù)
```
hbase org.apache.hadoop.hbase.mapreduce.Import logTable hdfs:///tmp/hbase-export/logTable
```
## 注意事項(xiàng)
1. 默認(rèn)導(dǎo)出所有列簇孙援,可通過指定`-D hbase.mapreduce.scan.column.family=ext,info`參數(shù)導(dǎo)出。
2. 如果另一張表沒有源表對(duì)應(yīng)的列簇將會(huì)出錯(cuò)扇雕。
---
![](https://upload-images.jianshu.io/upload_images/9028759-07315bb8dadcd082.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)