hbase源码学习.Lease

转载 2013年12月03日 15:28:03

引用:

http://hi.baidu.com/xuelianglv/blog/item/43adb1103504ef07203f2e0c.html#0

 

在BigTable的论文中讲到了Lease的概念。Least就好比你租房子住,签了多长的合约。如果时间长了,你可以续约(renew)。你也可能因为房子不习惯想换个地住,你就和房东说,取消住房(cancel)。当然在Hbase里,你不用交违约金。

因为BigTable会同时处理很多个客户端,就好比是一个有多套房子的房东同时把不同房间租给了多个不同的客户。那它关心什么呢?我想他首先关心的是每 个客户的合约(lease)什么时候到期了。在HBase里,也有类似的问题需要进行管理。每个合约用一个Lease表示,这个类继承了java的 Delayed接口。Delayed接口简单的讲,就是告诉其它人在过一段时间要有事发生. 在这里,用于Lease合约超期了通知它人。这个它人是在创建Lease时指定的,就好比是签租房合同时上面填写的租房人名字。

总结下,这里提到了几个概念:
合约 (租房合约              ): Least
它人 (合约过期通知对象): Listener
在Hbase里,每一份Lease都用一个唯一的名字来标识它。如果你想renew一个不存在的Lease或者想创建一个已经存在的Lease都会抛出异常。

最后,HBase具体怎么判断哪个Lease过期了呢?是由Leases类实现的。它把所有的Lease存放在DelayQueue中,并不断轮询是否由Lease
过期了。轮询(poll)的频率由leaseCheckFrequency控制。Lease的租用时间长度由leasePeriod指定。
    lease = leaseQueue.poll(leaseCheckFrequency, TimeUnit.MILLISECONDS);

当轮询到一个Lease过期了,就将该Lease删除并通知该Lease的Listener。

 

-----------------------------------------------------------------------------------------------------------

我的学习收获:

-----------------------------------------------------------------------------------------------------------

总的来说HBase中的lease使用很简单:

1)创建对象实例时,指明所有lease过期时间和check过期操作的频率;

2)创建lease,指明lease的name和lease过期时的操作,即一个concrete的LeaseListener。

    稍微关心一下其内部实现。“每个合约用一个Lease表示,这个类继承了java的 Delayed接口”。Delayed接口中包含了两方面的信息:1)delay time;2)如何进行Compare。对于1),是为了把lease存放在DelayQueue中,从而能按照指定的delay time将lease从队列中poll出来;对于2),是为了保证在DelayQueue中的lease按照delay time由小到大的顺序排队。实际上DelayQueue内部使用了PriorityQueue,并且没有指定Comparator,所以就是按照队列中对象实现的Comparable进行由小到大顺序排列。

    Leases的结构:

可以看出,Lease开始run()之后就会不断从DelayQueue中poll出Lease,一旦获得Lease(该lease当然是已经过期了)就调用lease.getListerner().leaseExpired().

HBase中有两个concrete的LeaseListener:RowLockListener和ScannerListener。

Case 1:

在对HBase中一行进行操作时HBase会对这一行加锁,一般情况下这个锁会unlock,但是在regionserver非常繁忙的时候(比如split过多)或者出现异常时这个锁的释放无法执行。此时就要依靠lease来释放这个锁:

public void leaseExpired() {
      LOG.info("Row Lock " + this.lockName + " lease expired");
      Integer r = rowlocks.remove(this.lockName);
      if (r != null) {
        region.<span style="background-color: #ffff00;">releaseRowLock</span>(r);
      }
    }

 

Case 2:

在使用HTable进行scan操作的时候用户常常会忘记调用ScanResult.close()。此时也需要lease来释放资源:

