
Hbase环境下备份opentsdb数据库表
日常工作中会经常使用到opentsdb数据库的迁移,所以这次针对迁移的内容做下介绍,默认情况下opentsdb数据库是包含四张表,分别为tsdb、tsdb-meta、tsdb-tree、tsdb-uid,只有tsdb-uid和tsdb这两张表存数据,其它两张表则不存放数据,所以下面的备份与还原介绍主要是针对这两张表。
1.备份方式说明
Hbase数据库的备份目前主要是分为以下两种:
- 基于Hbase提供的类对hbase中某张表进行备份
- 基于Hbase snapshot数据快速备份方法
2.基于hbase提供的类对hbase中某张表进行备份
本文使用hbase提供的类把hbase中某张表的数据导出hdfs,之后再导出到测试hbase表中。
首先介绍一下相关参数选项:
-
从hbase表导出(# 默认不写file://的时候就是导出到hdfs上了 )
#HBase数据导出到HDFS或者本地文件 hbase org.apache.hadoop.hbase.mapreduce.Export tsdb file:///home/bak/tsdb #HBase数据导出到本地文件 hbase org.apache.hadoop.hbase.mapreduce.Export tsdb /hbase/tsdb_bak
-
导入hbase表(# 默认不写file://的时候就是导出到hdfs上了 )
#将hdfs上的数据导入到备份目标表中 hbase org.apache.hadoop.hbase.mapreduce.Driver import tsdb /hbase/tsdb_bak/* #将本地文件上的数据导入到备份目标表中 hbase org.apache.hadoop.hbase.mapreduce.Driver import tsdb file:///home/bak/tsdb/*
-
导出时可以限制scanner.batch的大小
#如果在hbase中的一个row出现大量的数据,那么导出时会报出ScannerTimeoutException的错误。这时候需要设置hbase.export.scaaner.batch 这个参数。这样导出时的错误就可以避免了。 hbase org.apache.hadoop.hbase.mapreduce.Export -Dhbase.export.scanner.batch=2000 tsdb file:///home/bak/tsdb
-
为了节省空间可以使用compress选项
#hbase的数据导出的时候,如果不适用compress的选项,数据量的大小可能相差5倍。因此使用compress的选项,备份数据的时候是可以节省不少空间的。 #并且本人测试了compress选项的导出速度,和无此选项时差别不大(几乎无差别): hbase org.apache.hadoop.hbase.mapreduce.Export -Dhbase.export.scanner.batch=2000 -D mapred.output.compress=true tsdb file:///home/bak/tsdb/ #通过添加compress选项,最终导出文件的大小由335字节变成了325字节, #File Output Format Counters File Output Format Counters #Bytes Written=335 Bytes Written=323
-
导出指定行键范围和列族
#在公司准备要更换数据中心,需要将hbase数据库中的数据进行迁移。虽然进行hbase数据库数据迁移时,使用其自带的工具import和export是很方便的。 #只不过,在迁移大量数据时,可能需要运行很长的时间,甚至可能出错。 #这时,是可以通过指定行键范围和列族,来减少单次export工具的运行时间。 #可以看出,支持的选项有好几个。假如,我们想导出表test的数据,且只要列族Info,行键范围在000到001之间,可以这样写: #这样就可以了,且数据将会保存在hdfs中。 #通过指定列族和行键范围,可以只导出部分数据,避免export启动的mapreduce任务运行时间过长。也就是可以分多次导出数据。 hbase org.apache.hadoop.hbase.mapreduce.Export -D hbase.mapreduce.scan.column.family=Info -D hbase.mapreduce.scan.row.start=000 -D hbase.mapreduce.scan.row.stop=001 tsdb /hbase/tsdb_bak
-
含义介绍及增量备份
#HBase自带的export/import机制可以实现Backup Restore功能。而且可以实现增量备份。原理都是用了MapReduce来实现的。 #1、Export是以表为单位导出数据的,若想完成整库的备份需要执行n遍。 #2、Export在shell中的调用方式类似如下格式: #./hbase org.apache.hadoop.hbase.mapreduce.Export 表名 备份路径 (版本号) (起始时间戳) (结束时间戳)括号内为可选项,例如 #Usage: Export [-D <property=value>]* <tablename> <outputdir> [<versions> [<starttime> [<endtime>]] [^[regex pattern] or [Prefix] to filter]] hbase org.apache.hadoop.hbase.mapreduce.Export tsdb /hbase/tsdb_bak 1 123456789 #备份 emp 这张表到 /hbase/tsdb_bak 目录下(最后一级目录必须由Export自己创建),版本号为1,备份记录从123456789这个时间戳开始到当前时间内所有的执行过put操作的记录。 #注意:为什么是所有put操作记录?因为在备份时是扫描所有表中所有时间戳大于等于123456789这个值的记录并导出。如果是delete操作,则表中这条记录已经删除,扫描时也无法获取这条记录信息。 #当不指定时间戳时,备份的就是当前完整表中的数据。
-
备份脚本示例,仅需在其中一个节点执行即可。
#全量备份: cat <<EOF > /usr/bin/hbase_fullbk.sh #!/bash/bin source /root/.bashrc starttime=`date +%s%m%w` echo $starttime >> /home/backup/fullbak_endtime.txt tablename01='tsdb-uid' tablename02='tsdb' backup_date=`date +%Y-%m-%d-%k-%M-%S` #开始全备tablename01数据 hbase org.apache.hadoop.hbase.mapreduce.Export -D hbase.export.scanner.batch=2000 -D mapreduce.output.fileoutputformat.compress=true -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec -D mapreduce.output.fileoutputformat.compress.type=BLOCK $tablename01 file:///home/backup/$backup_date$tablename01'_fullbk' 1 #开始全备tablename02数据 hbase org.apache.hadoop.hbase.mapreduce.Export -D hbase.export.scanner.batch=2000 -D mapreduce.output.fileoutputformat.compress=true -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec -D mapreduce.output.fileoutputformat.compress.type=BLOCK $tablename02 file:///home/backup/$backup_date$tablename02'_fullbk' 1 #hdfs dfs -get /home/backup/$backup_date$tablename'_fullbk' /home/backup/ #hdfs dfs -rmr /home/backup/$backup_date$tablename'_fullbk' EOF #增量备份: cat <<EOF > /usr/bin/hbase_increbk.sh #!/bash/bin source /root/.bashrc start_time=`tail -n 1 /home/backup/fullbak_endtime.txt` end_time=`date +%s%m%w` echo $end_time >> /home/backup/incbak_endtime.txt tablename01='tsdb-uid' tablename02='tsdb' backup_date=`date +%Y-%m-%d-%k-%M-%S` #开始增备tablename01数据 hbase org.apache.hadoop.hbase.mapreduce.Export -D hbase.export.scanner.batch=2000 -D mapreduce.output.fileoutputformat.compress=true -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec -D mapreduce.output.fileoutputformat.compress.type=BLOCK $tablename01 file:///home/backup/$backup_date$tablename01'_increbk' 1 $start_time $end_time #开始增备tablename02数据 hbase org.apache.hadoop.hbase.mapreduce.Export -D hbase.export.scanner.batch=2000 -D mapreduce.output.fileoutputformat.compress=true -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec -D mapreduce.output.fileoutputformat.compress.type=BLOCK $tablename02 file:///home/backup/$backup_date$tablename02'_increbk' 1 $start_time $end_time #hdfs dfs -get /home/backup/$backup_date$tablename'_increbk' /home/backup/ #hdfs dfs -rmr /home/backup/$backup_date$tablename'_increbk' EOF #新建计划任务: 0 0 * * * /bin/bash /usr/bin/hbase_fullbk.sh & 30 */1 * * * /bin/bash /usr/bin/hbase_increbk.sh & #每天零点零分做tsdb和tsdb-uid的全量备份,整点30分做基于全量备份的增量备份。 #备份文件说明: #备份的文件仅保留在各个数据节点上,非数据节点不存在备份数据,此备份默认启用压缩备份。做数据迁移需要保留所有节点的数据,汇总还原至新的服务器即可。新的服务器上面仅仅需要在数据存储节点放需要还原的数据。
-
还原脚本示例(—D 后的参数可以根据实际需要选择是否添加即可)
hbase org.apache.hadoop.hbase.mapreduce.Import tsdb-uid file:///home/backup/tsdb-uid-bak0429 -D hbase.import.version=1.2.6.1 hbase org.apache.hadoop.hbase.mapreduce.Import tsdb file:///home/backup/tsdb-bak0429 -D hbase.import.version=1.2.6.1
如上方式比较适合数据量不大的情况下,针对离线数据备份和跨机房的迁移使用。(当然数据量较大的情况下,如何实现数据迁移或快速恢复,则主要是采用混合方式实现。)
3.基于Hbase snapshot数据快速备份方法
1)Snapshot备份的优点是什么?
HBase以往数据的备份基于distcp或者copyTable等工具,这些备份机制或多或少对当前的online数据读写存在一定的影响,Snapshot提供了一种快速的数据备份方式,无需进行数据copy。
2)HBase数据的备份的方式有几种?Snapshot包括在线和离线的,他们之间有什么区别?
Snapshot包括在线和离线的
- 离线方式是disable table,由HBase Master遍历HDFS中的table metadata和hfiles,建立对他们的引用。
- 在线方式是enable table,由Master指示region server进行snapshot操作,在此过程中,master和regionserver之间类似两阶段commit的snapshot操作。
HFile是不可变的,只能append和delete, region的split和compact,都不会对snapshot引用的文件做删除(除非删除snapshot文件),这些文件会归档到archive目录下,进而需要重新调整snapshot文件中相关hfile的引用位置关系。
基于snapshot文件,可以做clone一个新表,restore,export到另外一个集群中操作;其中clone生成的新表只是增加元数据,相关的数据文件还是复用snapshot指定的数据文件。
3)snashot的shell的命令都由哪些?如何删除、查看快照?如何导出到另外一个集群?
nashot相关的操作命令如下:
#创建快照:
snapshot 'tsdb-uid', 'snapshot_tsdb-uid'
snapshot 'tsdb', 'snapshot_tsdb'
#查看创建的快照:
list_snapshots
#删除快照命令:
delete_snapshot 'snapshot_tsdb'
#基于快照,clone一个新表:
clone_snapshot 'snapshot_tsdb-uid', 'news_tsdb-uid'
#基于快照恢复表:
disable 'tsdb-uid'
restore_snapshot 'snapshot_tsdb-uid'
#通过hdfs查看快照文件:
hadoop fs -ls /hbase/.hbase-snapshot/snapshot_tsdb
#查看快照文件大小:
hadoop fs -du -h /hbase/.hbase-snapshot/snapshot_tsdb
#将快照源集群copy至目标集群:
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot snapshot_tsdb-uid -copy-from hdfs://10.1.1.100:9000/hbase -copy-to hdfs://10.1.1.200:9000/mghdpha/hbase -mappers 20 -bandwidth 20
copy完成后即可通过快照恢复表,或者利用快照创建新表等均可。
4)注意事项或说明
由于数据导出导入均通过mapreduce的方式实现。
所以需要将hadoop中的mapred-site.xml新增如下配置项:
目的就是为了确保备份和还原时能够有足够的内存空间可供使用。
<property>
<name>mapreduce.map.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>2048</value>
</property>
快照方式速度较快,且对系统的影响较小,主要用于在线数据备份和同机房的数据迁移使用。