首页 > 其他分享 >查看hbase表没有,但是新建却显示存在这个表的问题原因

查看hbase表没有,但是新建却显示存在这个表的问题原因

时间:2023-04-04 16:13:56浏览次数:48  
标签:查看 zk 新建 create list tableDescriptors table hbase

转:https://www.cnblogs.com/superhedantou/p/5936460.html

hbase源码分析:ERROR: Table already exists问题诊断

 

问题描述:

重新安装了测试环境的hadoop,所以之前hbase所建的表数据都丢失了,但是zookeeper没有动。在hbase shell中list的时候,看不到之前建的表,但是create test table的时候,却报错提示"ERROR: Table already exists: test!". 

问题追踪:

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

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

  

复制代码
 1         // request for all TableDescriptors
 2         Collection<HTableDescriptor> htds;
 3         if (namespace != null && namespace.length() > 0) {
 4           htds = tableDescriptors.getByNamespace(namespace).values();
 5         } else {
 6           htds = tableDescriptors.getAll().values();
 7         }
 8 
 9         for (HTableDescriptor desc: htds) {
10           if (includeSysTables || !desc.getTableName().isSystemTable()) {
11             descriptors.add(desc);
12           }
13         }
复制代码

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

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

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

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

复制代码
 1 private boolean prepareCreate(final MasterProcedureEnv env) throws IOException {
 2     final TableName tableName = getTableName();
 3     if (MetaTableAccessor.tableExists(env.getMasterServices().getConnection(), tableName)) {
 4       setFailure("master-create-table", new TableExistsException(getTableName()));
 5       return false;
 6     }
 7     // During master initialization, the ZK state could be inconsistent from failed DDL
 8     // in the past. If we fail here, it would prevent master to start.  We should force
 9     // setting the system table state regardless the table state.
10     boolean skipTableStateCheck =
11         !(env.getMasterServices().isInitialized()) && tableName.isSystemTable();
12     if (!skipTableStateCheck) {
13       TableStateManager tsm = env.getMasterServices().getAssignmentManager().getTableStateManager();
14       if (tsm.isTableState(tableName, true, ZooKeeperProtos.Table.State.ENABLING,
15           ZooKeeperProtos.Table.State.ENABLED)) {
16         LOG.warn("The table " + tableName + " does not exist in meta but has a znode. " +
17                "run hbck to fix inconsistencies.");
18         setFailure("master-create-table", new TableExistsException(getTableName()));
19         return false;
20       }
21     }
22     return true;
23   }
复制代码

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

问题解决:

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

通过zk删除hbase表名的链接:https://blog.csdn.net/leng91060404/article/details/106956315

通过zk删除hbase表名内容:

 

标签:查看,zk,新建,create,list,tableDescriptors,table,hbase
From: https://www.cnblogs.com/fyy-hhzzj/p/17286772.html

相关文章

  • SpringBoot之使用IDEA新建Web项目
    1.打开IDEA,点击左上角的File选项,打开菜单选择New,再打开菜单选择Project2.选择SpringInitializr,输入或选择项目相关的信息3.选择SpringBoot版本以及相应的依赖,并点击右下角的Create按钮进行项目创建4.项目创建完成后,点击左上角的File选项,打开菜单选择Settings选......
  • 1006-HBase操作实战(JAVA API模式)
    一、准备阶段开发环境:hadoop: hadoop -2.4.0hbase: hbase -0.94.11-securityeclipse:JunoServiceRelease2二、创建 hbasedemo项目1、通过Eclipse创建一个新Java工程2、右击项目根目录,选择“Propertiesà>JavaBuildPathà>Libraryà> Add Ext......
  • 1005--HBase操作实战(HBase Shell命令行模式)
    通过HBase命令行,创建一张表,用户存储用户信息,其中包括基本信息和额外信息HBaseshell下所有命令可以使用:help“cmd”进行了解1、创建表create't_person',{NAME=>'basic_info'},{NAME=>'extra_info'}2、表中存储数据put't_person','g201425001','ba......
  • 1004-HBase的基本操作
    1、连接HBase./bin/hbaseshell2、创建一个表使用create命令创建一个表,必须给出特定的表名(tablename)和列族(theColumnFamilyname)hbase(main):001:0>create'test','cf'3、列出表信息hbase(main):002:0>list'test'4、put数据到指定的表使用put命令,并指定表,行建,列族......
  • Java判断文件夹、文件是否存在,不存在则新建
    Java判断文件夹、文件是否存在,不存在则新建原文链接:https://blog.csdn.net/asfsdgdfgdf/article/details/1283162781、Java判断是否存在文件夹,不存在则新建Filefile=newFile("D:/test/filetest/test.txt");if(!file.getParentFile().exists()){file.getParentFile().......
  • hbase常用操作
    原文参考:www.51niux.com一、Hbase常用操作1.1hbase命令行介绍$/opt/soft/hbase/bin/hbase--helpBASICUsage:hbase[<options>]<command>[<args>]Options:--configDIR使用的配置目录。默认值:./conf--hostsHOSTS覆盖“regionserver”文件中的列表--aut......
  • SQLSERVER查看加密存储过程
    --解密存储过程CREATE  PROCEDUREsp_decrypt(@objectNamevarchar(50))ASbeginsetnocounton--CSDN:j9988copyright:2004.04.15--V3.1--破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器--修正上一版视图触发器不能正确解密错误--发现有错,请E_MAIL:CSDNj9......
  • 从头开始新建uniapp
    1、打开HBuilderX,新建项目 2、修改AppID(在https://mp.weixin.qq.com注册一个小程序)   3、登入Hbuilder自动获取ApppID   4、运行-微信开发者工具 5、此时会自动打开微信开发者工具运行对应项目,如果微信开发者工具打开后没有出现对应成功运行的效果(如下......
  • ceph版本及生命周期、查看命令
    ceph版本https://blog.whsir.com/post-6687.html查看ceph版本的命令要查看Ceph的版本,可以使用以下命令:ceph--version或者:ceph--version|grepceph这些命令将打印出Ceph的版本信息,例如:cephversion14.2.21(f90a3fe2e8f97a69de958ff472c30edfe9e9dcdc)nautilus(stable)其中,“......
  • windows查看端口
     参考链接首先我们得找出占用这个端口的值。1、首先我们打开CMD,用管理员身份打开,然后输入netstat-ano,列出所有端口的情况。2、查看被占用端口对应的PID,输入命令:netstat-aon|findstr"8000",回车,记下最后一位数字,即PID,如果是2839。3、(可用可不用)继续输入tasklist|findstr"......