`

hbase 获取行锁源码分析

阅读更多

 

现象:60020中有许多连接,并且长久不放;

           hbase hbck已经连接不上60020

           日志中出现大量以下日志:

           

2014-12-24 17:36:47,821 WARN  [RpcServer.handler=1,port=60020] retry.RetryInvocationHandler: Exception while invoking class org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.get
BlockLocations. Not retrying because failovers (15) exceeded maximum allowed (15)
java.io.IOException: Failed on local exception: java.nio.channels.ClosedByInterruptException; Host Details : local host is: "host184/192.168.5.184"; destination host is: "host150":8020;
        at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:764)
        at org.apache.hadoop.ipc.Client.call(Client.java:1413)
        at org.apache.hadoop.ipc.Client.call(Client.java:1362)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:206)
        at $Proxy13.getBlockLocations(Unknown Source)
[hadoop-cdh@host184 logs]$ vi hbase-hadoop-cdh-regionserver-host184.log
        at org.apache.hadoop.hbase.regionserver.HRegionServer.doNonAtomicRegionMutation(HRegionServer.java:3469)
        at org.apache.hadoop.hbase.regionserver.HRegionServer.multi(HRegionServer.java:3359)
        at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:29503)
        at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2012)
        at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:98)
        at org.apache.hadoop.hbase.ipc.SimpleRpcScheduler.consumerLoop(SimpleRpcScheduler.java:160)
        at org.apache.hadoop.hbase.ipc.SimpleRpcScheduler.access$000(SimpleRpcScheduler.java:38)
        at org.apache.hadoop.hbase.ipc.SimpleRpcScheduler$1.run(SimpleRpcScheduler.java:110)
        at java.lang.Thread.run(Thread.java:722)
2015-02-27 00:48:19,543 WARN  [RpcServer.handler=16,port=60020] regionserver.HRegion: Failed getting lock in batch put, row=3d87cfc7693eed24f28afee4a0495f30
java.io.IOException: Timed out waiting for lock for row: 3d87cfc7693eed24f28afee4a0495f30
        at org.apache.hadoop.hbase.regionserver.HRegion.getRowLock(HRegion.java:3462)
        at org.apache.hadoop.hbase.regionserver.HRegion.doMiniBatchMutation(HRegion.java:2382)
        at org.apache.hadoop.hbase.regionserver.HRegion.batchMutate(HRegion.java:2249)
        at org.apache.hadoop.hbase.regionserver.HRegion.batchMutate(HRegion.java:2201)
        at org.apache.hadoop.hbase.regionserver.HRegion.batchMutate(HRegion.java:2205)
        at org.apache.hadoop.hbase.regionserver.HRegionServer.doBatchOp(HRegionServer.java:4253)
        at org.apache.hadoop.hbase.regionserver.HRegionServer.doNonAtomicRegionMutation(HRegionServer.java:3469)
        at org.apache.hadoop.hbase.regionserver.HRegionServer.multi(HRegionServer.java:3359)
        at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:29503)
        at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2012)
        at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:98)
        at org.apache.hadoop.hbase.ipc.SimpleRpcScheduler.consumerLoop(SimpleRpcScheduler.java:160)
        at org.apache.hadoop.hbase.ipc.SimpleRpcScheduler.access$000(SimpleRpcScheduler.java:38)
        at org.apache.hadoop.hbase.ipc.SimpleRpcScheduler$1.run(SimpleRpcScheduler.java:110)
        at java.lang.Thread.run(Thread.java:722)
2015-02-27 00:48:22,530 WARN  [RpcServer.handler=15,port=60020] regionserver.HRegion: Failed getting lock in batch put, row=3d87cfc7693eed24f28afee4a0495f30
java.io.IOException: Timed out waiting for lock for row: 3d87cfc7693eed24f28afee4a0495f30
        at org.apache.hadoop.hbase.regionserver.HRegion.getRowLock(HRegion.java:3462)
        at org.apache.hadoop.hbase.regionserver.HRegion.doMiniBatchMutation(HRegion.java:2382)
        at org.apache.hadoop.hbase.regionserver.HRegion.batchMutate(HRegion.java:2249)
        at org.apache.hadoop.hbase.regionserver.HRegion.batchMutate(HRegion.java:2201)
        at org.apache.hadoop.hbase.regionserver.HRegion.batchMutate(HRegion.java:2205)
        at org.apache.hadoop.hbase.regionserver.HRegionServer.doBatchOp(HRegionServer.java:4253)
        at org.apache.hadoop.hbase.regionserver.HRegionServer.doNonAtomicRegionMutation(HRegionServer.java:3469)
        at org.apache.hadoop.hbase.regionserver.HRegionServer.multi(HRegionServer.java:3359)
        at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:29503)
        at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2012)
        at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:98)
        at org.apache.hadoop.hbase.ipc.SimpleRpcScheduler.consumerLoop(SimpleRpcScheduler.java:160)
        at org.apache.hadoop.hbase.ipc.SimpleRpcScheduler.access$000(SimpleRpcScheduler.java:38)
        at org.apache.hadoop.hbase.ipc.SimpleRpcScheduler$1.run(SimpleRpcScheduler.java:110)
        at java.lang.Thread.run(Thread.java:722)

可以看出获取15次,都没有成功, 因为获取不到row=3d87cfc7693eed24f28afee4a0495f30的行锁

 

 

获得行锁超时问题部分源码:

 

 public RowLock getRowLock(byte[] row, boolean waitForLock) throws IOException {
    checkRow(row, "row lock");
    startRegionOperation();
    try {
      HashedBytes rowKey = new HashedBytes(row);
      RowLockContext rowLockContext = new RowLockContext(rowKey);

      // loop until we acquire the row lock (unless !waitForLock)
      while (true) {
        //获取锁,往currenthashmap中putifAbsent rowkey
        RowLockContext existingContext = lockedRows.putIfAbsent(rowKey, rowLockContext);
        if (existingContext == null) {
          // Row is not already locked by any thread, use newly created context.
          break;
        } else if (existingContext.ownedByCurrentThread()) {
          // Row is already locked by current thread, reuse existing context instead.
          rowLockContext = existingContext;
          break;
        } else {
          // Row is already locked by some other thread, give up or wait for it
          if (!waitForLock) {
            return null;
          }
          try {//等待其他线程 downlatch,释放锁
            if (!existingContext.latch.await(this.rowLockWaitDuration, TimeUnit.MILLISECONDS)) {
              throw new IOException("Timed out waiting for lock for row: " + rowKey);
            }
          } catch (InterruptedException ie) {
            LOG.warn("Thread interrupted waiting for lock on row: " + rowKey);
            InterruptedIOException iie = new InterruptedIOException();
            iie.initCause(ie);
            throw iie;
          }
        }
      }

      // allocate new lock for this thread
      return rowLockContext.newLock();
    } finally {
      closeRegionOperation();
    }
  }

 在一下这些地方,需要获得行锁

  

 

有关配置

<property>
       <name>hbase.rowlock.wait.duration</name>
       <value>90000</value>
       <description> 
        每次获取行锁的超时时间,默认为30s
       </description> 
</property>
<property>
			<name>hbase.regionserver.lease.period</name>
			<value>180000</value>
			<description> 
			客户端每次获得rs一次socket时间
			</description> 
</property>

<property>
       <name>hbase.rpc.timeout</name>
       <value>180000</value>
			<description> 
			rpc超时时间
			</description> 
</property>

<property>
       <name>hbase.client.scanner.timeout.period</name>
       <value>180000</value>
			<description> 
			客户端每次scan|get的超时时间
			</description> 
</property>

<property>
        <name>hbase.client.scanner.caching</name>
        <value>100</value>
			<description> 
			客户端每次scan的一个next,获得多少行,默认1
			</description> 
</property>

 

 

 

 

 

 

 

 

 

 

  • 大小: 27.1 KB
分享到:
评论

相关推荐

    基于Java语言的Apache HBase数据库设计源码分析

    在深入分析基于Java语言的Apache HBase数据库设计源码之前,我们首先需要理解HBase作为NoSQL数据库系统的核心概念和设计哲学。HBase是构建在Hadoop文件系统(HDFS)上的一个开源、分布式的列式存储数据库。它模仿了...

    hbase权威指南源码

    源码分析: 1. **目录结构**: 解压后的`hbase-book-master`包含项目的基本目录结构,如`src/main/java`用于存放Java源代码,`src/main/resources`存储资源配置文件,`pom.xml`是Maven项目对象模型,定义了项目的...

    基于Java语言的HBase数据库设计源码分析

    本系统基于Java语言开发,对HBase数据库进行了深入的设计和源码分析,提供了完整的系统文件,以供开发者学习和使用。 Java语言作为当前企业级应用开发的主流语言之一,其跨平台、面向对象等特性使得Java开发者可以...

    hbase-0.98.1源码包

    源码包“hbase-0.98.1-src.tar.gz”提供了HBase 0.98.1版本的完整源代码,对于理解其内部工作原理、进行二次开发或调试是非常有价值的。 HBase的核心概念包括: 1. 表:HBase中的表由行和列族组成,表名全局唯一。...

    HBase源码分析

    HBase源码分析揭示了HBase在RPC通信机制方面的一些关键技术点,这包括了角色分配、通信信道建立、通信接口协议定义、对象序列化、传输控制和会话管理,以及在传输过程中可能出现的错误处理和重试机制。 HBase中的...

    HBase源码分析与开发实战

    HBase源码分析与开发实战视频技术讲解高阶视频教程以及课件,内部讲解资料 内容非常详细 值得想要提高薪水的人去学习了解

    基于spark streaming+kafka+hbase的日志统计分析系统源码+项目说明.zip

    【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设...基于spark streaming+kafka+hbase的日志统计分析系统源码+项目说明.zip

    HBase源码(hbase-2.4.9-src.tar.gz)

    HBase源码(hbase-2.4.9-src.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File ...

    基于Java开发的分布式NoSQL数据库HBase设计源码分析

    分布式NoSQL数据库HBase设计源码分析 HBase是目前广泛使用的基于Hadoop的开源NoSQL数据库,它基于Google的Bigtable论文设计而来,主要面向大规模数据存储的需求。该项目的源码实现了一个可扩展的、分布式的、非关系...

    HBase实战源码

    源码分析是理解HBase工作原理和技术细节的重要途径。HBase在大数据领域扮演着关键角色,它能够处理海量数据并提供实时访问。下面,我们将深入探讨HBase的核心概念和源码中的关键组件。 1. **HBase架构**:HBase基于...

    基于Java语言的HBase分布式数据库设计源码分析

    随着大数据技术的发展,分布式数据库系统在处理大规模数据...通过分析源码,开发者能够学习到如何设计一个既高效又可靠的分布式数据库系统,这无疑会对他们在数据库设计、大数据处理等方面的研究和实践产生积极的影响。

    基于Java和多种语言的HBase分布式数据库设计源码分析

    在HBase这样的分布式数据库项目中,源码分析可以帮助开发者深入掌握其内部工作机制,比如数据是如何分布存储的、客户端是如何与HBase集群通信的、数据读写和更新是如何优化的、故障是如何处理的等等。这些知识对于...

    基于kafka和spark streaming和hbase的日志统计分析系统.zip

    基于kafka和spark streaming和hbase的日志统计分析系统.zip基于kafka和spark streaming和hbase的日志统计分析系统.zip基于kafka和spark streaming和hbase的日志统计分析系统.zip基于kafka和spark streaming和hbase的...

    hbase 1.2.0源码

    HBase 1.2.0是该数据库的一个稳定版本,包含了众多优化和改进,对于想要深入理解HBase工作原理或者进行大数据分析的学习者来说,研究其源码是非常有价值的。 一、HBase架构与核心概念 1. 表与Region:HBase中的...

    java操作Hbase之从Hbase中读取数据写入hdfs中源码

    在Java编程环境中,操作HBase并将其数据写入HDFS(Hadoop Distributed File System)是一项常见的任务,特别是在大数据处理和分析的场景下。本篇将详细介绍如何使用Java API实现这一功能,以及涉及到的关键技术和...

    Hbase权威指南源码

    《HBase权威指南》是一本深入探讨分布式列式数据库HBase的专业书籍,其源码提供了对HBase工作原理和实现细节的深入理解。HBase,作为Apache Hadoop生态系统中的一个关键组件,是为大规模数据存储设计的高性能、...

    Hbase1.3.1源码

    HBase是Apache软件基金会的一个开源项目,它是基于Google的Bigtable设计思想...通过分析HBase 1.3.1的源码,开发者可以深入理解HBase的工作原理,从而更好地优化应用、解决性能问题,甚至进行功能扩展和定制化开发。

    基于Java实现的Apache HBase分布式数据库设计源码分析

    该项目的文件结构和内容表明它是一个对HBase内部结构和工作机制进行了深入分析的源码优化项目。该项目不仅能够帮助开发者更好地理解HBase的内部工作原理,而且可以为分布式数据库的研究和应用提供重要的参考,尤其在...

Global site tag (gtag.js) - Google Analytics