Hbase Table already exists

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 问题描述:前端时间用pinpoint采集数据保存到Hbase,脏数据比较多,想清空数据库重新测试,发现Hbase清空表只能先删除表再重建,不能只清空数据;删除后重建表的时候就报Table already exists,用list查看发现表已经被删了,所以懵逼了~解决方法1、通过.

问题描述:前端时间用pinpoint采集数据保存到Hbase,脏数据比较多,想清空数据库重新测试,发现Hbase清空表只能先删除表再重建,不能只清空数据;删除后重建表的时候就报Table already exists,用list查看发现表已经被删了,所以懵逼了~

解决方法

  • 1、通过./hbase zkcli命令进入zookeeper client模式
  • 2、输入ls /hbase/table命令看到zombie table
  • 3、使用rmr /hbase/table/TABLE_NAME命令删除zombie table
  • 4、重启Hbase

如果是直接rmr /hbase会报非空错误:rmr /hbase Node not empty: /hbase/
所以需要再进一级去删除

问题分析
首先在list的时候,没有显示之前建的表,也就是没有感知到之前建的表,但是create时候却感知到了之前建的表,所以很自然需要看一下list和create的时候,server执行的逻辑。只要清楚了这个逻辑,问题便一清二楚了。

1、list时server端的逻辑其实很简单。list的时候master端执行的逻辑的入口函数是listTableDescriptors。核心代码如下:

// request for all TableDescriptors
        Collection<HTableDescriptor> htds;
        if (namespace != null && namespace.length() > 0) {
          htds = tableDescriptors.getByNamespace(namespace).values();
        } else {
          htds = tableDescriptors.getAll().values();
        }

        for (HTableDescriptor desc: htds) {
          if (includeSysTables || !desc.getTableName().isSystemTable()) {
            descriptors.add(desc);
          }

可以看到是从tableDescriptors中获取的,而tableDescriptors是根据hbase在hdfs中路径的描述

this.tableDescriptors = new FSTableDescriptors(
this.conf, this.fs, this.rootDir, !canUpdateTableDescriptor(), false);

然后可以看到这些信息是从hbase在hdfs中的rootpath下的data目录中获取表相关信息的。所以,list的时候当然看不见之前的表了。

2、create table的时候,在server端最终会使用createTableHandler或者createTableProcedure来处理建表的逻辑。在createTableProcedure中正式建表之前,会调用prepareCreate函数。

private boolean prepareCreate(final MasterProcedureEnv env) throws IOException {
    final TableName tableName = getTableName();
    if (MetaTableAccessor.tableExists(env.getMasterServices().getConnection(), tableName)) {
      setFailure("master-create-table", new TableExistsException(getTableName()));
      return false;
    }
    // During master initialization, the ZK state could be inconsistent from failed DDL
    // in the past. If we fail here, it would prevent master to start.  We should force
    // setting the system table state regardless the table state.
    boolean skipTableStateCheck =
        !(env.getMasterServices().isInitialized()) && tableName.isSystemTable();
    if (!skipTableStateCheck) {
      TableStateManager tsm = env.getMasterServices().getAssignmentManager().getTableStateManager();
      if (tsm.isTableState(tableName, true, ZooKeeperProtos.Table.State.ENABLING,
          ZooKeeperProtos.Table.State.ENABLED)) {
        LOG.warn("The table " + tableName + " does not exist in meta but has a znode. " +
               "run hbck to fix inconsistencies.");
        setFailure("master-create-table", new TableExistsException(getTableName()));
        return false;
      }
    }
    return true;
  }

在14行,通过TableStateManager会检查zookeeper对应的表状态是不是enable的,检查zk中的路径是hbase root path下的table目录。由于zk还是之前的zk,所以之前建的表信息还在,很自然这时候会检查已经存在,如是报了Table already exits的错误。Log提示中说用hbck去检查,但是貌似检查不出来是不一致的。

问题解决思路:

本来想通过hbck去检查,然后修复的,但是貌似hbck检查不出来。所以只是简单暴力的把zk中对应的table删除,然后create就没问题了。

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
存储 分布式计算 NoSQL
分布式数据库HBase的基本概念和架构之基本数据模型的Table
HBase是一个分布式数据库系统,基于Google的Bigtable和Apache Hadoop的HDFS构建而成。
|
存储 关系型数据库 分布式数据库
Hbase数据模型与table设计
最近在学习Hbase的使用,并仔细阅读了一篇官方推荐的博客,在这里就以一边翻译一边总结的方式和大家一起梳理一下HBase的数据模型和基本的表设计思路。 官方推荐的博客原文地址:http://0b4af6cdc2f0c5998459-c0245c5c937c5dedcca3f1764ecc9b2f.r43.cf2.rackcdn.com/9353-login1210_khurana.pdf点击打开链接 HBase是一个开源可伸缩的针对海量数据存储的分布式nosql数据库,它根据Google Bigtable数据模型来建模并构建在hadoop的hdfs存储系统之上。
2269 0
|
分布式数据库 SoC Hbase
Hbase操作table常见方法示例
首先上我的输出类: /** * 功能:电池历史数据数据结构 * Created by liuhuichao on 2016/12/5. */ public class ResBatteryDataHistory implements Serializable { priv...
841 0
|
4月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
134 0
|
SQL 分布式计算 Hadoop
Hadoop集群hbase的安装
Hadoop集群hbase的安装
190 0
|
3月前
|
存储 分布式计算 Hadoop
Hadoop节点文件存储HBase设计目的
【6月更文挑战第2天】
48 6
|
3月前
|
存储 分布式计算 Hadoop
Hadoop节点文件存储Hbase高可靠性
【6月更文挑战第2天】
72 2
|
3月前
|
存储 分布式计算 Hadoop
Hadoop节点文件存储Hbase面向列
【6月更文挑战第2天】
33 2
|
4月前
|
分布式计算 安全 Hadoop
HBase Shell-org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet 已解决
在HBase Shell遇到错误时,检查Hadoop非安全模式:`hdfs dfsadmin -safemode get`。问题解决在于`hbase-site.xml`中添加配置:Zookeeper客户端端口设为2181和预写日志提供者设为filesystem。
|
4月前
|
分布式计算 Hadoop Java
Hbase2.2.2在线安装配置(对应Hadoop 3.1.3)
Hbase2.2.2在线安装配置(对应Hadoop 3.1.3)
88 2