线上HBASE表数据离线迁移实战

使用export/import进行数据迁移

由于线上服务器底层虚拟机要从VMWare切换为ZStack,需要对线上的HBASE集群数据进行离线迁移。使用HBase自带的Export/Import实现,这种方法可以支持网络不通的集群之间的数据迁移。迁移步骤是先利用Export将需要数据迁出的HBase表数据转换成文件存入HDFS中,然后通过get命令将HDFS上的文件下载到本地文件中,在将文件拷贝到需要数据迁入的集群上,通过put把拷贝的本地文件上传至目标集群的HDFS中,最后利用Import命令将目标集群HDFS中的数据导入到HBase表。以上过程需要MapReduce的支持,所以需要启动yarn。

迁移前参数调优

我在实测的时候发现,执行import命令导入数据到hbase表中的时候经常会报错:Error: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 6 actions: org.apache.hadoop.hbase.RegionTooBusyException: Over memstore limit=256.0M。导入效率非常低。CDH平台上也会有RegionServer写入负荷过高的隐患报警。
在这里插入图片描述

排查后发现是由于RegionServer 会分配一定大小的内存给它下面的所有memstore(内存大小为hbase.hregion.memstore.flush.size * hbase.hregion.memstore.block.multiplier),默认的hbase.hregion.memstore.flush.size=128M, hbase.hregion.memstore.block.multiplier=2。
import导入数据的时候短时间内写入数据量过大,导致memstore内存溢出触发hbase的写入保护机制,hbase会block所有写入请求,并flush region释放所有memstore占用的内存。 这时候会抛异常,写入请求会被拒绝,客户端开始重试请求,导致写入效率非常低。

解决方案是暂时调大RegionServer分配的memstore内存大小,修改以下两个参数:

# 参数详解:
# hbase.hregion.memstore.flush.size: 如 memstore 大小超过此值(字节数),Memstore 将刷新到磁盘。通过运行由 hbase.server.thread.wakefrequency 指定的频率的线程检查此值。
# hbase.hregion.memstore.block.multiplier: 超过memstore大小的倍数达到该值则block所有写入请求,自我保护
hbase.hregion.memstore.flush.size=512M
hbase.hregion
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值