转载请注明出处:https://blog.csdn.net/l1028386804/article/details/88817298
总体来说,HBase的备份分为两类,可以根据不同的需求选择不同的备份方法:
离线备份/full-shutdown备份
- 使用hadoop distcp命令
在线备份
- 快照
- 复制
- 导出
- CopyTable
- HTable接口
- HDFS数据离线备份
- Mozilla工具
- HDFS复制
离线备份/full-shutdown备份
完全停止HBase服务,使用distcp命令运行MapReduce任务进行备份,服务在一段时间内不可用。
备份
假设HBase的数据分布在HDFS上的位置是:hdfs://namenode:9000/hbase,可以使用distcp命令将此位置的所有数据复制到同一个集群的其他位置或者另外一个集群。
distcp命令的语法如下:
hadoop [Generic Options] distcp
[-p [rbugp] ] [-i ] [-log ] [-m ] [-overwrite ]
[-update ] [-f <URI list> ] [-filelimit <n> ] [-sizelimit <n> ]
[-delete ] <source> <destination>
在同一个集群创建备份:
hadoop distcp hdfs://binghe1:9000/hbase hdfs://binghe1:9000/hbasebackup/backup1
将数据备份到另一个集群
hadoop distcp hdfs://binghe1:9000/hbase hdfs://binghe2:9000/hbasebackup/backup1
注意:必须启动JobTracker和TaskTracker才能使用distcp命令。复制时,可以添加-overwrite或-update参数
最好是设置一个备份集群
恢复
恢复的方法与备份一致,将distcp备份的数据复制到HBase目录即可。
此方法需要先关闭整个HBase集群,会导致一定的宕机时间,从而影响正常的服务提供,使用较少,谨慎使用。
在线备份
HBase快照
有两种快照类型:在线和离线
使用离线快照方式创建快照并备份数据:
1.修改配置
在HBase-site.xml中加入下面的代码来开启快照功能:
<property>
<name>hbase.snapshot.enabled</name>
<value>true</value>
</property>
完成后,重启集群
2.打开HBase,执行创建快照命令:
hbase> snapshot 'emptable', 'baksnapshot20190326'
3.查看快照列表
hbase> list_snapshots
4.删除快照
hbase> delete_snapshot 'baksnapshot20190326'
5.使用快照克隆一个表
hbase> clone_snapshot 'baksnapshot20190326', 'newSnapTable'
6.恢复一个表到快照状态
hbase> disable 'table'
hbase> restore_snapshot 'baksnapshot20190326'
7.使用MapReduce任务将快照创建在另一个HDFS集群
hbase class org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot snapshot20190326 -copy-to hdfs://binghe1:9000/hbase -mappers 8 -bandwidth 100
HBase复制方法
HBase复制方法可以将一个HBase集群的数据复制到另一个集群,复制时异步的,基于每个RegionServer的HLog,有三种类型的复制:
- 主从(master-slave)
- 主主(master-master)
- 环形(Cyclic)
创建集群复制
创建集群复制先决条件:
- 集群见可以相互通信
- 集群的Hadoop版本和HBase版本一致
- 复制的表在不同的集群中必须结构相同,同样的表名,同样的列族
- 多从复制、主主复制以及环形复制需要HBase版本为0.92或更高
- org.apache.hadoop.hbase.replication包负责复制相关的任务
步骤集群复制的步骤
1.修改hbase-site.xml,添加如下配置
<property>
<name>hbase.replication</name>
<value>true</value>
</property>
2.在主集群上执行如下命令,添加对等集群:
add_peer 'ID' 'CLUSTER_KEY'
ID指定一个短整型,CLUSTER_KEY设置为从集群,遵循模式:
hbase.zookeeper.quorum:hbase.zookeeper.property.clientPort:zookeeper.znode.parent
3.添加完对等集群之后,需要开启列族的复制,使用如下命令修改表中列族的复制作用域:
disable 'table'
alter 'table', {NAME=> 'colFam', REPLICATION_SCOPE => '1'}
enable 'table'
0表示关闭复制,1表示开启复制
4.查看节点,执行下面的命令:
hbase> list_peers
5.查看任意RegionServer的日志来验证复制是否成功
Considering 1 rs, with radio 0.1
Getting 1 rs from peer cluster # 0
Choosing peer <ipaddress_regionserver>:<regionServerPort>
6.如果在RegionServer的日志中出现了上面的日志
7.如果想要停止复制,可以使用stop_replication命令停止复制
使用Export和Import进行备份和复制
Export
可以将HBase的表写入HDFS序列化文件中。接收开始和结束时间戳作为参数,可以进行全量备份和增量备份。
hbase org.apache.hadoop.hbase.mapreduce.Export <tablename> <outputdir> [<versions> [<starttime> [<endtime>]]]
tablename用于指定要导出的表名;outputdir用于指定输出目录,可以同一个集群或者不同集群的HDFS路径;version用于指定导出的版本个数;starttime和endtime用于指定导出的时间戳。
Import
用于读取Export导出的序列化文件来还原HBase表,可以是新建的表,也可以是已经存在的表,如果表数据已经存在,则会被覆盖。使用方法如下:
hbase org.apache.hadoop.hbase.mapreduce.Import <tablename> <inputdir>
tablename指定要导入/恢复的表名,inpput指定序列化文件的存储位置
也可以用Hadoop MapReduce调度:
hadoop jar <full path of> hbase-*.jar export <tablename> <outputdir> [<versions> [<starttime> [<endtime>]]]
hadoop jar <full path of> hbase-*.jar import <tablename> <inputdir>
可以传入一些运行时参数,如:-D mapred.output.compress=true和一些其他参数放在export之后。
使用HBase v0.94进行导出操作,这些数据需要导入新的版本,可以指定运行时参数来确定版本:
hbase -Dhbase.import.version=0.94
org.apache.hadoop.hbase.mapreduce.Import <tablename> <inputdir>
其他工具
ImportTsv可以将Tab分割的数据(TSV)导入到HBase中,使用方式如下所示:
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c <tablename> <hdfs-inputdir>
CopyTable
CopyTable工具可以复制部分或全部的表到同一个集群或其他集群。目标表必须已经存在且具有相同的结构
hbase org.apache.hadoop.hbase.mapreduce.CopyTable [general options] [--starttime=X] [--endtime==Y] [--new.name=NEW] [--peer.adr=ADR] <tablename>
唯一的参数是tablename,用于指定要复制的表名,比如:
hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=Copynewtable
new.name指定目标的新表名,table表示要复制的表名