Hbase集群迁移

Hbase集群迁移

  • 源集群A
  • 目标集群B
  • 启动迁移任务的集群C,如果AB集群的磁盘够大,也可以选择其中任意一个集群,用来启动迁移任务。
  • 数据流向:A->C->B
    分别消耗A集群的出口流量,C集群的出入流量,B集群的入口流量。由于pipeline的写入模式,流量还会在B集群内部再放大。

一、准备源集群A和目标集群B

  • 由于网络的特殊性,需要在源集群A准备配置文件~/hadoop/etc/hadoop/iptable,内容如下

10.xxx.xxx.xxx 11.xxx.xxx.xxx

xxx用真实的IP地址替换,每个IP地址一行,集群有多少台机器,就有多少行,表示将10IP转换为11IP

  • 搭建目标集群B


二、在执行迁移任务的集群C开启yarn

distcp如果使用分布式模式,依赖于yarn,需要在C集群配置和启动yarn

  • 从下载hadoop-2.7版配置到yarn集群的各个节点(主要是yarn-site.xml, yarn-env.sh, mapred-site.xml三个文件),并把yarn-site.xml中的rm.host替换为ResourceManager地址
  • hmaster节点启动ResourceManager

#yarn-daemon.sh start resourcemanager

  • regionserver节点启动NodeManager

#sbin/yarn-daemons.sh --hosts <yarn机器列表> start nodemanager


三、通知业务执行双写

四、在集群C上准备配置文件distcp.xml

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>


<!-- Put site-specific property overrides in this file. -->


<configuration>


<property>

   <name>dfs.nameservices</name>

   <value>$hdfscluster-A,$hdfscluster-B,$hdfscluster-C</value>

</property>


<property>

  <name>dfs.ha.namenodes.$hdfscluster-A</name>

  <value>nn1,nn2</value>

</property>


<property>

    <name>dfs.namenode.rpc-address.$hdfscluster-A.nn1</name>

    <valu>$Ann1ip:8020</value>

</property>


<property>

    <name>dfs.namenode.rpc-address.$hdfscluster-A.nn2</name>

    <value>$Ann2ip:8020</value>

</property>


<property>

  <name>dfs.ha.namenodes.$hdfscluster-B</name>

  <value>nn1,nn2</value>

</property>


<property>

    <name>dfs.namenode.rpc-address.$hdfscluster-B.nn1</name>

    <value>$Bnn1ip:8020</value>

</property>


<property>

    <name>dfs.namenode.rpc-address.$hdfscluster-B.nn2</name>

    <value>$Bnn2ip:8020</value>

</property>


<property>

  <name>dfs.ha.namenodes.$hdfscluster-C</name>

  <value>nn1,nn2</value>

</property>


<property>

    <name>dfs.namenode.rpc-address.$hdfscluster-C.nn1</name>

    <value>$Cnn1ip:8020</value>

</property>


<property>

    <name>dfs.namenode.rpc-address.$hdfscluster-C.nn2</name>

    <value>$Cnn2ip:8020</value>

</property>


<property>

   <name>dfs.client.failover.proxy.provider.$hdfscluster-A</name>

   <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>


<property>

   <name>dfs.client.failover.proxy.provider.$hdfscluster-B</name>

   <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>


<property>

   <name>dfs.client.failover.proxy.provider.$hdfscluster-C</name>

   <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>


<property>

  <name>fs.trash.interval</name>

  <value>10080</value>

</property>


</configuration>


五、在源集群A上关闭和恢复compactionsplit

  • 进入regionserverweb页面,进入conf,拿到regionserver当前的3个配置的值:

hbase.store.stripe.compaction.minFilesL0,默认值是4

hbase.store.stripe.compaction.minFiles,默认值是3

hbase.hstore.compaction.min,默认值是3

