`
无尘道长
  • 浏览: 160797 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hbase锁机制

阅读更多

博文说明:1、研究版本hbase0.94.12;2、贴出的源代码可能会有删减,只保留关键的代码。

 

  hbase的锁是采用jdkReentrantReadWriteLock类实现

 

  一、HRegion有两种锁:lockupdatesLock,这两种锁均是ReentrantReadWriteLock类的实例,基本上所有的region操作均需要获取lockread共享锁,在获取了lockread锁后,如果是增加或者删除等影响数据内容的操作则还需要获取updatesLockread锁。

 

  1、HRegion的lock锁影响如下的操作: 


  其中关闭region的
doClose方法需要持有lock的write锁,startBulkRegionOperation在进行跨列簇处理时也要求持有lock的writ锁,其它均只需持有lock的read锁,startBulkRegionOperation在使用工具LoadIncrementalHFiles装载通过HFileOutputFormat输出的HFile文件到一个已经存在的表时执行的方法,因此执行该操作最好是在该region空闲时执行。

lock锁影响的startRegionOperation()方法又影响如下操作:


   由以上两图可以分析出,一旦执行了region的关闭操作或者通过工具LoadIncrementalHFiles向已经存在的表装载跨列簇的数据时会阻塞,尤其是close方法,通过锁的实现可以确保当close发生时拒绝所有的region请求,避免出现关闭过程中再执行其它任何操作,而出现错误服务的问题。

 

2、HRegion的updatesLock影响如下操作: 


 

其中只有flush时执行的internalFlushcache方法需要持有updatesLockwrite锁,由此可见,flush方法会阻塞所有的可能改动memstore内容的操作。

put等需要改动memstore内容的操作均需要持有read和updatesLock锁,以put方法为例说明,源代码如下:

public void put(Put put, Integer lockid, boolean writeToWAL)throws IOException {

    startRegionOperation();  //获取lock

    this.writeRequestsCount.increment();

    this.opMetrics.setWriteRequestCountMetrics(this.writeRequestsCount.get());

    try {

      byte [] row = put.getRow();

Integer lid = getLock(lockid, row, true);

      try {

        internalPut(put, put.getClusterId(), writeToWAL);

      } finally {

        if(lockid == null) releaseRowLock(lid);

      }

    } finally {

      closeRegionOperation(); //释放lock

    }

  }

 

private void internalPut(Put put, UUID clusterId, boolean writeToWAL) throws IOException {

    lock(this.updatesLock.readLock()); //获取updatesLock

    try {

      checkFamilies(familyMap.keySet());

      checkTimestamps(familyMap, now);

      updateKVTimestamps(familyMap.values(), byteNow);

      if (writeToWAL) {

        addFamilyMapToWALEdit(familyMap, walEdit);

        walEdit.addClusterIds(put.getClusterIds());

        this.log.append(regionInfo, this.htableDescriptor.getName(),

            walEdit, clusterId, now, this.htableDescriptor);

      } else {

        recordPutWithoutWal(familyMap);

      }

 

      long addedSize = applyFamilyMapToMemstore(familyMap, null);

      flush = isFlushSize(this.addAndGetGlobalMemstoreSize(addedSize));

    } finally {

      this.updatesLock.readLock().unlock(); //释放updatesLock

    }

  }

 

二、MemStore有一个lock锁,该锁涉及如下的方法:


   其中snapshotclearSnapshot方法要求持有lock的write锁,这两个方法均是在flush memstore期间调用,这两个flush的子过程中会产生的write排它锁会影响到对memstore的所有读写操作,而从hbase读取数据中的第一步就是读取memstore,可见flush memstore是一个比较重的过程,影响读写,而一个flush操作至少会flush整个region,在flush期间,整个region的服务性能均会下降,因此有合适的flush次数和region的大小对性能提升会有所帮助。flush的次数主要受如下配置项影响:

hbase.regionserver.global.memstore.upperLimit

hbase.regionserver.global.memstore.lowerLimit

hbase.hregion.memstore.flush.size

 

  可以适当调大以上3项配置,但是需要注意的是并不是越大越好,如果全局的lowerLimit和upperLimit过大,则会影响读的性能,如果局部的flush.size过大则会导致一次flush的时间过长,而且当数据写入分散到每个region比较均衡时,可能单个regionmemstore均没有达到阀值而全局的memstore以及达到阀值,这会导致整个regionservice的写、删等修改memstore内存的操作阻塞,并且可能会多生成一些相对较小的storeFile文件,从而又导致增加compact的次数,compact也是比较消耗资源的操作。

  • 大小: 16.3 KB
  • 大小: 28.1 KB
  • 大小: 18.4 KB
  • 大小: 12.2 KB
分享到:
评论

相关推荐

    HBase性能深度分析

    本文将深入探讨HBase的性能测试细节,重点剖析数据插入性能,并通过实证分析揭示其背后的机制与优化策略。 #### 数据插入性能测试设计 在评估HBase的实时数据插入性能时,测试场景设计至关重要。以随机值的Rowkey...

    多线程 hbase

    3. **异步处理**:考虑使用异步回调机制,进一步提高吞吐量。 4. **监控与调优**:定期监控系统性能,如CPU、内存和网络使用情况,根据实际情况进行调优。 五、总结 多线程在HBase中的应用能显著提高数据处理速度,...

    hbase-0.92.1+zookeeper

    4. **锁服务**:在多节点并发操作时,Zookeeper提供分布式锁服务,防止数据冲突。 5. **监控和警报**:Zookeeper也用于监控系统状态,一旦检测到异常,可以触发警报机制。 在HBase 0.92.1的安装过程中,用户首先...

    HBase-并发控制机制解析

    为了实现事务特性,HBase采用了各种并发控制策略,包括各种锁机制、MVCC机制等。本文首先介绍HBase 的两种基于锁实现的同步机制,再分别详细介绍行锁的实现以及各种读写锁的应用场景,最后重点介绍MVCC机制的实现...

    apache_hbase_reference_guide.pdf

    HBase 提供了多种机制来确保数据的一致性,包括事务机制、锁机制和 caching 机制等。 9. HBase 安全机制 HBase 提供了多种安全机制来保护数据,包括身份验证、授权和加密等机制。 10. HBase 监控和维护 HBase ...

    [原创]HbaseClient

    4. 错误处理:HbaseClient具有良好的错误恢复机制,当服务器端出现问题时,客户端会自动重试,保证数据操作的可靠性。 5. 客户端缓存:为了提高性能,HbaseClient使用了缓存策略,如Cell缓存和RowCache。Cell缓存将...

    Hbase+Spring boot实战分布式文件存储

    以读写流程为引,结合前面集群部署所展现的HBase三大模块,讲解HBase各个模块之间的协作,帮助我们了解HBase的运行机制。并对HBase进行实战操作,讲解基本的shell命令及java api。重点讲解如何通过过滤器筛选数据......

    hbase 源码包

    `org.apache.hadoop.hbase.locking`包提供了行级和表级的锁机制,保证并发操作的正确性。 四、HBase优化 1. **Region大小优化**:根据业务需求合理设置Region大小,避免过大的Region导致的负载不均。 2. **Column...

    HBase分布式事务与SQL实现

    HBase还支持多版本并发控制(MVCC),这种机制允许多个版本的数据项并存,通常用于实现读写一致性。 Google Percolator是一种为了解决大规模数据上增量处理问题的系统。它以事务方式工作,为每个写入操作分配唯一的...

    Hbase与zookeeper笔记备份.rar

    2. 协同机制:Hbase依赖Zookeeper进行状态维护和故障恢复,而Zookeeper依赖Hbase提供高可用的服务,两者相互协作,共同构建起强大的分布式数据处理平台。 总结,Hbase与Zookeeper在大数据处理中的作用不可替代。...

    HBase在小米中的应用实践

    - **增强容错机制**:加强系统的容错能力和数据恢复机制,确保数据的安全性和可靠性。 - **扩展数据模型**:探索更灵活的数据模型,以适应更加复杂多变的业务需求。 - **集成AI技术**:结合人工智能技术,为用户提供...

    hbase0基础入门教程

    本教程将介绍HBase的基础知识,包括其作用、特点、与传统关系型数据库的差异、表模型、工作机制、安装方式、读写流程以及架构等内容。 HBase作用与特点: HBase是一个分布式的、列式存储、多版本、非关系型的数据库...

    ZooKeeper 原理及其在 Hadoop 和 HBase 中的应用

    2. **Region分配**:当新的Region需要被分配时,HBase利用ZooKeeper的选举机制选择一个合适的RegionServer来托管这个Region,从而保证数据分布的平衡。 3. **Master选举**:HBase Master是整个系统的协调者,负责...

    分布式锁-分析产生的原因,推导解决方案的原理及注意事项,适用于redis/hbase/zookpeer/etcd/mysql等

    分布式锁是一种在分布式系统中解决资源并发访问问题的机制,主要应用于多节点共享资源的场景。随着互联网技术的发展,高并发、大数据量的业务需求推动了分布式系统的普及,分布式锁在此背景下应运而生。 一、分布式...

    HBASE精炼版笔记v2.1.docx

    ### HBase精炼版笔记之Zookeeper详解 #### Zookeeper快速上手 Zookeeper是一个分布式的协调服务系统,主要用于分布式环境中解决数据一致性问题。它在众多分布式应用中扮演着核心角色,例如提供命名服务、配置管理...

    Cassandra与HBase系统架构比对

    Cassandra 强调一致性级别的设置,而HBase 强调事务处理和锁机制。 4. **应用场景**:Cassandra 更适合于需要高并发读写、高可用性和低延迟的应用场景;而HBase 更适合于需要大规模数据存储和复杂查询的应用场景。 ...

Global site tag (gtag.js) - Google Analytics