加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

HBase数据迁移方案介绍

发布时间:2019-08-09 12:15:30 所属栏目:MySql教程 来源:ballwql
导读:副标题#e# 一、前言 HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分为以下几类: 图1.HBase数据迁移方案 从上面图中可看出,目前的方案主要有四类,Hadoop层有一类,HBase层有三类。下面分别介绍一下。 二、Hadoop层数据迁移 2.1 方案介绍 Had
副标题[/!--empirenews.page--]

一、前言

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

HBase数据迁移方案介绍

图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参数形式如下:

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

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

  1. hadoop distcp   
  2. -Dmapreduce.job.name=distcphbase   
  3. -Dyarn.resourcemanager.webapp.address=mr-master-ip:8088    
  4. -Dyarn.resourcemanager.resource-tracker.address=mr-master-dns:8093     
  5. -Dyarn.resourcemanager.scheduler.address=mr-master-dns:8091     
  6. -Dyarn.resourcemanager.address=mr-master-dns:8090    
  7. -Dmapreduce.jobhistory.done-dir=/history/done/    
  8. -Dmapreduce.jobhistory.intermediate-done-dir=/history/log/   
  9. -Dfs.defaultFS=hdfs://hbase-fs/   
  10. -Dfs.default.name=hdfs://hbase-fs/   
  11. -bandwidth 20   
  12. -m 20   
  13. hdfs://src-hadoop-address:9000/region-hdfs-path   
  14. hdfs://dst-hadoop-address:9000/tmp/region-hdfs-path 

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

2.2 方案实施

迁移方法如下:

第一步,如果是迁移实时写的表,最好是停止集群对表的写入,迁移历史表的话就不用了,此处举例表名为test;

第二步, flush表, 打开HBase Shell客户端,执行如下命令:

  1. hbase> flush 'test' 

第三步,拷贝表文件到目的路径,检查源集群到目标集群策略、版本等,确认没问题后,执行如上带MR参数的命令

第四步, 检查目标集群表是否存在,如果不存在需要创建与原集群相同的表结构

第五步,在目标集群上,Load表到线上,在官方Load是执行如下命令:

  1. 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文件:

  1. 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方式

copyTable也是属于HBase数据迁移的工具之一,以表级别进行数据迁移。copyTable的本质也是利用MapReduce进行同步的,与DistCp不同的时,它是利用MR去scan 原表的数据,然后把scan出来的数据写入到目标集群的表。这种方式也有很多局限,如一个表数据量达到T级,同时又在读写的情况下,全量scan表无疑会对集群性能造成影响。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读