hbase数据迁移到另一集群上 - 融融一生

时间:2024-03-05 07:19:46

hbase数据迁移到另一集群上

通常我们都会有将hbase表数据迁到另一个hbase表中业务需要,这种不要着急,我选择一种最适合的方式,因为每种方式处理的数据量、对集群的压力都是有差异的

总的划分可以分为命令行和API两种方式,本人记录以下几种命令方式,有错误之处请指正,本篇也仅是自己一些行为记录

hbase数据 导出 导入
----------------------使用命令-------------------------1

从一个HBase上把数据export到HDFS生产文件a,再把这个文件a上传到要导入的集群上,使用import导入到数据库中,注意数据库中的表名是否存在

hbase org.apache.hadoop.hbase.mapreduce.Driver export t_gps_std_20190225 hdfs:///tmp/zyr/t_gps_std_20190225

hbase org.apache.hadoop.hbase.mapreduce.Driver import t_gps_std_20190225 hdfs:///tmp/hbasedatabak/part-m-00000

--------------带参数的方式--------------------------2

-D hbase.mapreduce.scan.row.start=<ROWSTART>
-D hbase.mapreduce.scan.row.stop=<ROWSTOP>
Export [-D <property=value>]* <tablename> <outputdir> [<versions> [<starttime> [<endtime>]] [^[regex pattern] or [Prefix] to filter]]
hbase org.apache.hadoop.hbase.mapreduce.Driver export -D hbase.mapreduce.scan.row.start=0 -D hbase.mapreduce.scan.row.stop=1000?* t_gps_sq_20190424 hdfs:///tmp/zyr/t_gps_sq_20190424_
hbase org.apache.hadoop.hbase.mapreduce.Driver export -D hbase.mapreduce.scan.row.start=\xAD\x5C\xAC\xF6w -D hbase.mapreduce.scan.row.stop=\xAD\x5C\xAD1\xFF?* t_gps_sq_20190424 hdfs:///tmp/zyr/t_gps_sq_20190424___

HBase表快

--------------HBase表快照功能--------------------------3

HBase快照允许管理员不拷贝数据,而直接克隆一张表,这对域服务器产生的影响最小。将快照导出至其他集群不会直接影响到任何服务器

  1.开启快照功能,在hbase-site.xml文件中添加如下配置项:

<property>

<name>hbase.snapshot.enabled</name>

<value>true</value>

</property>

2.命令操作

在hbase shell中使用 clone_snapshot,delete_snapshot, list_snapshots, restore_snapshot, snapshot命令。

snapshot: 为某表创建快照 ,例如 snapshot ‘harve_role’,\'20180108-harve_role\'

list_snapshots:查看快照列表  

list_snapshots \'map.*\' : 查找以map开头的snapshot

delete_snapshot:删除快照,例如 delete_snapshot \'20180108-harve_role\'

clone_snapshot:基于快照,clone一个新表。例如 clone_snapshot \'20180108-harve_role\', ‘harve_role2’

restore_snapshot:基于快照恢复表  例如:disable ‘harve_role’    restore_snapshot \'20180108-harve_role\'

工具ExportSnapshot:

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot t_fault_20200327 -copy-to hdfs://mine:8020/hbase/ -mappers 16

执行该命令后,在mine:9000的hdfs中会把t_fault_20200327文件夹copy到/hbase/.hbase-snapshot文件下,进入mine这个hbase集群,执行list_snapshots会看到有一个快照: t_fault_20200327,通过命令clone_snapshot可以把该快照copy成一个新的表,不用提前创建表,新表的region个数等信息完全与快照保持一致。

在使用snapshot把一个集群的数据copy到新集群后,应用程序开启双写,然后可以使用Export工具把快照与双写之间的数据导入到新集群,从而实现数据迁移,为保障数据不丢失,Export导出时指定的时间范围可以适当放宽。

具体操作如下:

(1)创建snapshot

    snapshot \'tableName\', ‘snapshotName\'

