在单线程环境下使用hbase的htable是没有问题,但是突然高并发多线程情况下就出现问题了,然后细看htable的api说明
* This class is not thread safe for updates; the underlying write buffer can
* be corrupted if multiple threads contend over a single HTable instance.
好吧 ,还是使用前没有细看api的文档说明,而且测试也没有测试多线程使用的情况,检讨下,那么对应的解决方案呢?
当然hbase肯定有自己的解决方案,那就是HTablePool,我们这下仔细看看api文档说明
/**
* A simple pool of HTable instances.<p>
*
* Each HTablePool acts as a pool for all tables. To use, instantiate an
* HTablePool and use {@link #getTable(String)} to get an HTable from the pool.
* Once you are done with it, return it to the pool with {@link #putTable(HTableInterface)}.
*
* <p>A pool can be created with a <i>maxSize</i> which defines the most HTable
* references that will ever be retained for each table. Otherwise the default
* is {@link Integer#MAX_VALUE}.
*
* <p>Pool will manage its own cluster to the cluster. See {@link HConnectionManager}.
*/
文档里说,使用getTable来取,当使用完了要用putTable归还,ok,这就是要使用finally块了。
大概的代码结构如下:
Result result = null;
HTable table = null;
try {
table = (HTable)hbaseTablePool.getTable(tablename);
if(table == null) throw new RuntimeException(TABLE_NOT_EXIST);
result = table.get(xxxxxx);
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
if(table != null) {
hbaseTablePool.putTable((HTableInterface)htable);
}
}
那pool是如何实例化的呢
HTablePool hbaseTablePool = new HTablePool(hbaseStoreFactory.getConfiguration(),this.maxConnection);
//为了检验table的正确性,调用一次
hbaseTablePool.putTable(this.hbaseTablePool.getTable(tablename));
仔细看看HTablePool的实现,其实不是pool的概念,只是一个计数器实现而已,相比java的线程池的实现真是很丑陋,希望hbase能给一个比较好的实现了。
分享到:
相关推荐
2. **HBase客户端API**:HBase提供了Java客户端API,支持线程安全的`HTablePool`,这个池可以管理多个`HTable`实例,每个实例对应一个HBase表,允许多线程共享和复用这些实例,减少创建和销毁HTable对象的开销。...
HBase是建立在Hadoop文件系统(HDFS)之上,为处理大规模数据提供了一个高效的数据存储解决方案。而Spring Data Hadoop是Spring框架的一部分,它提供了与Hadoop生态系统集成的工具,包括对HBase的操作支持。本篇文章...
本文将介绍Hadoop、HBase、Hive以及ZooKeeper的版本整合兼容性,以及如何根据版本找到兼容性信息。 首先,Hadoop是一个开源的分布式存储和计算框架,它由HDFS和MapReduce两部分组成。HDFS用于存储大数据,而...
记住,为了保证程序的稳定性和效率,你需要对HBase和HDFS的配置进行适当的优化,比如设置合理的缓存大小、批处理大小等。此外,理解HBase的Region分布和HDFS的Block策略也是至关重要的。在进行大数据操作时,理解并...
随着数据安全的重要性日益凸显,HBase提供了多种安全机制来保障数据的安全性。其中,审计日志功能是记录用户对HBase进行的各种操作的重要工具,对于监控和审查系统行为非常关键。 #### 二、配置HBase审计日志 ####...
多线程入库是指同时使用多个线程将数据写入到 Hbase 中。这种方式的优点是可以提高写入速度,缺点是需要编写多线程程序,增加了程序的复杂度。 小结 Hbase 入库方式的选择取决于具体的业务需求和数据规模。预先...
在大数据处理领域,Apache HBase是一个分布式的、版本化的NoSQL数据库,它构建于Hadoop之上,特别适合处理海量结构化数据。这篇博客“Hbase调用Java API实现批量导入操作”聚焦于如何利用Java编程语言高效地向HBase...
HBase是构建在Hadoop之上的,利用HDFS作为其底层存储。在Java中,我们通过HBase客户端API与HBase交互,这些API包括了`HBaseAdmin`、`HTable`、`Put`、`Get`、`Scan`等核心类。 1. **连接HBase**:在Java代码中,...
HBase支持通过Kerberos进行认证,以保证数据的安全性。 ### 架构 HBase的架构包括Master服务器、RegionServer、客户端、目录表等关键组件。架构的了解对高效使用HBase以及进行性能优化非常重要。 ### 外部APIs ...
首先需要创建一个HTable对象,然后使用Put对象将数据写入到HBase中。 ```java public static void put(String tablename, String row, String columnFamily, String column, String data) throws IOException { ...
HBase是一个分布式、面向列的NoSQL数据库,它构建于Hadoop之上,提供实时访问大量数据的能力。Scala是一种强大的函数式编程语言,与Java虚拟机(JVM)兼容,因此非常适合编写HBase的客户端程序。 首先,确保你的...
在Java中操作HBase数据库时,我们经常需要对大量数据进行高效的检索和处理。HBase提供了多种过滤器机制,其中PageFilter是一种非常实用的工具,它可以帮助我们在查询时限制返回的结果数量,从而优化性能和内存使用。...
* 高度的安全性和可靠性 结论 HBase企业级安全解析是HBase安全机制的重要组成部分。HBase的安全机制包括Access Controller coprocessor实现的ACL权限控制、RPC层的安全认证和HBase的WebUI支持https访问等多方面的...
安全性和权限管理**:HBase提供了细粒度的安全控制机制,可以通过ACL(Access Control List)来管理用户的访问权限,确保数据安全。 **5. 集成与生态**:HBase不仅与HDFS紧密结合,还与Hadoop生态系统中的其他组件...
- **容错性**:通过数据复制和故障恢复机制,HBase能够在节点故障的情况下保证数据的可用性和一致性。 - **灵活的数据模型**:HBase允许用户在不需要预先定义数据结构的情况下插入和查询数据,这对于处理半结构化或...
4. **配置 HBase 数据存储路径**:为了确保数据的安全性和持久性,需要修改 `conf/hbase-site.xml` 文件,设置 `hbase.rootdir` 属性值,指向期望的 HBase 数据存储路径。 ```xml <name>hbase.rootdir ...
搭建pinpoint需要的hbase初始化脚本hbase-create.hbase
例如,HBase提供了`HTable`的`checkAndPut()`方法支持原子性的检查与更新操作,以及`Batch`接口用于一次性执行多个`Put`、`Get`或`Delete`操作。 HBase的性能优化也是关键。可以通过调整表分区策略、预分割表、使用...
就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非...
HBase是一种分布式、基于列族的NoSQL数据库,它在大数据领域中扮演着重要的角色,尤其是在需要实时查询大规模数据集时。...了解并熟练掌握这些客户端工具,可以极大地提高HBase的使用效率和灵活性。