> 有没有这样一样情况,把一个集群中的某个表导到另一个群集中,或者hbase的表结构发生了更改,但是数据还要,比如预分区没做,导致某台RegionServer很吃紧,Hbase的导出导出都可以很快的完成这些操作。
![](https://upload-images.jianshu.io/upload_images/9028759-4fb9aa8ca3777969.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
## 环境使用
现在环境上面有一张表`logTable`,有一个`ext`列簇
但是没有做预分区,虽然可以强制拆分表,但是split的start,end范围无法精确控制。
## 方式一 (先导出再导出)
1. 创建导出目录
```
hadoop fs -mkdir /tmp/hbase-export
```
2. 备份表数据
使用`hbase`内置的`mr`命令,会默认导出到`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. 创建表
数据3天过期,可以根据`RegionServer`的个数做预分区,假设有8台,则使用下面的方式。
由于我们是使用`MD5("uid")`前两位作为打散,范围为`00~ff` 256个分片,可以使用如下方式。
```
# scala shell 创建方式
(0 until 256 by 256/8).map(Integer.toHexString).map(i=>s"0$i".takeRight(2))
```
hbase创表
```
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. 导出备份数据
```
hbase org.apache.hadoop.hbase.mapreduce.Import logTable hdfs:///tmp/hbase-export/logTable
```
## 注意事项
1. 默认导出所有列簇,可通过指定`-D hbase.mapreduce.scan.column.family=ext,info`参数导出。
2. 如果另一张表没有源表对应的列簇将会出错。
---
![](https://upload-images.jianshu.io/upload_images/9028759-07315bb8dadcd082.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)