博文说明:1、研究版本hbase0.94.12;2、贴出的源代码可能会有删减,只保留关键的代码。
hbase的锁是采用jdk的ReentrantReadWriteLock类实现
一、HRegion有两种锁:lock、updatesLock,这两种锁均是ReentrantReadWriteLock类的实例,基本上所有的region操作均需要获取lock的read共享锁,在获取了lock的read锁后,如果是增加或者删除等影响数据内容的操作则还需要获取updatesLock的read锁。
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方法需要持有updatesLock的write锁,由此可见,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锁,该锁涉及如下的方法:
其中snapshot和clearSnapshot方法要求持有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比较均衡时,可能单个region的memstore均没有达到阀值而全局的memstore以及达到阀值,这会导致整个regionservice的写、删等修改memstore内存的操作阻塞,并且可能会多生成一些相对较小的storeFile文件,从而又导致增加compact的次数,compact也是比较消耗资源的操作。
相关推荐
本文将深入探讨HBase的性能测试细节,重点剖析数据插入性能,并通过实证分析揭示其背后的机制与优化策略。 #### 数据插入性能测试设计 在评估HBase的实时数据插入性能时,测试场景设计至关重要。以随机值的Rowkey...
3. **异步处理**:考虑使用异步回调机制,进一步提高吞吐量。 4. **监控与调优**:定期监控系统性能,如CPU、内存和网络使用情况,根据实际情况进行调优。 五、总结 多线程在HBase中的应用能显著提高数据处理速度,...
4. **锁服务**:在多节点并发操作时,Zookeeper提供分布式锁服务,防止数据冲突。 5. **监控和警报**:Zookeeper也用于监控系统状态,一旦检测到异常,可以触发警报机制。 在HBase 0.92.1的安装过程中,用户首先...
为了实现事务特性,HBase采用了各种并发控制策略,包括各种锁机制、MVCC机制等。本文首先介绍HBase 的两种基于锁实现的同步机制,再分别详细介绍行锁的实现以及各种读写锁的应用场景,最后重点介绍MVCC机制的实现...
HBase 提供了多种机制来确保数据的一致性,包括事务机制、锁机制和 caching 机制等。 9. HBase 安全机制 HBase 提供了多种安全机制来保护数据,包括身份验证、授权和加密等机制。 10. HBase 监控和维护 HBase ...
4. 错误处理:HbaseClient具有良好的错误恢复机制,当服务器端出现问题时,客户端会自动重试,保证数据操作的可靠性。 5. 客户端缓存:为了提高性能,HbaseClient使用了缓存策略,如Cell缓存和RowCache。Cell缓存将...
以读写流程为引,结合前面集群部署所展现的HBase三大模块,讲解HBase各个模块之间的协作,帮助我们了解HBase的运行机制。并对HBase进行实战操作,讲解基本的shell命令及java api。重点讲解如何通过过滤器筛选数据......
`org.apache.hadoop.hbase.locking`包提供了行级和表级的锁机制,保证并发操作的正确性。 四、HBase优化 1. **Region大小优化**:根据业务需求合理设置Region大小,避免过大的Region导致的负载不均。 2. **Column...
HBase还支持多版本并发控制(MVCC),这种机制允许多个版本的数据项并存,通常用于实现读写一致性。 Google Percolator是一种为了解决大规模数据上增量处理问题的系统。它以事务方式工作,为每个写入操作分配唯一的...
2. 协同机制:Hbase依赖Zookeeper进行状态维护和故障恢复,而Zookeeper依赖Hbase提供高可用的服务,两者相互协作,共同构建起强大的分布式数据处理平台。 总结,Hbase与Zookeeper在大数据处理中的作用不可替代。...
- **增强容错机制**:加强系统的容错能力和数据恢复机制,确保数据的安全性和可靠性。 - **扩展数据模型**:探索更灵活的数据模型,以适应更加复杂多变的业务需求。 - **集成AI技术**:结合人工智能技术,为用户提供...
本教程将介绍HBase的基础知识,包括其作用、特点、与传统关系型数据库的差异、表模型、工作机制、安装方式、读写流程以及架构等内容。 HBase作用与特点: HBase是一个分布式的、列式存储、多版本、非关系型的数据库...
2. **Region分配**:当新的Region需要被分配时,HBase利用ZooKeeper的选举机制选择一个合适的RegionServer来托管这个Region,从而保证数据分布的平衡。 3. **Master选举**:HBase Master是整个系统的协调者,负责...
分布式锁是一种在分布式系统中解决资源并发访问问题的机制,主要应用于多节点共享资源的场景。随着互联网技术的发展,高并发、大数据量的业务需求推动了分布式系统的普及,分布式锁在此背景下应运而生。 一、分布式...
### HBase精炼版笔记之Zookeeper详解 #### Zookeeper快速上手 Zookeeper是一个分布式的协调服务系统,主要用于分布式环境中解决数据一致性问题。它在众多分布式应用中扮演着核心角色,例如提供命名服务、配置管理...
Cassandra 强调一致性级别的设置,而HBase 强调事务处理和锁机制。 4. **应用场景**:Cassandra 更适合于需要高并发读写、高可用性和低延迟的应用场景;而HBase 更适合于需要大规模数据存储和复杂查询的应用场景。 ...