HBase数据迁移方案有很多种,但今天我们来通过Snapshot方式来实现HBase的数据迁移(即将A集群HBase的数据迁移到B集群),废话不多说,直接进去主题吧:
参考文献:https://www.cnblogs.com/ballwql/p/hbase_data_transfer.html
https://www.cnblogs.com/cenyuhai/p/3309033.html
HBase Snapshots允许你对一个表进行快照(即可用副本),它不会对Region Servers产生很大的影响,它进行复制和 恢复操作的时候不包括数据拷贝。导出快照到另外的集群也不会对Region Servers产生影响。 下面告诉你如何使用Snapshots功能
1.开启快照支持功能,在0.95+之后的版本都是默认开启的,在0.94.6+是默认关闭
<property>
<name>hbase.snapshot.enabled</name>
<value>true</value>
</property>
2.创建快照:
(1)在原集群上,用snapshot命令创建快照,命令如下:hbase> snapshot 'g2monitor:g2monitor_range_event',’g2monitor_range_event'
g2monitor:g2monitor_range_event是原HBase表的名字,g2monitor_range_event是创建快照的名字。
(2)查看创建的快照,可用list_snapshots命令:hbase> list_snapshots
(3)如果快照创建有问题,可以先删除,用delete_snapshot命令:hbase >delete_snapshot 'g2monitor_range_event'
(4)创建完快照后在/hbase根目录会产生一个目录:
[user_w@emr-header-1 ~]$ hadoop fs -ls hdfs://172.16.120.199:9000/hbase/.hbase-snapshot/
#子目录下有如下几个文件
Found 2 items
drwxr-x--x - hbase hadoop 0 2018-11-29 10:54 hdfs://172.16.120.199:9000/hbase/.hbase-snapshot/.tmp
drwxr-x--x - hbase hadoop 0 2018-11-29 10:54 hdfs://172.16.120.199:9000/hbase/.hbase-snapshot/g2monitor_range_event
3.数据迁移
在上面创建好快照后,使用ExportSnapshot命令进行数据迁移,ExportSnapshot也是HDFS层的操作,本质还是利用MR进行迁移,这个过程主要涉及IO操作并消耗网络带宽,在迁移时要指定下map数和带宽,不然容易造成机房其它业务问题,如果是单独的MR集群,可以在MR集群上使用如下命令:
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot g2monitor_range_event -copy-from hdfs://172.16.120.199:9000/hbase \
-copy-to hdfs://172.16.120.213:8020/hbase -overwrite -mappers 16 -bandwidth 1024\
4.从快照复制生成一个新表
hbase> clone_snapshot 'g2monitor_range_event','g2monitor:g2monitor_range_event'
5.用快照恢复数据,它需要先禁用表,再进行恢复
hbase> disable 'g2monitor:g2monitor_range_event'
hbase> restore_snapshot ‘g2monitor_range_event'
hbase> enable 'g2monitor:g2monitor_range_event'
6.检查HBase数据是否迁移成功
hbase> scan 'g2monitor:g2monitor_range_event’
7.现在HBase表迁移成功,但由于需要查询,所以我们新建hive表关联到HBase表,以方便数据查询
use ${hiveconf:db};
CREATE EXTERNAL TABLE stg_g2monitor_range_event
(event_id STRING,
gpsno STRING,
vehicle_no STRING,
org_code STRING,
from_org_code STRING,
point_id STRING,
point_name STRING,
enter_time STRING,
depart_time STRING,
seconds INTEGER)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES
("hbase.columns.mapping" = ":key,f:gpsno,f:vehicle_no,f:org_code,f:from_org_code,f:point_id,f:point_name,f:enter_time,f:depart_time,f:seconds")
TBLPROPERTIES ("hbase.table.name" = "g2monitor:g2monitor_range_event", "hbase.mapred.output.outputtable" = "g2monitor:g2monitor_range_event");
8.数据校验:
hive> select * from stg_g2monitor_range_event limit 1;
OK
1001672592571895808 90023076 川A1TE16 200HO813 200HOF F3334A3E09355230114C52D2AB4E3D1E 成都鑫盛瑞吉物流有限公司_华丰食品城 2018-05-30 11:51:59.0 2018-05-30 11:53:19.0 80
Time taken: 0.181 seconds, Fetched: 1 row(s)
9.补充
在HBase数据迁移过程中还有可能使用到的命令:
hadoop fs -ls hdfs://172.16.120.213:8020/hbase/.hbase-snapshot
hadoop fs -rm -r -skipTrash /hbase/.hbase-snapshot
hadoop fs -ls hdfs://172.16.120.199:9000/hbase/.hbase-snapshot/g2monitor_range_event/
hadoop fs -ls hdfs://172.16.120.213:8020/hbase