org.apache.hadoop.hbase.client.AsyncProcess$AsyncRequestFutureImpl.logNoResubmit

在服务端从HBase取数据时遇到错误,问题出在表的Family名称不一致和GET请求过大。通过确保Family名匹配及使用循环进行小批量查询解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务端从hbase取数据的时候,经常被我一顿瞎操作导致出现很多奇怪的问题,这次又出现下面的问题

[2020-08-12 11:03:28.196] [ WARN] [ed--pool1-t67] org.apache.hadoop.hbase.client.AsyncProcess$AsyncRequestFutureImpl.logNoResubmit(1248) | #1, table=item_features, attempt=1/1 failed=1ops, last exception: org.apache.hadoop.hbase.MultiActionResultTooLarge: org.apache.hadoop.hbase.MultiActionResultTooLarge: Max size exceeded CellSize: 85120 BlockSize: 111252959
	at org.apache.hadoop.hbase.regionserver.RSRpcServices.doNonAtomicRegionMutation(RSRpcServices.java:605)
	at org.apache.hadoop.hbase.regionserver.RSRpcServices.multi(RSRpcServices.java:2148)
	at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:33656)
	at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2182)
	at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:112)
	at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:185)
	at org.apache.hadoop.hbase.ipc.RpcExecutor$Ha
<think>我们参考引用的内容,特别是引用[2]中提供的代码示例,来实现在HBase中使用JavaAPI创建表。引用[2]中代码的关键步骤:1.实例化HBaseAdmin对象,需要先创建Configuration对象。2.创建表描述符HTableDescriptor,并指定表名。3.通过表描述符添加列族,使用HColumnDescriptor。4.使用HBaseAdmin的createTable方法创建表。注意:根据HBase版本的不同,API可能有所变化。引用[2]中的代码使用的是较早期的API(HBase1.x之前)。在HBase1.x及以后,HBaseAdmin、HTableDescriptor等类被标记为废弃,推荐使用Connection和Admin接口。但是,用户的问题没有指定HBase版本,因此我们提供两种实现:A.使用旧的API(如引用[2]所示,适用于HBase0.94等早期版本)B.使用新的API(推荐,适用于HBase1.0及以后版本)然而,考虑到引用[1][2][3]都是使用旧API,且用户要求示例代码,我们决定先提供旧API的示例(因为引用中直接有),然后再提供新API的示例,并说明差异。另外,注意引用[2]中的代码创建了名为"People"的表,包含两个列族:"personaldata"和"professionaldata"。根据引用[1],用户希望示例代码,我们提供以下内容。方案一:使用旧API(HBase0.94,0.98等版本)代码示例(注意:新版本HBase已经废弃这些类):</think> 以下是使用Java API在HBase中创建表的完整示例代码,基于HBase 1.x+版本实现: ```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.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; public class HBaseCreateTable { public static void main(String[] args) { // 1. 创建HBase配置对象 Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "localhost"); // ZooKeeper地址 config.set("hbase.zookeeper.property.clientPort", "2181"); // ZooKeeper端口 try (Connection connection = ConnectionFactory.createConnection(config); Admin admin = connection.getAdmin()) { // 2. 定义表名和列族 TableName tableName = TableName.valueOf("employee"); HTableDescriptor tableDescriptor = new HTableDescriptor(tableName); // 添加列族 (重复添加可创建多个列族) tableDescriptor.addFamily(new HColumnDescriptor("personal_info")); tableDescriptor.addFamily(new HColumnDescriptor("professional_data")); tableDescriptor.addFamily(new HColumnDescriptor("contact_details")); // 3. 检查表是否存在 if (admin.tableExists(tableName)) { System.out.println("表已存在,删除重建..."); admin.disableTable(tableName); admin.deleteTable(tableName); } // 4. 创建表 admin.createTable(tableDescriptor); System.out.println("表创建成功: " + tableName.getNameAsString()); } catch (IOException e) { System.err.println("HBase操作异常: " + e.getMessage()); e.printStackTrace(); } } } ``` ### 关键步骤说明: 1. **配置连接** - 通过`HBaseConfiguration`设置ZooKeeper地址和端口 - 使用`ConnectionFactory`创建HBase连接 2. **表结构定义** - `TableName`: 指定表名(示例中为`employee`) - `HTableDescriptor`: 定义表结构 - `HColumnDescriptor`: 定义列族(示例创建了三个列族) 3. **表操作** - `tableExists()`: 检查表是否已存在 - `createTable()`: 核心建表方法 - 删除重建逻辑确保幂等性 4. **资源管理** - 使用try-with-resources自动关闭`Connection`和`Admin` - 完整异常处理机制 ### 注意事项: 1. 需添加HBase客户端依赖(Maven示例): ```xml <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.4.13</version> <!-- 根据实际版本调整 --> </dependency> ``` 2. 列族命名规范: - 仅使用字母、数字和下划线 - 长度不超过255字符 - 创建后无法修改列族名称 3. 生产环境建议: ```java // 设置列族配置示例 HColumnDescriptor family = new HColumnDescriptor("logs"); family.setCompressionType(Algorithm.SNAPPY); // 设置压缩 family.setBlocksize(65536); // 设置块大小 ``` [^1][^2][^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值