一种HBase数据备份及恢复方法

目 录

0.引 言

1.备份方法

2.脚本的使用方法

3 获取HDFS文件到本地系统

 4 数据恢复方法

4.1 将将备份文件添加到hdfs中

4.2 导入数据到HBase集群

5.小 结


0.引 言

HBase在大数据处理中地位至关重要,有的公司会将HBase作为原始数据接入层,那么Hbase的数据备份就显得至关重要,那么如何备份呢?这里我们引入Hbase的一个API,hbase org.apache.hadoop.hbase.mapreduce.Export,该API可以实现同一集群间的数据备份。

1.备份方法

初始化全量备份 + 增量备份手段

基本原理:Export导出工具与CopyTable一样是依赖hbase的scan读取数据,并且采用的ImportFormat与CopyTable一样是TableInputFormat类,从该类的getSplits()方法可以看出MR的map数与hbase表的region数相同。

执行日程:

备份按照每张hbase中的表进行备份,每月的1号进行全量备份,每天进行增量备份

执行内容:

每月1号进行全量备份 在linux上执行如下命令

hbase org.apache.hadoop.hbase.mapreduce.Export tablename backupDst

每天进行增量备份,执行如下命令

hbase org.apache.hadoop.hbase.mapreduce.Export tablename backupDst versionstart_time end_time

脚本参数列表如下图所示:

参数

tablename

hdfs_path

version

start_time

end_time

backupDst

含义

hbase中需要备份的表

备份到hdfs中的父路径

Hbase的版本号,增量备份的时候需要指定,否则不能备份

增量备份的时候起始时间戳

增量备份的时候结束时间戳

备份的目录。具体由如下格式组成:hdfs_path/ hbase_tablename_date(备份当天的日期,2019-08-22)_f (全量备份为f,增量为i)

※具体示例脚本如下:

prepare_run.sh脚本

该脚本是执行备份脚本之前需要先做的准备工作

#!/bin/bash

su - hdfs <

ods_xxx_hbase_backup_full_in.sh脚本

#!/bin/bash

##############################################################################################################################################

# HBASE data backup full and increment   #

########################################################################################

day=`date +%d`;#获取今天的日期

if [ "$2" != "" ];then

  day=$2

fi;

today=`date +%Y-%m-%d` #获取今天的日期

lastday=`date --date '-1days' +%Y-%m-%d` #获得昨天的日期

hbase_tablename='iot_dcqk_shock';#hbase中需要备份的表

if [ "$1" != "" ];then

  hbase_tablename=$1

fi;

hdfs_path='hdfs://10.1.3.12/backup';#hdfs路径,已经在hdfs中建好,且赋予777权限,需要根据自己集群修改

start_time=`date -d $lastday +%s`;#增量备份的起始时间戳

end_time=`date -d $today +%s`;#增量备份的结束时间戳

version='2';

#每月1号进行全量备份,其余时间增量备份

if [ $day == '01' ];

then

    #需要备份到hdfs上的目录

    backupDst=$hdfs_path"/"$hbase_tablename"_"$today"_f";

    hbase org.apache.hadoop.hbase.mapreduce.Export $hbase_tablename $backupDst $version

else

    backupDst=$hdfs_path"/"$hbase_tablename"_"$today"_i";

    hbase org.apache.hadoop.hbase.mapreduce.Export $hbase_tablename $backupDst $version $start_time $end_time

fi

注:增量备份的时候必须指定版本号,否则不能备份。全量备份的时候,可以指定也可以不指定。

2.脚本的使用方法

① 把脚本上传到服务器,位置是/home/centos/xxx/HbaseBackup(需要赋予脚本可执行权限)

chmod 777 –R /home/centos/xxx/HbaseBackup

② 首次备份需要在root用户下执行prepare_run.sh,创建hdfs上的备份目录/backup

③在/etc/crontab中设置定时任务,备份hbase中的每张表

Hbase中需要备份的表是通过位置参数传入进去,具体可参考如下图所示:

一种HBase数据备份及恢复方法_第1张图片

④查看hdfs中结果

文件夹以“_f”结尾的为全量备份,以“_i”结尾的为增量备份

3 获取HDFS文件到本地系统

     将HDFS中的/backup目录下的备份文件复制到本地系统中/home/centos/opt/下

     如:  

hadoop dfs -get /backup/phm_default_input  /home/centos/opt/phm_default_input

   opt的目录需要用户手动创建,get之后系统会自动创建phm_default_input的目录,在HDFS上该目录下的所有内容也会被复制过来。如下图所示:

一种HBase数据备份及恢复方法_第2张图片

备份到本地后可以将数据拷贝到磁盘中,作为下一次数据恢复使用。

 4 数据恢复方法

 4.1 将将备份文件添加到hdfs中

  将上面的目录复制到新的机器中,通过put将文件上传到hdfs中去。

  hadoop dfs -put localFile hdfsFile

  如下:把系统的/home/centos/opt/student 上传到新集群hdfs的/bak目录下下。

 (1)拷贝数据到新集群的本地目录下。

       创建/home/centos/opt,利用相关远传工具将数据复制到新的集群中。

rm -rf /home/centos/opt
mkdir -p /home/centos/opt

 (2)在新集群环境的hdfs中创建/bak目录

   为了避免权限等一些不必要的麻烦采用如下操作

su - hdfs << EOF
  hadoop fs -rmr /bak;
  hadoop fs -mkdir -p /bak;
  hadoop fs -chmod -R 777 /bak;
exit;
EOF

 (3)put上传本地文件到HDFS集群

hadoop fs -put /home/centos/opt/student /bak

(4) 查看上传到HDFS中的文件

[root@bigdata-1 opt]# hadoop fs -ls /bak

 

4.2 导入数据到HBase集群

(1)先建立一张与原来一样的表。如student表

create 'student','infor'

   结果如下:

(2)采用HBase的import工具将数据导入

hbase org.apache.hadoop.hbase.mapreduce.Import student /bak/student 

  执行结果如下:

(3) 导入结束后查看数据是否导入成功

可以看到数据已经被成功导入。

(4)数据导入时需要注意的问题

  • 如果数据体量比较大的时候可以采用bulkload的方式将数据导入,导入时先生成HFile文件再load进去
  • 如果实际导入的数据量较大,需要进行优化工作,修改map及reduce的内存大小,配置mr任务,及yarn容器的一些参数等,这需要具体问题具体分析

5.小 结

   本文主要讲解Hbase数据备份及迁移方法,备份主要采用Hbase自带的工具Export进行备份,该备份工具结合shell脚本可有效的实现Hbase层的增量备份与全量备份,对于备份好的数据需要实现不同网络之间集群的数据迁移时可以采用Import工具进行数据导入,文章给出了完整的数据备份及迁移解决方案,并在实际中得到了良好的应用。

欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路

 

 

你可能感兴趣的:(Hbase,hbase,大数据)