记一次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/