public void leaseExpired() {
      LOG.info("Scanner " + this.scannerName + " lease expired");
      RegionScanner s = scanners.remove(this.scannerName);
      if (s != null) {
        try {
          HRegion region = getRegion(s.getRegionInfo().getRegionName());
          if (region != null && region.getCoprocessorHost() != null) {
            region.getCoprocessorHost().preScannerClose(s);
          }
 
          <span style="background-color: #ffff00;">s.close();</span>
          if (region != null && region.getCoprocessorHost() != null) {
            region.getCoprocessorHost().postScannerClose(s);
          }
        } catch (IOException e) {
          LOG.error("Closing scanner for "
              + s.getRegionInfo().getRegionNameAsString(), e);
        }
      }
    }
  }

 

HBase中的LeaseException异常问题

最近的工作中,有个对hbase的批量scan处理,HBase regionserver的log中出现了如下错误: org.apache.hadoop.hbase.regionserver.L...
  • shenxiaoming77
  • shenxiaoming77
  • 2014年01月06日 12:11
  • 1077

hbase0.9x问题总结

1.最近hbase的rgion经常挂掉一个,查看该节点日志发现如下错误: 2014-02-22 01:52:02,194 ERROR org.apache.hadoop.hbase.regionse...
  • jiangheng0535
  • jiangheng0535
  • 2014年02月22日 08:54
  • 3345

租约机制以及在hbase中的应用

为什么需要Lease 分布式系统中为什么需要租约机制,这是因为在分布式系统,为了保证服务的高可用,需要在服务发生故障的时候及时启动另外一个服务实例以替换故障服务。这样就需要在服务端和客户端或者服务端...
  • bryce123phy
  • bryce123phy
  • 2017年02月18日 18:00
  • 993

How-to: resolve regionserver died with "No lease on /hbase/oldWALs/..."

Error Log from died regionserver:  2015-06-11 16:23:03,072 ERROR [regionserver/slave04/172.31.34.64...
  • lulynn
  • lulynn
  • 2015年06月16日 11:10
  • 2205

hbase 问题

问题: 解决办法: WARN  [regionserver/CNSZ22VL3579/10.202.43.134:16020] wal.ProtobufLogWriter: Failed to w...
  • CottonDuke
  • CottonDuke
  • 2017年08月11日 14:07
  • 267

HBase-1.2.1之HRegionServer启动源码学习

在hbase-server项目中的org.apache.hadoop.hbase.regionserver.HRegionServer类中。 public HRegionServer(Configur...
  • mm_bit
  • mm_bit
  • 2016年07月28日 14:49
  • 760

org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException: org.apache.hadoop.hdfs.server.namenode

1.最近hbase的rgion经常挂掉一个,查看该节点日志发现如下错误: 2014-02-22 01:52:02,194 ERROR org.apache.Hadoop.hbase.region...
  • DENGZHUYU
  • DENGZHUYU
  • 2015年04月13日 15:51
  • 1340

HBase学习总结(2):HBase介绍及其基本操作

(HBase是一种数据库:Hadoop数据库,它是一种NoSQL存储系统,专门设计用来快速随机读写大规模数据。在已成功安装并正常启动的前提下,本文介绍HBase的基本操作。) 一、HBase简介 ...
  • zhouzxi
  • zhouzxi
  • 2015年06月29日 14:44
  • 3222

大数据学习——HBase 入门

HBase学习环境shiyanlou 《HBase介绍、安装与应用案例》 - CentOS6.6 64位 - JDK 1.7.0_55 64位 - Hadoop 1.1.2Hbase 介绍...
  • xundh
  • xundh
  • 2017年04月19日 22:16
  • 1000

hbase 租约超时及rpc超时出现的问题

随着数据量的增大,HIVE查询HBase的时候又出现了scan数据缓慢的问题,在HBase regionserver的log中出现了如下错误:   [plain] view p...
  • fhx007
  • fhx007
  • 2015年05月22日 01:14
  • 2387
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hbase源码学习.Lease
举报原因:
原因补充:

(最多只允许输入30个字)