hbase总结:插入数据的表名不存在或和创建的表名不一致

本文介绍了一种在使用HBase进行表操作时遇到的异常情况及解决办法。主要问题出现在表名不一致导致的数据插入失败,通过确保创建表与插入数据时使用的表名相同来解决问题。

异常情况一:

public static void main(String[] args) {
		try {
			QueryRunner qr = MyDbutils.getQueryRunner();
			String sql = "SELECT * FROM OptionInfo";
			List<OptionInfo> list = qr.query(sql, new BeanListHandler(OptionInfo.class));
			HBaseManager.creatTable("MetaData_test", "Info");
			new InsertHbase().insertIntoHbase("MetaData_Test",list);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

仔细查看这两句:

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">HBaseManager.creatTable(tableName, "Info");</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">new InsertHbase().insertIntoHbase(tableName,list);</span>

程序会出现如下错误:

org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 1 action: MetaData_Test: 1 time, 

at org.apache.hadoop.hbase.client.AsyncProcess$BatchErrors.makeException(AsyncProcess.java:203)
at org.apache.hadoop.hbase.client.AsyncProcess$BatchErrors.access$500(AsyncProcess.java:187)
at org.apache.hadoop.hbase.client.AsyncProcess.getErrors(AsyncProcess.java:922)
at org.apache.hadoop.hbase.client.HTable.backgroundFlushCommits(HTable.java:991)
at org.apache.hadoop.hbase.client.HTable.flushCommits(HTable.java:1287)
at org.apache.hadoop.hbase.client.HTable.put(HTable.java:917)
at com.dh.metaData.InsertHbase.insertIntoHbase(InsertHbase.java:37)

at com.dh.metaData.MetaData.main(MetaData.java:22)

解决方案:保证创建表名和插入表的表名一致!!!推荐使用同一个变量!

String tableName="MetaData_test";
HBaseManager.creatTable(tableName, "Info");
new InsertHbase().insertIntoHbase(tableName,list);



                
<think>根据用户的问题,他想要了解如何使用JavaAPI在HBase创建。我们需要提供示例代码教程。注意,用户之前提供了几个引用,但主要是关于获取创建时间插入数据的,而用户当前的需求是创建。因此,我们需要根据HBase的JavaAPI标准来回答。首先,我们需要准备以下步骤:1.建立与HBase的连接。2.创建HBase管理对象(Admin)。3.定义列族。4.创建描述符(TableDescriptor)列族描述符(ColumnFamilyDescriptor)。5.执行创建操作。注意:在HBase的较新版本中(例如2.0及以上),API与旧版本(如1.x)有较大变化。这里我们将使用新API(org.apache.hadoop.hbase.client包下的新接口)。示例代码:```javaimportorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.HBaseConfiguration;importorg.apache.hadoop.hbase.TableName;importorg.apache.hadoop.hbase.client.Admin;importorg.apache.hadoop.hbase.client.Connection;importorg.apache.hadoop.hbase.client.ConnectionFactory;importorg.apache.hadoop.hbase.client.TableDescriptor;importorg.apache.hadoop.hbase.client.TableDescriptorBuilder;importorg.apache.hadoop.hbase.util.Bytes;importorg.apache.hadoop.hbase.client.ColumnFamilyDescriptor;importorg.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;importjava.io.IOException;publicclassCreateTableExample{publicstaticvoidmain(String[]args){//1.创建HBase配置Configurationconfig=HBaseConfiguration.create();//如果有其他配置,如ZooKeeper地址,可以通过config.set()设置//config.set("hbase.zookeeper.quorum","localhost");//2.建立连接try(Connectionconnection=ConnectionFactory.createConnection(config);Adminadmin=connection.getAdmin()){//3.定义列族TableNametableName=TableName.valueOf("test_table");StringcolumnFamilyName1="cf1";StringcolumnFamilyName2="cf2";//4.创建列族描述符ColumnFamilyDescriptorcfDescriptor1=ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamilyName1)).build();ColumnFamilyDescriptorcfDescriptor2=ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamilyName2)).build();//5.创建描述符,并添加列族TableDescriptortableDescriptor=TableDescriptorBuilder.newBuilder(tableName).setColumnFamily(cfDescriptor1).setColumnFamily(cfDescriptor2).build();//6.检查表是否存在,如果存在创建if(!admin.tableExists(tableName)){admin.createTable(tableDescriptor);System.out.println("创建成功!");}else{System.out.println("存在!");}}catch(IOExceptione){e.printStackTrace();}}}```教程步骤说明:1.**配置HBase连接**:使用`HBaseConfiguration.create()`创建配置对象。如果HBase配置没有在classpath的hbase-site.xml中,则需要手动设置,例如ZooKeeper的地址。2.**建立连接**:通过`ConnectionFactory`创建连接,然后从连接中获取`Admin`对象(用于管理HBase,如建、删等)。3.**定义列族**:使用`TableName.valueOf`方法转换,列族称使用字符串。4.**创建列族描述符**:使用`ColumnFamilyDescriptorBuilder`构建列族描述符。这里可以设置列族的属性(如版本数、压缩格式等),示例中使用了默认设置。5.**创建描述符**:使用`TableDescriptorBuilder`构建描述符,并添加列族描述符。一个可以有多个列族。6.**创建**:使用`Admin`对象的`createTable`方法创建。在创建前通常检查表是否存在。注意事项:-需要将HBase的依赖添加到项目中(如Maven项目中添加hbase-client依赖)。-运行代码前确保HBase服务已启动(包括HMasterRegionServer)。-如果连接远程HBase集群,确保网络畅通,并且配置正确的ZooKeeper地址。相关问题:1.如何设置HBase连接参数(如ZooKeeper地址)?2.如何在创建时指定列族的属性(如版本数、压缩类型)?3.如何删除HBase中的?4.如何验证是否创建成功?</think> ### HBase Java API创建示例教程 下面是通过Java API在HBase创建的完整代码示例详细步骤说明: #### 示例代码 ```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.ColumnFamilyDescriptor; import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.TableDescriptor; import org.apache.hadoop.hbase.client.TableDescriptorBuilder; import org.apache.hadoop.hbase.util.Bytes; public class HBaseCreateTable { public static void main(String[] args) { try { // 1. 创建HBase配置对象 Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "localhost"); // ZooKeeper地址 // 2. 建立HBase连接 try (Connection connection = ConnectionFactory.createConnection(config); Admin admin = connection.getAdmin()) { // 3. 定义列族 TableName tableName = TableName.valueOf("user_info"); // ColumnFamilyDescriptor cf1 = ColumnFamilyDescriptorBuilder .newBuilder(Bytes.toBytes("basic")) // 列族1 .build(); ColumnFamilyDescriptor cf2 = ColumnFamilyDescriptorBuilder .newBuilder(Bytes.toBytes("contact")) // 列族2 .build(); // 4. 构建描述符 TableDescriptor tableDesc = TableDescriptorBuilder.newBuilder(tableName) .setColumnFamily(cf1) .setColumnFamily(cf2) .build(); // 5. 创建前检查是否存在 if (!admin.tableExists(tableName)) { // 6. 执行创建操作 admin.createTable(tableDesc); System.out.println("创建成功: " + tableName); } else { System.out.println("存在: " + tableName); } } } catch (Exception e) { e.printStackTrace(); } } } ``` #### 详细步骤说明 1. **配置环境** - 依赖包:确保项目中包含 `hbase-client` 依赖(Maven示例) ```xml <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.4.11</version> <!-- 根据实际版本调整 --> </dependency> ``` - 配置文件:`hbase-site.xml` 需在classpath中[^3] 2. **建立连接流程** ```mermaid graph TD A[创建Configuration对象] --> B[设置ZooKeeper地址] B --> C[ConnectionFactory创建连接] C --> D[获取Admin对象] ``` 3. **核心参数说明** | 组件 | 说明 | 示例 | |------|------|------| | `TableName` | 标识 | `TableName.valueOf("test_table")` | | `ColumnFamilyDescriptor` | 列族定义 | 包含版本数/压缩策略等配置 | | `TableDescriptorBuilder` | 结构生成器 | 可添加多个列族 | 4. **最佳实践建议** - 列族命:使用短命但保持语义清晰(如 `basic` 而非 `cf1`) - 异常处理:捕获 `IOException` `TableExistsException` - 预分区:使用 `admin.createTable(tableDesc, startKey, endKey, numRegions)` 实现区域预分配 #### 注意事项 1. 连接HBase前需确保: - HMasterRegionServer已启动 - ZooKeeper服务可用 2. 创建成功后,可通过HBase Shell验证: ```shell hbase> list hbase> describe 'user_info' ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值