使用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