一、前言

HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分为以下几类:

1


图1.HBase数据迁移方案

从上面图中可看出,目前的方案主要有四类,Hadoop层有一类,HBase层有三类。下面分别介绍一下。

二、Hadoop层数据迁移 2.1 方案介绍

Hadoop层的数据迁移主要用到DistCp(Distributed Copy), 官方描述是:DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具。 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。

我们知道MR程序适合用来处理大批量数据, 其拷贝本质过程是启动一个MR作业,不过DisctCp只有map,没有reducer。在拷贝时,由于要保证文件块的有序性,转换的最小粒度是一个文件,而不像其它MR作业一样可以把文件拆分成多个块启动多个map并行处理。如果同时要拷贝多个文件,DisctCp会将文件分配给多个map,每个文件单独一个map任务。我们可以在执行同步时指定-m参数来设定要跑的map数量,默认设置是20。如果是集群间的数据同步,还需要考虑带宽问题,所以在跑任务时还需要设定 bandwitdh 参数,以防止一次同步过多的文件造成带宽过高影响其它业务。同时,由于我们HBase集群一般是不会开MR调度的,所以这里还需要用到单独的MR集群来作主备数据同步,即在跑任务时还需要指定mapreduce相关参数。

简单的distcp参数形式如下:

hadoop distcp hdfs://src-hadoop-address:9000/table_name hdfs://dst-hadoop-address:9000/table_name

如果是独立的MR集群来执行distcp,因为数据量很大,一般是按region目录粒度来传输,同时传输到目标集群时,我们先把文件传到临时目录,最后再目的集群上load表,我们用到的形式如下:

hadoop distcp \ -Dmapreduce.job.name=distcphbase \ -Dyarn.resourcemanager.webapp.address=mr-master-ip:8088 \ -Dyarn.resourcemanager.resource-tracker.address=mr-master-dns:8093 \ -Dyarn.resourcemanager.scheduler.address=mr-master-dns:8091 \ -Dyarn.resourcemanager.address=mr-master-dns:8090 \ -Dmapreduce.jobhistory.done-dir=http://www.likecs.com/history/done/ \ -Dmapreduce.jobhistory.intermediate-done-dir=http://www.likecs.com/history/log/ \ -Dfs.defaultFS=hdfs://hbase-fs/ \ -Dfs.default.name=hdfs://hbase-fs/ \ -bandwidth 20 \ -m 20 \ hdfs://src-hadoop-address:9000/region-hdfs-path \ hdfs://dst-hadoop-address:9000/tmp/region-hdfs-path

在这个过程中,需要注意源端集群到目的端集群策略是通的,同时hadoop/hbase版本也要注意是否一致,如果版本不一致,最终load表时会报错。

2.2 方案实施

迁移方法如下:
第一步,如果是迁移实时写的表,***是停止集群对表的写入,迁移历史表的话就不用了,此处举例表名为test;
第二步, flush表, 打开HBase Shell客户端,执行如下命令:

hbase> flush \'test\'

第三步,拷贝表文件到目的路径,检查源集群到目标集群策略、版本等,确认没问题后,执行如上带MR参数的命令
第四步, 检查目标集群表是否存在,如果不存在需要创建与原集群相同的表结构
第五步,在目标集群上,Load表到线上,在官方Load是执行如下命令:

hbase org.jruby.Main add_table.rb /hbase/data/default/test

对于我们来说,因我们先把文件同步到了临时目录,并不在原表目录,所以我们采用的另一种形式的load,即以region的维度来Load数据到线上表,怎么做呢,这里用到的是org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles这个类,即以bulkload的形式来load数据。上面同步时我们将文件同步到了目的集群的/tmp/region-hdfs-path目录,那么我们在Load时,可以用如下命令来Load region文件:

hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles -Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=1024 hdfs://dst-hadoop-address:9000/tmp/region-hdfs-path/region-name table_name

这里还用到一个参数hbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily, 这个表示在bulkload过程中,每个region列族的HFile数的上限,这里我们是限定了1024,也可以指定更少,根据实际需求来定。
第六步,检查表数据是否OK,看bulkload过程是否有报错

在同步过程中,我们为加块同步速度,还会开个多线程来并发同步文件,这个可根据实际数据量和文件数来决定是否需要使用并发同步。

三、HBase层数据迁移 3.1 copyTable方式

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgfxww.html