记一次HBase进行数据迁移,重建元数据

  • 前情提要
  • 正文
  • 数据迁移
  • 重建元数据
  • 测试查询
  • 后续的表修复
  • Multiple regions have the same startkey
  • Region not listed in hbase:meta or deployed on any region server.
  • Region state=FAILED_OPEN
  • Region not deployed on any region server
  • There is an overlap in the region chain
  • Region found in META, but not in HDFS or deployed on any region server
  • 拷贝过程的其它问题
  • Distcp失败
  • Distcp调优


这次检查出来不少文件打印显示都是 openforwrite状态,而且Status为CORRUPT。经测试发现,这些文件无法get和cat。所以这里的“ Cannot obtain block length for LocatedBlock ”结合字面意思讲应该是当前有文件处于写入状态尚未关闭,无法与对应的datanode通信来成功标识其block长度。于是我也尝试使用openforwrite检查,发现确实对应的块是CORRUPT状态: 于是我直接对待拷贝数据的全目录再进行了一次扫描,对于异常数据直接delete: 处理以后再次进行同步旧不会报错了:数据删除是敏感操作,笔者是因为集群数据本身异常不能提供服务,经过沟通确认后以最快保证业务恢复为目的而进行的删除操作,作为运维人员一定要对数据安全保有敬畏之心!

Distcp调优

使用Distcp过程中,遇到数据同步比较慢的情况,尝试了一些参数,直观感受是提高了同步速度,记录一下:

  • 增加map数,-m 100,默认会使用20个map,在数据量较大的时候,提速效果明显;
  • -Dmapreduce.map.memory.mb=4096 增加map的容器内存,默认是1024M;
  • -Dmapreduce.reduce.memory.mb=4096 增加reduce的容器内存,默认是1024M;

最终使用命令:

hadoop distcp -Dmapreduce.map.memory.mb=4096 -Dmapreduce.reduce.memory.mb=4096 -m 100 hdfs://10.1.1.1:9000/hbase/data/default/tablename /hbase/data/default/