用Export和Import工具来迁移不同版本HBase之间的数据
1. 前言
有关HBase数据迁移的方案,零零总总不下好几种。如最简单的CopyTable,最高效的ExportSnapshot,最方便的Replication,以及接下来要为大家重点分享的Export和Import。命令的使用很简单,这里我只是单纯地记录下解决这个问题的思路,希望能给予你启迪,也希望我能把其持续修剪,直至长成参天大树的样子。我们此次数据迁移的场景是,HBase线上集群(2.1)迁移数据至HBase灾备集群(1.2),由于是跨大版本的数据迁移,在我们以往的测试中,CopyTable和ExportSnapshot两种方案直接就被pass掉了(可能是由于两个版本的HBase的底层HFile文件格式的不兼容,这两种方式都无法达到预期的效果)。又由于涉及大量历史数据的迁移,Replication显然也不合适。在确定使用Export/Import的数据迁移方案之前,我们还测试了用Spark读HBase表转换成RDD,然后再生成HBase的底层文件——HFile,最后使用BulkLoad的命令,实现数据的快速导入。但在具体测试的时候,不管是使用cdh的hbase-spark模块,还是使用shc的spark读HBase,貌似都逃不掉数据倾斜的命运。两种方案的源码实现我没有深究,但应该大致应该类似,利用spark scan hbase 的表转换成RDD,每一个region的数据放进每一个RDD的partition下(我们设置的每一个region的最大大小是20G),RDD做shuffle的过程中,会报如下异常:网上的解释是这样的:
暂时没有找到更好的方法来解决这个问题,所以,Spark读HBase的这种方式暂时还停留在理论层面。最终,在已知的数据迁移方案里,Export和Import工具能满足我们跨版本的数据迁移需求,虽然它的效率很慢,对集群的影响也很大,但由于是灾备集群,这种缺点还在忍受的范围之内。
2. 我们的集群环境
在正式介绍相关命令使用的同时,还是先说一下我们集群的版本等软件环境,避免因为版本的差异,出现本文我没有记录到的异常。灾备集群HBase版本HBase 1.2.0-cdh5.13.1灾备集群Hadoop版本Hadoop 2.6.0-cdh5.13.1
线上HBase集群版本HBase 2.1.0-cdh6.3.2线上Hadoop集群版本Hadoop 3.0.0-cdh6.3.2
3. Export的命令介绍
Export命令运行时会根据设置的scan条件来扫描HBase的表,然后转换成SequenceFile的形式,SequenceFile只是纯粹的K,V格式的数据文件,它与HBase的版本无关。其内容大致如下图所示:rowkey 列簇名 字段名 数据
3.1 Export命令的基本使用
运行如下命令查看Export工具的基本使用:
hbase org.apache.hadoop.hbase.mapreduce.Export -help
命令用法以及参数的解读如下(不同版本命令差异不大):
Usage: Export [-D ]* [ [ []] [^[regex pattern] or [Prefix] to filter]]
扫描行存在两种过滤器,正则表达式和前缀
输出SequenceFile的压缩形式
-D mapreduce.output.fileoutputformat