Hbase - 迁移数据[导出,导入]

> 有没有这样一样情况,把一个集群中的某个表导到另一个群集中,或者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)

你可能感兴趣的:(Hbase - 迁移数据[导出,导入])