在HBase连续对同一个表名做删除创建操作时出现创建表异常
问题现象
在HBase连续对同一个表名做删除创建操作时,可能出现创建表异常。
原因分析
执行过程:Disable Table > Drop Table > Create Table > Disable Table > Drop Table >...
- 在Disable表时,HMaster会发送RPC请求到RegionServer,RegionServer会将相关Region下线。当RegionServer上的Region关闭所需的时间超过HBase的HMaster等待Region处于RIT状态的超时时间,HMaster会默认该Region下线,实际上该Region可能还处在flush MemStore阶段。
- 发送RPC请求关闭Region之后,HMaster会判断该表的所有Region是否下线,1的情况下关闭超时也会认为是下线,然后HMaster返回关闭成功。
- 关闭成功之后,删除表,HBase表对应的数据目录被删掉。
- 在删除表之后,该数据目录会被还处于flush MemStore阶段的Region重新创建。
- 在创建该表时,将temp目录复制到HBase数据目录时,由于HBase数据目录不为空,导致调用HDFS rename接口时,数据目录变为temp目录最后一层追加到HBase的数据目录下,如$rootDir/data/$nameSpace/$tableName/$tableName,那样创建表就会失败。
处理步骤
出现该问题时,请检查该表对应的HBase数据目录是否存在,如果存在请将该目录重命名。
HBase数据目录由“$rootDir/data/$nameSpace/$tableName”组成,例如“hdfs://hacluster/hbase/data/default/TestTable”,其中:
- $rootDir:表示HBase的根目录,该值通过在“hbase-site.xml”中查看配置“hbase.rootdir.perms”获取。
- data:HBase的固定目录。
- $nameSpace:表示NameSpace名称。
- $tableName:表示HBase表名。