Hbase数据迁移

HBase数据迁移100TB级别方案
已邀请:

qgxiaozhan

赞同来自: chunzi openinx libis

贴一些之前的笔记,希望有用。

思路一: 利用replication 和 snapshot  完成数据迁移, 业务自动切换
步骤:
1. 建立两个集群的replication,主从(待迁移集群----> 新集群)
2. 在新集群新建跟老集群一样的表, 并开始同步
3. 暂停同步, 利用snapshot , 将老集群的表做一份快照, 例如表A
     (1)list_snapshots
     (2)snapshot 'A', 'A_snapshot'
     (3)hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot A_snapshot -copy-to hdfs://新集群:8020/hbase -mappers 16 
      完成之后, 在新集群导入snaphsot
      (1)disable ‘A'
      (2)restore_snapshot ‘A_snapshot’ 
      (3)enable ‘A' 
4. 继续同步, 完成迁移, 业务选时间迁移 

思路二: 利用bulkload
在老集群新建一个表, 切流量, 利用bulkload 补数据 
 
思路三:

基本思路就是首先拷贝并复制snapshot到目的集群,然后开启两个集群间的数据实时同步,最后,将创建snapshot到开启数据同步之间的数据通过MR任务拷贝。

以表test_table为例:

1、添加原集群到目标集群的replication关系,并在目标集群中建立与原集群相同的表;

2、通过snapshot把历史数据导入到从集群:
在原集群执行以下指令:
a、list_snapshots
b、snapshot ‘test_table’, ‘test_table_snapshot'
c、bin/hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot test_table_snapshot -copy-to hdfs://yourdestination:9100/hbase -mappers 16
在目标集群执行以下指令:
a、disable ‘test_table'
b、restore_snapshot ‘test_table_snapshot’
c、enable 'test_table'

3、开启原表的replication
原集群执行:
alter ‘test_table’,{NAME=>’f’,REPLICATION_SCOP=>’1’}

4、通过Export工具把快照和开启replication之间的数据导入到从表;
在原集群执行以下指令:
bin/hbase org.apache.hadoop.hbase.mapreduce.Export test_table hdfs://yourdestination:9100/import/test_table 1 1445961600000 1446048000000
1:指定了版本数,与线上一致
1445875200000 1445961600000:指定了起始时间戳
在目标集群执行以下指令:
bin/hbase org.apache.hadoop.hbase.mapreduce.Import test_table hdfs://yourdestination:9100/import/test_table
 
 

openinx - HBase Committer @小米

赞同来自: chunzi qgxiaozhan oracle

@qgxiaozhan 
已经介绍了几种思路,其中一般对于数据量比较大的数据迁移情况,最好使用Snapshot的方式,因为直接copy HFile的方式一个是效率比较高,另外一个是直接通过hdfs接口进行拷数据,不需要经过hbase 的region server层面交互,失败率更低.
对于表数据量比较小的情况,例如小于1G这种情况,采用CopyTable的方式也行,但对于大表来说,CopyTable并不适合,因为容易失败,而且会对线上集群造成较大的qps.
 
@SuperDong

介绍的distcp的方式,并不是一个很好的方式.因为本质上distcp其实也是像cloneSnapshot一样通过拷贝HDFS上的hfile来到达迁移数据的目的.另外,distcp应该是没法保证数据是某一个时间点的快照的? 也就没有办法保证数据的一致性.从这点上说,snapshot肯定是能保证数据一致性的,另外,snapshot还考虑到某些情况下需要拷贝HLog到目的集群上.
 
为什么需要从源集群拷贝Hlog到目的集群呢?
因为可能存在这样的特殊情况,例如一个region之前是跑在RegionServer-A上的,但是后面由于RegionServer-A挂了,region正在被move到RegionServer-B上,这个Region的Hlog被split了,但是还没有Replay的时候,用户发起了一个创建snapshot请求,这时候,是有必须要把这部分没有apply的hlog拷贝到目的集群上去.要不然,就可能丢数据,丢失的数据就是未applied的region的hlog数据.
 
ExportSnapshot工具已经为我们考虑了这个因素,所以,我强烈推荐迁移数据采用ExportSnapshot, 不要去通过distcp迁移数据,因为大概率会丢数据,而且丢了数据基本上都不知道怎么回事.
 

igloo1986

