`

HBase-遇到的问题

 
阅读更多

 

rowlock release problem with thread interruptions in batchMutate

在region server的log中有大量的WARN日志:

 WARN org.apache.hadoop.hbase.regionserver.HRegion: Failed getting lock in batch put, 

row=0001558252

搜索关键字"Failed getting lock in batch put"整个hbase代码中只有一个地方出现了这个关键字

 

1.HRegionServer#multi()接收到multi操作,找到某个region对其操作

这里会创建mutation操作,和对应的锁,锁是用RowLock获得的,默认锁id是-1,如果是-1则返回null,这样构造出的Pair对的first就是mutation,second就是null了,再将构造好的值传给HRegion#batchMutate()处理

         List<Pair<Mutation,Integer>> mutationsWithLocks =
              Lists.newArrayListWithCapacity(mutations.size());
          for (Action<R> a : mutations) {
            Mutation m = (Mutation) a.getAction();

            Integer lock;
            try {
              lock = getLockFromId(m.getLockId());
            } catch (UnknownRowLockException ex) {
              response.add(regionName, a.getOriginalIndex(), ex);
              continue;
            }
            mutationsWithLocks.add(new Pair<Mutation, Integer>(m, lock));
          }
          this.requestCount.addAndGet(mutations.size());
          OperationStatus[] codes =
              region.batchMutate(mutationsWithLocks.toArray(new Pair[]{}));

 2.HRegion#batchMutate()再调用HRegion#doMiniBatchMutation()

  这个函数很长,第一步是批量获得锁操作

while (lastIndexExclusive < batchOp.operations.length) {
        boolean shouldBlock = numReadyToWrite == 0;
        Integer acquiredLockId = null;
        try {
          acquiredLockId = getLock(providedLockId, mutation.getRow(),
              shouldBlock);
        } catch (IOException ioe) {
          LOG.warn("Failed getting lock in batch put, row="
                  + Bytes.toStringBinary(mutation.getRow()), ioe);
        }
 ....
}

 3.HRegion#getLock()函数是一个分支,通过debug来看,走的是if,因为lockid是null,在第一步里面有说明

  public Integer getLock(Integer lockid, byte [] row, boolean waitForLock)
  throws IOException {
    Integer lid = null;
    if (lockid == null) {
      lid = internalObtainRowLock(row, waitForLock);
    } else {
      if (!isRowLocked(lockid)) {
        throw new IOException("Invalid row lock");
      }
      lid = lockid;
    }
    return lid;
  }

 4.最后调用HRegion#internalObtainRowLock(final byte[] row, boolean waitForLock)

     while (true) {
        CountDownLatch existingLatch = lockedRows.putIfAbsent(rowKey, rowLatch);
        if (existingLatch == null) {
          break;
        } else {
          // row already locked
          if (!waitForLock) {
            return null;
          }
          try {
            if (!existingLatch.await(this.rowLockWaitDuration,
                            TimeUnit.MILLISECONDS)) {
              throw new IOException("Timed out on getting lock for row="
                  + Bytes.toStringBinary(row));
            }
          } catch (InterruptedException ie) {
            // Empty
          }
        }
      }

internalObtainRowLock()函数的开头会创建一个readLock(),在函数结束后会释放这个readLock()

lockedRows是一个ConcurrentHashMap,当第一次调用putIfAbsent()时候,由于map中还没有这个key,所以返回的CountDownLatch为null,于是直接返回了。

可以看到lockedRows的key就是rowkey,所有之前这个map中存在了相同的rowkey,但是没有被remove掉,之后又有请求要操作相同的key就会等待,如果等待30秒(rowLockWaitDuration值为30秒)则会抛出异常,之后向上抛被HRegion#batchMutate()捕获并打印日志,也就是日志中出现的 Failed getting lock in batch put

这个锁只对于Put和Delete操作,Get操作不受锁的影响

 

这个函数有一个waitForLock参数,如果为false,则不会等待直接返回

在第二步中有一个中有一个重试次数,如果不为0则传到internalObtainRowLock()函数时变量waitForLock就为false,但是不会做这个重试。而是直接返回了,所以每次再有新的请求时,都会用waitForLock=true去调用这个函数,所以也就阻塞了,而且HRegion#batchMutate()有一个循环判断,这个循环也没有退出来,也就不是不停的调用HRegion#doMiniBatchMutation(),不停的重试,获取锁。

如果锁住rowkey的这个进程卡主了或者其他原因导致lockedRows中一直有这个rowkey,那么这个重试循环就不会退出导致死循环,所以日志会会出现大量的Failed getting lock in batch put

参考:

HBASE-7711

RegionServer stuck in internalObtainRowLock forever - HBase 0.94.7

How to improve my configuration of HBase version cdh4.4.0

 

 

 

 

 

分享到:
评论

相关推荐

    apache-phoenix-4.14.3-HBase-1.3-bin.tar.gz

    当遇到性能问题时,可以通过调整查询语句、优化索引或增加资源来提升性能。 8. **版本兼容性**:这个4.14.3版本的Phoenix是为HBase 1.3版本设计的,这意味着它可能不兼容其他HBase版本。在升级或降级HBase时,需要...

    Elasticsearch-HBase-River同步

    4. **错误处理**:如果在同步过程中遇到问题,插件通常会有一定的错误处理机制,比如重试或记录错误日志。 **优化与注意事项** 1. **性能优化**:为了减少对HBase和ES的压力,可以调整同步频率,例如设置合适的...

    hbase-2.2.4-bin-for-hadoop3.tar.gz

    本文将详细介绍如何解决HBase与Hadoop不同版本之间的适配问题,特别是针对标题中的“hbase-2.2.4-bin-for-hadoop3.tar.gz”压缩包,它是为了解决官方HBase 2.2.4与Hadoop 2.8.5不兼容的问题而特别编译的版本,专为...

    ranger-2.0.0-hbase-plugin.tar.gz

    描述中提到,通常在互联网上找到的教程多是关于如何从源代码编译Ranger,而这个压缩包提供了一个已经编译好的版本,节省了用户自行编译的时间和可能遇到的问题。编译Ranger时,可能需要依赖各种库和工具,配置环境...

    hbase-0.98.1源码包

    通过阅读源码,开发者可以更深入地理解HBase的工作原理,优化应用程序性能,解决遇到的问题,或者为HBase贡献新的功能和改进。此外,还可以对比不同版本的源码,了解HBase的发展历程和技术演进。

    hbase-server-0.98.8-hadoop1.zip

    8. 如何在Elasticsearch集群中部署和配置身份验证插件:步骤、配置文件详解以及可能遇到的问题和解决方案。 这些知识点对于理解和操作HBase及Elasticsearch环境至关重要,无论是开发者还是运维人员,都需要掌握这些...

    在Ubuntu安装配置hbase

    如果在执行`hbase version`时遇到问题,可能需要检查`/usr/local/hbase/conf/hbase-env.sh`文件。确保没有注释掉`export JAVA_HOME`这一行,它应该指向你的JDK安装路径,例如`export JAVA_HOME=/usr/lib/jvm/java-8...

    ranger-2.0.0-SNAPSHOT-hbase-plugin.tar.gz

    在实际操作中,用户可能会遇到一些挑战,如性能影响、策略冲突等,这就需要根据具体情况进行调整优化。总的来说,Ranger HBase插件提供了一种强大而灵活的方式来保护HBase的数据安全,确保只有授权的用户才能访问...

    hbase-echarts.zip

    5. **错误处理和日志记录**:确保在与HBase交互时遇到问题时,有适当的错误处理机制和日志记录,方便问题排查。 这个项目对于想要学习如何使用Java操作HBase以及如何将HBase数据展示为可视化图表的开发者来说,具有...

    hbase-0.94脚本hbase在cygwin的环境的bug

    在实际操作中,如果遇到类似问题,首先应检查HBase的日志文件,寻找错误信息或异常堆栈,这有助于定位问题的具体原因。其次,可以尝试在Cygwin环境下使用其他开源工具来辅助调试,如strace或gdb。最后,不要忘记查阅...

    HBASE-comparator.zip

    "HBASE-comparator.zip"文件可能包含了更多关于如何编写、配置和测试自定义Comparator的详细步骤,以及可能遇到的问题和解决策略。通过深入学习这些内容,你可以更好地掌握HBase的高级特性,提高数据存储和查询的...

    hbase-lib.tar.gz

    当遇到问题时,日志分析是排查故障的重要手段。 10. **扩展性**:随着数据的增长,HBase能够自动分裂Region以保持良好的性能。同时,HBase支持水平扩展,可以通过增加Region Server节点来提升系统容量。 在使用...

    CDH5.13-phoenix-4.11.0-HBase-1.2源码包 编译可用

    如果在构建过程中遇到问题,可能需要手动解决依赖冲突。 4. **编译源码**:执行`mvn compile`命令,这会编译源代码并生成相应的类文件。注意,编译过程可能需要较长时间,取决于硬件性能和网络状况。 5. **测试...

    HBase-云计算的分布式数据库

    - **故障排除**:如果遇到启动失败等问题,应首先检查网络配置和Hadoop环境的配置是否正确。 #### 七、扩展阅读 除了HBase之外,Apache Hadoop项目还包括了其他一些重要的组件,例如Pig(一种用于数据分析的高级...

    Hbase数据库界面管理器

    8. 故障排查:当遇到错误或异常时,管理器会提供详细的日志信息,帮助用户定位问题并解决。 下载的`hbase-data-browser-v4.0-RC`可能是该管理器的一个特定版本,版本号4.0 RC表示这是一款处于预发布阶段的软件,...

    HBase 1.2 分布式安装分享

    ### HBase 1.2 分布式安装分享 #### 一、概述 HBase是Apache Hadoop生态系统中的一个重要的组成部分,它提供了一种分布式的...需要注意的是,在实际部署过程中可能还会遇到各种具体问题,需要根据实际情况灵活应对。

    实验9-HBase shell命令使用.pdf

    它包括实验环境的设置、问题解决的思路、实验过程的详细描述、遇到的问题及解决方案,以及实验结果的展示。 在实验报告中,需要清晰地记录实验环境,包括操作系统、Hadoop版本、HBase版本和JDK版本等。解决问题的...

    尚硅谷大数据技术之HBase1

    在本篇关于“尚硅谷大数据技术之HBase1”的教程中,我们将重点探讨HBase的安装和配置过程,包括Zookeeper...在实际操作中,应确保每个步骤的正确执行,并留意可能遇到的问题,如时间同步问题,以保证HBase的稳定运行。

Global site tag (gtag.js) - Google Analytics