记录这些值,用于迁移完成后的恢复.如果没有找到,就用上面给的默认值

  • hbase shell中给表设置属性,来禁用compaction $table替换成实际的表名; split policy设置为DisabledRegionSplitPolicy来禁用表级别的split 为所有表执行以下步骤:

alter '$table', CONFIGURATION => {'hbase.hstore.compaction.min' => '9999', 'hbase.store.stripe.compaction.minFilesL0' => '9999', 'hbase.store.stripe.compaction.minFiles' => '9999'},METADATA => {'SPLIT_POLICY' => 'org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicy'}



六、检查是否还有正在跑的compactionsplit

在所有机器上执行jstack,搜索compactionsplit,如果都是waitting状态,可以认为都ok了。


七、集群复制distcp

  • 1. 在目标集群B上创建同步路径

#hadoop dfs -mkdir /idc_move

  • 2. 在集群C执行复制命令distcp

#nohup hadoop distcp -conf ./distcp.xml -m 50 -bandwidth 2 -p hdfs://$hdfscluster-A/hbase/data/default/$tablename hdfs://$hdfscluster-B/idc_move/$tablename  2>&1 > distcp.log


本地模式

如果数据量不大,可以用本地模式拷贝单线程拷贝数据,命令如下:

hadoop distcp -conf <address.xml> -bandwidth <bandwith_mb> -p <src> <dest>


分布式模式

分布式模式依赖于yarn,需要在第二步启动迁移任务的集群C配置和启动yarn

#hadoop distcp -conf <address.xml> -m <max_concurrent> -bandwidth <bandwith_mb> -p <src> <dest>

参数解释:

  • address.xml 存放有源集群与目标集群nn信息的配置文件
  • max_concurrent 最大拷贝并发数
  • bandwith_mb 线程拷贝带宽限制,单位MB/sbandwith_mb * max_concurrent就是整个集群的拷贝带宽,如果是本地模式,只能单线程拷贝,-m参数无效,这个参数就是全局的拷贝数据
  • src 源数据地址 hdfs://src-hdfs-name/src-path
  • dest 目标数据地址 hdfs://src-hdfs-name/dest-path
  • -p选项 保留源文件的block大小、存储类型信息(ONE_SSDALL_SSDetc..)


八、在源集群A恢复compaction和split

  • distcp完成后,恢复compactionsplit,进入hbase shell,为所有表执行:

alter '$table', CONFIGURATION => {'hbase.hstore.compaction.min' => 'x', 'hbase.store.stripe.compaction.minFilesL0' => 'y', 'hbase.store.stripe.compaction.minFiles' => 'z'},METADATA => {'SPLIT_POLICY' => 'org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy'}

其中,xyz是这3个参数的原始值,在步骤1中得到的。


九、在目标集群B Move所有列簇

在复制好数据的目标集群B,将hdfs的路径/$TO_LOAD_PATH/$table/region/cf*/data改成/$TO_LOAD_PATH/to_load_$table/cf*/data

#hadoop fs -mkdir -p $TO_LOAD_PATH/toload_$move_table_name/$split_table_cf

#hadoop fs -mv $TO_LOAD_PATH/$move_table_name/*/$split_table_cf/* $TO_LOAD_PATH/toload_$move_table_name/$split_table_cf/


十、在目标集群B Load数据到Hbase

  • 1. 如果Bulkload时一个Region包含的Hfile数超过32个,需要调整配置文件/home/hadoop/hbase-current/conf/hbase-site.xml

<property>

   <name>hbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily</name>

   <value>999999</value>

</property>

  • 2. Load数据到Hbase

#hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs://$hbaserootdir/$TO_LOAD_PATH/toload_$table $table

  • 3. 将内存数据写磁盘

hbase>flush $table

  • 4. Hlog重新排序

hbase>disable $table

hbase>enable $table

  • 5. region均分在所有regionserver,并清除重复数据

hbase>major_compact '$table'


十一、检查hbasemaster上各表的大小是否于原集群同等上下




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值