`
无尘道长
  • 浏览: 157332 次
  • 性别: 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采用了各种并发控制策略,包括各种锁机制、MVCC机制等。本文首先介绍HBase 的两种基于锁实现的同步机制,再分别详细介绍行锁的实现以及各种读写锁的应用场景,最后重点介绍MVCC机制的实现...

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

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

    bigdata-practice:常用大数据工具学习实战,包含Hadoop、HBase、Kafka、ClickHouse、Hive、Redis、Zookeeper....未完待续

    HBase Practice Hive Practice Kafka Practice Click House Redis Practice 缓存击穿,缓存穿透,缓存雪崩的解决方案 分布式数据库与缓存双写一致性解决方案 使用redis简单正确实现分布式锁 使用Lettuce作为redis...

    HBase原理–分布式系统中snapshot是怎么玩的?

    是因为镜像得到的数据必须是某一时刻完全一致的数据),拷贝的这段时间不允许对原数据进行任何形式的更新删除,仅提供只读操作,拷贝完成之后再释放锁。这种方式涉及数据的实际拷贝,数据量大的情况下必然会花费大量...

    2017最新大数据架构师精英课程

    123_hbase版本机制 124_hbase-ttl-min-versions-keep-deleted-cells" @- N5 [2 s; S3 T$ H' C 125_keep-deleted-cells控制是否保留删除的shell$ V8 |; Q7 g" ]- C# j% |! y 126_过滤器rowkey-family 127_过滤器-分页...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    hbase mongodb strom spark java语言 语言语法基础 异常 泛型 内部类 反射 序列化 nIo 匿名类 包装类 优先级 引用 语言工具类库 容器类 集合 链表 map 工具类 系统类 日期类 数字类 字符...

    最详细Zookeeper学习资料(源码)

    分布式同步:ZooKeeper提供了分布式锁和顺序节点等特性,可以帮助开发者实现复杂的分布式同步机制。 组服务:ZooKeeper支持创建临时节点,可以用于实现分布式队列、成员管理和领导者选举等功能。 ZooKeeper被广泛...

    云计算第二版

    2.3 分布式锁服务Chubby 25 2.3.1 Paxos算法 26 2.3.2 Chubby系统设计 27 2.3.3 Chubby中的Paxos 29 2.3.4 Chubby文件系统 31 2.3.5 通信协议 32 2.3.6 正确性与性能 34 2.4 分布式结构化数据表Bigtable 35 2.4.1 ...

    Hadoop权威指南 第二版(中文版)

     锁服务  生产环境中的ZooKeeper  可恢复性和性能  配置 第15章 开源工具Sqoop  获取Sqoop  一个导入的例子  生成代码  其他序列化系统  深入了解数据库导入  导入控制  导入和一致性  直接模式导入  ...

    Hadoop权威指南(中文版)2015上传.rar

    锁服务 生产环境中的ZooKeeper 可恢复性和性能 配置 第15章 开源工具Sqoop 获取Sqoop 一个导入的例子 生成代码 其他序列化系统 深入了解数据库导入 导入控制 导入和一致性 直接模式导入 使用导入的数据 导入的数据与...

    分布式协调工具-ZooKeeper实现动态负载均衡

    1. 所谓保持独占,就是所有试图来获取这个锁的客户端,最终只有一个可以成功获得这把锁。通常的做法是把 zk 上的一个 znode 看作是一把锁,通过 create znode 的方式来实现。所有客户端都去创建 /distr

    大数据开源框架集锦.pdf

    实现诸如数据发布 订阅、负载均衡、命名、集群管理 master节点管理 分布式锁和分布式队列 6 数据存储 Hbase 分布式⾯向列的NoSQL开源数据库 Cassandra 分布式的混合NoSQL数据库 ,还有C++版本ScyllaDB MongDB ⾯向⽂...

    各大数据组件介绍.pdf

    各⼤数据组件介绍 ⼀、zookeeper ZooKeeper是⼀个的,开放源码的协调服务,是的Chubby⼀个的实现,是Hadoop和Hbase的重要组件。它是⼀个为分布式应⽤提供⼀致 性服务的软件,提供的功能包括:配置维护、域名服务、...

    大数据发展历史.pdf

    2、分布式数据库 事务性数据库技术:NoSQL:(⽀持⾮关系数据库、具有多个节点分割和复制数据的能⼒、⽤最终⼀致性机制解决并发读操作与控制问 题、充分利⽤分布式索引及内存提⾼性能)代表有:BigTable、HBase、...

Global site tag (gtag.js) - Google Analytics