总结一下这两天hbase迁数据的过程
- Import导入
直接使用import导入hbase的时候实在太慢,并且占用的yarn资源也很多,对yarn上的其他应用资源的申请影响很大 - bulkload导入
后来改用先生成hfile,然后用LoadIncrementalHFiles导入,用import和importTsv都可以生成hfile,但是这样也有个问题就是生成的storefile很大,并且有序的,所以一个storefile的导入总会让hbase某一个regionserver负载比较高,使用上去也没想像中那么快,可能是单个磁盘本身的读写速度也慢 - 直接拷贝数据文件
后来又想hbase版本一样,应该可以直接把表的数据文件拷贝新集群的,然后添加一下meta表的信息,于是试了一下,现做下记录。
使用distcp拷贝
在老集群上直接执行distcp拷贝表的时候容易出现Filenotfound的异常,出现几次然后任务就退出来,因为region的数据文件名由于compact会变化。暂时的解决办法是用cp拷贝一个副本,考副本的时候也会报这个错但是不会退出来,之后可以根据错误信息再单独拷贝一下子文件。
然后使用distcp把表的副本直接拷贝到新集群的/hbase/data/namespace/下,
使用hbck修复元数据
hbck 命令可以添加很多参数
hbase hbck 只做检查
hbase hbck -fixMeta 根据region目录中的.regioninfo,生成meta表`
hbase hbck -fixAssignments 把meta表中记录的region分配给regionserver
hbase hbck -fixHdfsOrphans 修复.regioninfo文件
具体参数详见 http://blackproof.iteye.com/blog/2052898
hbase hbck -fixMeta
执行完这个命令后,在hbase shell 中list ‘tablename’可以查到该表。
但是scan查不到具体数据。
hbase hbck -fixAssignments
执行这个命令后,使用scan就能查到具体数据
执行完命令后会看到每个表的状态Table name is okay,说明修复完成。
我执行命令的时候出现Table name is inconsistent.查看具体错误提示多个region有相同的startrow,说明拷贝表的时候有的表在split
删除在hdfs上重复的region,或者把重复的storefile移动到另一个region中,在meta表上删除对应的记录