(2)迁移snapshot

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \

    -snapshot snapshot_src_table \

    -copy-fromhdfs://analye6/hbase\

    -copy-tohdfs://mine:8020/hbase\

    -mappers 20 \

    -bandwidth 1024

    这种方式用于将快照表迁移到另外一个集群的时候使用,使用MR进行数据的拷贝,速度很快,使用的时候记得设置好bandwidth参数,以免由于网络打满导致的线上业务故障。

(3)恢复snapshot

restore_snapshot ‘snapshotName’

    备注:这种方式需要对表进行过disable才能进行restore_snapshot的操作,如果这个还在写入数据,则需要采用bulkload的方式导入。

(4)将snapshot使用bulkload的方式导入

hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles \

    -Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=1024 \

    hdfs://analye6/hbase/archive/datapath/tablename/filename tablename

    备注1:这种方式需要将所有的文件进行遍历并全部通过bulkload导入,上面的只是一个文件的导入,这种方式不需要disable表。

    备注2:上面的操作1、3、4都是在hbase shell中执行。

Hbase数据迁移之bulkload

与HBase原生Client API和Mapreduce任务(快照、导入命令都基于MR)相比,“Bulk Loading”方法直接生成HFile算是一种比较高效便捷的方法

BulkLoad将数据批量导入HBase中。支持通过命令行API两种操作方式,下面注意记录本人使用命令方式

1、数据准备

准备StoreFile存储格式的文件,通过下面任意一个方式都可得到,

  1)自己Mapreduce得到

  2)如果测试可以copy一个hbase表的文件

操作步骤:

需要导入hbase表的数据保存到hdfs文件系统中,文件 --> hdfs

在hbase中建表,create \'tablename\',\'familyname\'

2、导入数据到hbase表里

ImportTsv命令,该命令是把tsv文件转成hfile文件再导入表中,通常在使用该命令时注意列族,文件大小划分等参数设置,

直接导入表中:
hadoop jar /opt/cloudera/parcels/CDH/jars/hbase-server-1.0.0-cdh5.4.0.jar importtsv
\-Dimporttsv.separator="," 
\-Dhbase.hregion.max.filesize=20971520  
\-Dimporttsv.columns=HBASE_ROW_KEY,familyname:cellname tablename 
\/test/test.cvs
或者
导入到hfile文件中
export HBASE_HOME=/opt/hbase
export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath`
${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/lib/hbase-server-1.0.0-cdh5.4.0.jar importtsv 
\ -Dimporttsv.separator=","  
\ -Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:age tablename 
\ -Dimporttsv.bulk.output=/test/bulkload/outputdir
\/test/bulkload/simple1.cvs

CompleteBulkLoad命令,该命令将importtsv或HFileOutputFormat的结果文件导入到某张表中

示例:
hadoop jar hbase-VERSION.jar completebulkload [-c /path/to/hbase/config/hbase-site.xml] /myfile mytable
实例:
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles -Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=64 /file tablename 
或者
sudo -u hbase hadoop jar $HBASE_HOME/hbase-server-1.2.0-cdh5.15.1.jar completebulkload -Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=1024 /file tablename

使用中出现错误记录

(1)找不到jar包时处理:导入环境

export HBASE_HOME=/opt/hbase
export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath`
或者CDH版本使用
export HADOOP_CLASSPATH=/opt/cloudera/parcels/CDH/lib/hbase/lib/*

(2)目录结构

保存目录格式符合 **/列族名/hfile 规则,仅仅适合一次对单列族组织成HFile文件

(3)文件权限

sudo hdfs hdfs dfs chown hbase:hbase /test/hfile/f0
hdfs dfs chmod 711 /test/hfile/f0

  (4)文件个数太多

错误:Trying to load more than 32 hfiles to one family of one region

执行命令时带参数一次性导入多个文件,默认是32个
 -Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=1024

3、查看导入的数据

 scan \'t1\', {COLUMNS => [\'f0\'], LIMIT => 10}

4、小结

importtsv工具的使用场景较为广泛,适应于用户有时希望自己编程生成数据,或以其它格式导入数据,importtsv须要在导入前确定每条数据column维度。须要对工具改造时查看ImportTsv.java和HFileOutputFormat的javaDoc文档。

completebulkload工具同样可以编程化实现,需要查看LoadIncrementalHFiles类