`
punishzhou
  • 浏览: 142298 次
社区版块
存档分类
最新评论

HBase之 HTable线程不安全

阅读更多

在单线程环境下使用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. 
  
  当有多个线程竞争时可能把当前正在写的线程corrupted这是为什么呢
还是从HTbale的源码来看
 public HTable(final byte [] tableName)
  throws IOException {
    this(HBaseConfiguration.create(), tableName);
  }
 
public static Configuration create() {
    Configuration conf = new Configuration();
    return addHbaseResources(conf);
  }
 从上面我们可以看到每一个HTable的实例化过程都要创建一个新的conf,我们甚至可以认为一个conf对应的是一个HTable的connection,因此如果客户端对于同一个表,每次新new 一个configuration对象的话,那么意味着这两个HTable虽然操作的是同一个table,但是建立的是两条链接connection,它们的socket不是共用的,在多线程的情况下,经常会有new Htable的情况发生,而每一次的new都可能是一个新的connection,而我们知道zk上的链接是有限制的如果链接达到一定阈值的话,那么新建立的链接很有可能挤掉原先的connection,而导致线程不安全。
因此hbase官方文档建议我们:HTable不是线程安全的。建议使用同一个HBaseConfiguration实例来创建HTable实例。这样可以共享ZooKeeper和socket实例。例如,最好这样做:
HBaseConfiguration conf = HBaseConfiguration.create();
HTable table1 = new HTable(conf, "myTable");
HTable table2 = new HTable(conf, "myTable");

而不是这样:

HBaseConfiguration conf1 = HBaseConfiguration.create();
HTable table1 = new HTable(conf1, "myTable");
HBaseConfiguration conf2 = HBaseConfiguration.create();
HTable table2 = new HTable(conf2, "myTable");
当然最方便的方法就是使用HTablepool了,维持一个线程安全的map里面存放的是tablename和其引用的映射,可以认为是一个简单的计数器,当需要new 一个HTable实例时直接从该pool中取,用完放回,很简单~~~
分享到:
评论
1 楼 di1984HIT 2014-10-10  
学习了~!!!

相关推荐

    多线程 hbase

    2. **HBase客户端API**:HBase提供了Java客户端API,支持线程安全的`HTablePool`,这个池可以管理多个`HTable`实例,每个实例对应一个HBase表,允许多线程共享和复用这些实例,减少创建和销毁HTable对象的开销。...

    高性能HBase客户端AsynchronousHBase.zip

    asynchbase...这个 HBase 客户端跟 HBase 的客户端 HTable 有着很大的区别,不需要重写所有的 HBase API 交互代码,原生异步,而且使用一些线程就可以跟 HBase 进行高效的交互。 标签:Asynchronous

    Hbase调用JavaAPI实现批量导入操作

    在大数据处理领域,Apache HBase是一个分布式的、版本化的NoSQL数据库,它构建于Hadoop之上,特别适合处理海量结构化数据。这篇博客“Hbase调用Java API实现批量导入操作”聚焦于如何利用Java编程语言高效地向HBase...

    [原创]HbaseClient

    HbaseClient是Apache HBase的核心组件之一,它是客户端与HBase分布式数据库进行交互的桥梁。本文将深入探讨HbaseClient的工作原理、主要功能以及使用技巧,帮助读者更好地理解和掌握HBase的数据操作。 首先,Hbase...

    某大数据公司内部Hbase性能测试详细设计文档及用例

    在HBase中,数据在更新时首先写入WAL日志(HLog)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并且将老的MemStore添加到flush队列,由单独的线程flush到...

    Hbase几种入库方式

    通过使用 Hbase 的 API,可以将数据直接写入到 Hbase 中,而不需要预先生成 HFile。同时,MapReduce 的分布式计算能力可以将数据处理的效率提高数倍。 使用 HTable.put() 方法入库 HTable.put() 方法是一种常用的...

    Hbase

    HBase基于Google的Bigtable论文实现,运行于Hadoop之上,利用HDFS作为底层存储层。 **图1** 描述了HBase的基本架构及其主要组件之间的交互关系。在这个架构中,有两个关键类型的文件:Write-Ahead Log (WAL) 和实际...

    HBASE性能调优方法1

    然而,对于不那么重要的数据,可以通过设置`Put.setWriteToWAL(false)`或`Delete.setWriteToWAL(false)`来跳过WAL,提高写入性能,但牺牲了一定的数据安全性。 4. 数据压缩(Compression): 使用SNAPPY压缩算法可以...

    Java代码通过API操作HBase的最佳实践.pdf

    因此,最佳实践是使用`HTablePool`,它允许线程安全地复用`HTable`实例,减少了对.META表的扫描次数,提高了整体效率。 `HTablePool`是一个线程安全的池,用于管理多个`HTable`实例。通过在应用程序启动时创建并...

    HBase表和RDB表的转化的Java源码资源

    对于HBase,可以使用HBase的Java API,例如`HTable`或`Table`类来获取表数据;对于RDB,可以使用JDBC接口连接数据库并执行SQL查询。 2. **数据映射**:由于HBase和RDB的结构不同,我们需要定义数据映射规则。例如,...

    Hbase工具类

    HBase是一种分布式、版本化的NoSQL数据库,它构建在Hadoop文件系统(HDFS)之上,提供了高吞吐量的数据读写能力。 首先,我们来看HBase工具类的基本结构。在Java编程中,`HBaseUtils` 类通常设计为单例模式,以确保...

    storm-asynchbase:AsyncHBase 风暴映射器

    与传统的 HBase 客户端 (HTable) 不同,每个要与之交互的 HBase 集群只需要一个客户端实例。 即使您想与多个表进行交互。 它避免了不必要的等待线程,即使在同步模式下也允许批量请求并行运行。 客户端提供客户端...

Global site tag (gtag.js) - Google Analytics