HBase 创建表已经存在,删除表又不存在的问题的两种解决方法

错误提示信息:

用list 查看student表

发现没有student表的信息

通过Web Console 查看表的信息

也没有表的任何信息

用scan 查看student表,发现也没有任何的信息

通过以上的尝试,现在只能查看ZooKeeper中student的注册信息

方法一:

使用zookeeper-dev-ZooInspector.jar工具查看ZK的注册信息,但是此工具在我的Windows中无法运行,故只能尝试在Linux下运行,在Linux的图形终端下使用命令:java -Djava.ext.dirs=lib -jar zookeeper-dev-ZooInspector.jar 

然后把table中的student删掉,同时把hdfs中的hbase目录下的所有文件给删除,然后重启hbase,再重新创建表

发现可以创建表了

方法二:

进入ZooKeeper的客户端中

zkCli.sh

ls /hbase/table-lock

然后删除/hbase/table-lock下的student

再进入到/hbase/table中,删除student

最后重启hbase,同时需要查看一下运行的进程,需要把ZooKeeperMain进程也删掉

然后进入到hbase shell中,重新创建表

欢迎大佬们扫

下面二维码关注我个人微信公众号(Java大数据架构师成长之路)

 

<think>好的,用户想了解如何在HBase创建,需要详细步骤和语法示例。首先,我应该先回顾一下HBase的基本知识,确保自己记得正确。HBase是一个分布式的、面向列的数据库,基于Hadoop,适合处理海量数据创建的时候,需要指定名和列族,列族的配置会影响数据的存储和访问效率。 接下来,我需要参考用户提供的引用内容。根据引用[1]、[2]、[3],HBase创建两种主要方法:通过HBase Shell使用命令行,或者通过Java API编程实现。用户可能想知道这两种方法的具体步骤,所以需要分别整理。 首先,HBase Shell的方法。引用[1]和[3]提到,在Shell中创建的语法是create '名','列族名'。可能需要详细说明每个参数,例如名和列族的命名规则,以及可选的配置参数。比如,VERSIONS参数可以指定保留的版本数,或者设置数据块的缓存大小。还要注意,HBase Shell是交互式命令行工具,适合手动操作或脚本执行。 然后是Java API的方法。引用[2]和[3]指出,需要使用HBaseAdmin类,但现在可能已经被新的API替代了?比如HBase 2.x之后,Admin接口可能更常用。需要确认最新的方法,避免给出过时的代码示例。例如,HBaseAdmin类已经被弃用,应该使用Connection接口和Admin类。所以步骤应该是:1. 创建配置对象;2. 获取Connection;3. 获取Admin对象;4. 创建描述符,添加列族描述符;5. 执行创建操作。同时需要处理异常,比如存在的情况。 另外,用户可能需要知道创建前的准备工作,比如检查是否存在,或者删除存在。引用[4]和[5]提到删除方法,可能需要先禁用删除。所以在创建之前,最好先检查是否存在,避免冲突。 还需要注意语法细节,例如在Shell中名和列族名的大小写处理,是否需要用引号括起来。Java代码中需要导入哪些包,如何处理配置,以及如何正确设置列族参数,比如BlockCache、BloomFilter等。 用户可能遇到的常见问题包括符合规范、列族配置当导致性能问题,或者权限足无法创建。在步骤中应该提醒这些注意事项,比如列族宜过多,通常建议超过3个,每个列族的配置需要根据访问模式优化。 最后,提供示例代码时,要确保语法正确,比如在Java中使用TableDescriptorBuilder和ColumnFamilyDescriptorBuilder来构建描述符。同时,关闭Admin和Connection资源,避免资源泄漏。 总结起来,回答的结构应该分为HBase Shell和Java API两部分,每部分详细步骤和示例,加上注意事项和常见问题。需要确保引用对应的参考资料,并在适当的地方添加引用标识。可能还需要说明版本差异,比如新旧API的同,避免用户混淆。</think>### HBase 创建的详细步骤及语法示例 在HBase创建需要指定**名**和**列族名**,支持通过**HBase Shell命令行**或**Java API**两种方式实现。以下是具体步骤及示例: --- #### 一、通过HBase Shell创建 1. **启动HBase Shell** 在终端输入命令进入交互式命令行环境: ```bash hbase shell ``` 2. **创建语法** ```bash create '<名>', {NAME => '<列族名>', <可选参数>}, {NAME => '<列族名>', <可选参数>}, ... ``` - **必选参数**:`名`和至少一个`列族名`。 - **可选参数**:如`VERSIONS`(版本数)、`BLOCKCACHE`(是否启用缓存)等。 3. **示例** 创建一个`student`,包含两个列族`info`和`score`,其中`info`列族保留3个版本: ```bash create 'student', {NAME => 'info', VERSIONS => 3}, {NAME => 'score', BLOCKCACHE => 'true'} ``` 执行后输出:`Created table student`[^1][^3]。 --- #### 二、通过Java API创建 1. **依赖配置** 在项目中引入HBase客户端依赖(如Maven): ```xml <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.4.12</version> </dependency> ``` 2. **代码实现步骤** ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder; import org.apache.hadoop.hbase.client.TableDescriptorBuilder; public class CreateTable { public static void main(String[] args) throws Exception { // 1. 创建配置对象 Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "localhost"); // 设置ZooKeeper地址 // 2. 获取Connection和Admin对象 try (Connection connection = ConnectionFactory.createConnection(conf); Admin admin = connection.getAdmin()) { // 3. 定义名和列族 TableName tableName = TableName.valueOf("student"); ColumnFamilyDescriptorBuilder infoFamily = ColumnFamilyDescriptorBuilder.newBuilder("info".getBytes()); infoFamily.setMaxVersions(3); // 设置列族参数 ColumnFamilyDescriptorBuilder scoreFamily = ColumnFamilyDescriptorBuilder.newBuilder("score".getBytes()); scoreFamily.setBlockCacheEnabled(true); // 4. 构建描述符并创建 TableDescriptorBuilder tableDescBuilder = TableDescriptorBuilder.newBuilder(tableName) .setColumnFamily(infoFamily.build()) .setColumnFamily(scoreFamily.build()); if (!admin.tableExists(tableName)) { admin.createTable(tableDescBuilder.build()); System.out.println("创建成功"); } else { System.out.println("存在"); } } } } ``` - **关键点**:需检查是否已存在(`admin.tableExists()`),避免重复创建[^2][^3]。 --- #### 三、注意事项 1. **列族设计原则** - 列族数量宜过多(通常超过3个),每个列族独立存储。 - 列族名称需简短且符合命名规范(仅字母、数字、下划线)。 2. **预分区优化** 创建时可通过`SPLITS`参数预分区,提升写入性能: ```bash create 'student', 'info', {SPLITS => ['a', 'g', 'm', 'z']} ``` 3. **删除** 若存在,需先禁用再删除: ```java admin.disableTable(tableName); admin.deleteTable(tableName); ``` Shell命令: ```bash disable 'student' drop 'student' ``` [^4][^5] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值