在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是表名。