赞同来自: qgxiaozhan

 
 集群间迁移数据,主要有两种方式,一种是通过hbase接口做数据写入,一种是bulkload的方式,前者适用于小数据集合,后者适用于大数据集合,前者的好处是,数据使用api写入,本地化率在新集群有保证,后者速度快,适合大数据量,但是完成后需要做majorcompact。根据经验,大小数据量的threshold按照8G做划分。大于8G认为时候后者的方式做迁移。




背景

假设现在有A,B两个集群,clusterkey分别为 hostA:2181:/hbase hostB:2181:/hbase
A,B集群的rootdir分别为:hdfs://hostA:8020/user/hbase, hdfs://hostB:8020/user/hbase
需要迁移的表名为 TableX
业务在A集群有数据读写




小数据表迁移方案

t0时刻,在A集群建立到B集群的peer add_peer '1',  'hostB:2181:/hbase‘; enable_table_replication 'TableX'
t1时刻,hbase org.apache.hadoop.hbase.mapreduce.CopyTable -Dmapreduce.job.running.map.limit=1 --peer.adr=hostB:2181:/hbase TableX
待2完成后,t2业务停止对B集群写入
t3时刻,待A集群中的异步复制流量停止写入(主备集群数据已经一致)后,业务迁移到A集群
A集群 disable_table_replication 'TableX'

大数据表迁移方案

t0 时刻,在A集群建立到B集群的peer add_peer '1',  'hostB:2181:/hbase‘; enable_table_replication 'TableX'
t1 时刻,A集群执行  disable_peer '1'
t2 时刻,创建 snapshot, snapshot 'TableX', 'TableX_snapshot'
t3 时刻,做export snapshot, bin/hbase  org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot 'TableX_snapshot' -copy-to hdfs://hostB:8020/user/hbase -mappers 16
B集群shell中 list_snapshots, 并且执行 restore_snapshot 'TableX_snapshot'
t4时刻,A集群执行 enable_peer '1'

SuperbDong

赞同来自:

非官方的做法

1.在目标集群建一个一样region分区的表

2.打开源集群到目标集群的replication

3.flush源集群的表

4.源集群的hfile distcp 到目标集群

5.在目标集群bulkload hfile

libis - HBase爱好者

赞同来自:

通常情况下就snapshot,一个表一个表来就可以

hmaster

赞同来自:

0.96是否可以s0.96是否可以snapshot 到1.1中?

hmaster

赞同来自:

通过snapshot 迁移比较靠谱,简单安全性能好。
100T视集群规模以及网卡速度决定。一个之前的案例:0.96到1.1.3
首先打通两个集群的网络。/etc/hosts
假如新集群的hbase.rootdir为/hbase/
hbase>flush 'tablename'
habse>snapshot 'tablename','tablename_sp_timestamp'
hbase --config hbase/conf:hadoop/conf org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot {tablename_sp_timestamp} -copy-to /hbase
注意copy-to的位置是新的集群的hbase.rootdir
导出快照的描述以及数据目录如下:
/hbase/data/.hbase-snapshot
/hbase/data/archive
如果有权限问题的话,先授权777,后面再恢复权限
hdfs dfs -chmod -R 777 /hbase/data/.hbase-snapshot ;
hdfs dfs -chmod -R 777 /hbase/data/archive ;
 
假如新集群hbase目录用户权限为(hbase:hdfs)
修改回来如下:
hdfs dfs -chmod -R 755 /hbase/data/.hbase-snapshot;
hdfs dfs -chmod -R 755 /hbase/data/archive ;
hdfs dfs -chown -R hbase:hadoop /hbase/data/.hbase-snapshot;
hdfs dfs -chown -R hbase:hadoop /hbase/data/archive ;
恢复快照
hbase>list_snapshots
hase>restore_snapshot 'snapshot_name'
 
一些问题解决:
 
1、如果执行export 报failde to copy xxx,可能是原集群没有访问新集群hbase目录的权限,解决办法如上。
2、如果exportsnapshot 导出失败的话,可能需要先删除新集群的/hbase/data/.hbase-snapshot/.tmp/{snapshotname},然后 重新执行
3、java.lang.ClassNotFoundException 等类似这种错误,
可能是hbase 执行的MRclasspath未设置
yarn-site.xml中的yarn.application.classpath 添加hbase /lib 目录路径
mapred-site.xml中的mapreduce.application.classpath 添加hbase /lib 目录路径
 
 
 
 

要回复问题请先登录注册