HBase业务表重新构建
1 适用情况
1.1 需要重新规划表预分区。
1.2 表出现问题,且无法使用hbck命令无法修复,可以使用该方法重新构建表恢复数据。
2 注意
2.1 需要重构的表,操作前先将表disable。
2.2 如果原生页面没有表描述信息和region信息需要提前获取表的建表语句。
2.3 如果是Phoenix表,需要获取Phoenix的建表语句。
2.4 重构的表如果存在索引,需要索引语句。
2.5 如果需要重新规划表预分区,需要考虑当前的数据均衡情况,防止重新构建表后region频繁分裂;
2.6 提前了解业务对表的使用,ES索引查询,hive外表等。
3 操作步骤
3.1 HBase原生页面记录表描述信息;
1.1 记录表region信息和start key信息;
- 将Name栏下的信息全部复制到文本中,一个regionname为一行,不要有空白行,将文件保存在客户端节点上,如/opt/hadoopclient/HBase/region.txt;
- 将start key复制到文本中,一个key为一行,不要有空白行,将文件保存在客户端节点上,如/opt/hadoopclient/HBase/splitkey.txt;
- 如果需要重新规划表预分区,可以调整/opt/hadoopclient/HBase/splitkey.txt中预分区的规划。
1.2 移动表目录至临时目录下;
hdfs dfs -mv /hbase/data/NAMESPACE/TABLENAME /backup/tmp/
1.3 对临时目录下的表数据打快照;
hdfs dfsadmin -allowSnapshot /backup/tmp/TABLENAME
hdfs dfs -createSnapshot /backup/tmp/TABLENAME TABLENAME_snap
1.4 修复元数据meta表;
1.4.1 如果需要重构的表在2.1步骤中能正常disable,上述步骤执行完之后,直接在hbase shell里面执行 drop ‘表名’,正常删除旧表,list查看旧表是否删除,如果旧表能正常删除,则不用修复meta表,直接从3.6步继续操作。删表之前务必确认HDFS上的表数据已经按照3.3的步骤挪走。
1.4.2 删除zk上表信息;
deleteall /hbase/table/TABLENAME
deleteall /hbase/table-lock/TABLENAME
1.4.3 使用hbck命令修复
hbase hbck –fixMeta TABLENAME >LOG_LOGFILE
优先命令修复,如果使用-fixMeta无法删除meta表中记录的region信息,备份Meta表,按照3.6.2步骤手动删除meta表中的相关表记录。
1.4.4 手动修复
(1) 备份meta表信息;
hdfs dfs -cp –r /hbase/data/hbase/meta/1588230740/info/ /backup/metainfohfile/
(2) 删除meta表中异常表的信息;
删除表状态信息:
delete 'hbase:meta','TABLENAME','table:state'
删除region信息:
cat /opt/hadoopclient/HBase/region.txt | while read line;do echo "deleteall 'hbase:meta','$line'"|hbase shell;done;
(3) 删除完成后检查meta表中是否还有异常表信息残留,如果还有残留重复步骤(2)。
scan 'hbase:meta',{ROWPREFIXFILTER => 'TABLENAME'}
1.5 重新创建同名同结构表;
1.5.1 HBase表
1)表结构复制步骤一Description中的信息;
2)Region预分区使用步骤二中获取的start key信息。例如:
create 'TABLENAME', {NAME => 'CF', COMPRESSION => 'SNAPPY', METADATA => {'IN_MEMORY_COMPACTION' => 'NONE'}}, SPLITS_FILE =>
'/opt/hadoopclient/HBase/splitkey.txt'
1.5.2 Phoenix表
- 直接在Phoenix客户端使用原表建表语句创建新表;
- 如果没有Phoenix建表语句,可以先按照7.1创建HBase表,再将Phoenix的相关协处理器手动加载上,但是前提是Phoenix里面还保留有原表及相关的索引表。手动加载协处理器前先disable表,再进行加载,表结构里面有几个协处理器就需要加载几个,例如:
alter 'INDEX_TEST', METHOD => 'table_att', 'Coprocessor'=>'|org.apache.phoenix.coprocessor.ServerCachingEndpointImpl|805306366|'
1.6 将数据导入新表
1.6.1 方法一:遍历所有region目录将所有HFile文件导入到新表(适合region数少的情况)
- 获取临时路径下表所有region目录:
hdfs dfs -ls /backup/tmp/TABLENAME/ |awk -F '/' '{if($0 ~/^d/ && $NF!="hbase") print $NF}'| egrep -v "(.tmp|.tabledesc)" > /tmp/region.txt
- 重新将移走的数据bulkload至新表中:
cat /tmp/region.txt | while read line;do hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /backup/tmp/TABLENAME/$line
TABLENAME;done;
1.6.2 方法二:将所有region下的HFile文件移动到统一目录下,一次性导入(适合region数多的情况)
- 新建目录,hdfs dfs -mkdir /backup/hfile/,有几个列族,就需要新建几个子目录,子目录名与列族名完全一致hdfs dfs -mkdir /backup/hfile/列族名1、hdfs dfs -mkdir /backup/hfile/列族名2 …..
- 将所有region下的HFile文件移动到新建目录下,
hdfs dfs -mv /backup/tmp/TABLENAME/*/列族名1/* /backup/hfile/列族名1
hdfs dfs -mv /backup/tmp/TABLENAME/*/列族名2/* /backup/hfile/列族名2
......
- 将HFile文件导入到新表,数据导入的时候表必须是enable状态
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /backup/ hfile NAMESPACE :TABLENAME
1.1.1 导入时报错
hbase的默认一个region下默认只能最大有32个hfile文件,默认的hfile的文件大小最大为1G,也就是说一个region里面最多只能放32G,一个批次最大的量就是32G,这样远远不能解决问题,所以需要调大相应的参数来解决问题。
1.2 删除快照
确定数据恢复完成,业务验证无问题后删除hdfs上的快照,hdfs dfs -deleteSnapshot /tmp/TABLENAME TABLENAME_snap
- 点赞
- 收藏
- 关注作者
评论(0)