HBase业务表重新构建

举报
Pan-Xing 发表于 2023/07/11 15:08:45 2023/07/11
【摘要】 我们在遇到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/列族名1hdfs 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下默认只能最大有32hfile文件,默认的hfile的文件大小最大为1G,也就是说一个region里面最多只能放32G,一个批次最大的量就是32G,这样远远不能解决问题,所以需要调大相应的参数来解决问题。

1.2     删除快照

确定数据恢复完成,业务验证无问题后删除hdfs上的快照,hdfs dfs -deleteSnapshot /tmp/TABLENAME TABLENAME_snap

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。