`
iwinit
  • 浏览: 454782 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

[HBase]记一个state异常

阅读更多

昨天联调的时候发现一个问题,请求发送后,页面上一直不返回数据,好像一直在waiting。用stack看了下,第一个线程在等待hbase RPC请求返回数据

"http-bio-8080-exec-5" daemon prio=10 tid=0x00002aaab3661000 nid=0x2bb6 in Object.wait() [0x0000000045258000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000000d2067280> (a org.apache.hadoop.hbase.ipc.HBaseClient$Call)
        at java.lang.Object.wait(Object.java:485)
        at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:907)
        - locked <0x00000000d2067280> (a org.apache.hadoop.hbase.ipc.HBaseClient$Call)
        at org.apache.hadoop.hbase.ipc.SecureRpcEngine$Invoker.invoke(SecureRpcEngine.java:157)
        at $Proxy9.getProtocolVersion(Unknown Source)
        at org.apache.hadoop.hbase.ipc.SecureRpcEngine.getProxy(SecureRpcEngine.java:198)
        at org.apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.java:335)
        at org.apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.java:312)
        at org.apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.java:364)
        at org.apache.hadoop.hbase.ipc.HBaseRPC.waitForProxy(HBaseRPC.java:236)
        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getHRegionConnection(HConnectionManager.java:1293)
        - locked <0x00000000d1d791e0> (a java.lang.String)
        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getHRegionConnection(HConnectionManager.java:1

 而其他线程则处于block状态

"http-bio-8080-exec-8" daemon prio=10 tid=0x0000000041d07800 nid=0x2f5b waiting for monitor entry [0x0000000046d74000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getHRegionConnection(HConnectionManager.java:1283)
        - waiting to lock <0x00000000d1d791e0> (a java.lang.String)
        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getHRegionConnection(HConnectionManager.java:1249)
        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getHRegionConnection(HConnectionManager.java:1236)
        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegionInMeta(HConnectionManager.java:945)
        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:841)
        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:810)
        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegionInMeta(HConnectionManager.java:942)
        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:845)

因为之前看过对应的代码,请见 http://iwinit.iteye.com/blog/1815347 和 http://iwinit.iteye.com/blog/1811265

看代码是region location的时候RPC meta表所在regionserver的时候卡住了。因为系统刚起来的时候没有cache,所以请求都需要region location,.meta.只在一台rs上,所以都block住了。再看之前的RPC分析文章,第一个请求确实已经发出去了,处于wait状态,也就是等待IO线程notify。奇怪的是,jstack里并没有IO线程(IPC关键字)。也就是说第一个请求线程永远无法被唤醒了:(。Log也没有任何记录,开始各种debug,因为我们客户端是自己的client,SecureConnection,其receiveResponse方法如下

try {
        int id = in.readInt();                    // try to read an id
 
        if (LOG.isDebugEnabled())
          LOG.debug(getName() + " got value #" + id);
//这里把call删除掉了,后续IO线程会因为空闲而自动关闭退出
        Call call = calls.remove(id);
//协议中的state字段
        int state = in.readInt();     // read call status
        if (LOG.isDebugEnabled()) {
          LOG.debug("call #"+id+" state is " + state);
        }
//对state处理,注意这里没有从的else处理,也就是说如果state不是这3种的话,直接就不处理了,但是call请求确已经被删除掉了。。。
        if (state == Status.SUCCESS.state) {
          Writable value = ReflectionUtils.newInstance(valueClass, conf);
          value.readFields(in);                 // read value
          if (LOG.isDebugEnabled()) {
            LOG.debug("call #"+id+", response is:\n"+value.toString());
          }
          call.setValue(value);
        } else if (state == Status.ERROR.state) {
          call.setException(new RemoteException(WritableUtils.readString(in),
                                                WritableUtils.readString(in)));
        } else if (state == Status.FATAL.state) {
          // Close the connection
          markClosed(new RemoteException(WritableUtils.readString(in),
                                         WritableUtils.readString(in)));
        }
      } catch (IOException e) {

 debug的时候发现server端范围的state是5xxxxxx的数字。。。原因是sever段没有启用secure导致协议不一致了。。client没有容错导致。

 

 

分享到:
评论

相关推荐

    HbaseTemplate 操作hbase

    在IT行业中,尤其是在大数据处理领域,HBase是一个广泛使用的分布式、高性能、列式存储的NoSQL数据库。HBase是建立在Hadoop文件系统(HDFS)之上,为处理大规模数据提供了一个高效的数据存储解决方案。而Spring Data...

    hbase-1.1.5-bin版本的压缩包,下载到本地解压后即可使用 HBase 是一个开源的、分布式的NoSQL数据库

    HBase 是一个开源的、分布式的、版本化的 NoSQL 数据库(也即非关系型数据库),它利用 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)提供分布式数据存储。与传统的关系型数据库类似,HBase 也以...

    hbase-1.2.1-bin.tar的压缩包,下载到本地解压后即可使用 HBase 是一个开源的、分布式的NoSQL 数据库

    HBase 是一个开源的、分布式的、版本化的 NoSQL 数据库(也即非关系型数据库),它利用 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)提供分布式数据存储。与传统的关系型数据库类似,HBase 也以...

    HBase开启审计日志

    HBase是一款分布式列式存储系统,基于Google的Bigtable论文实现。它具有高可靠性、高性能、面向列、可伸缩的特点,非常适合处理海量数据。在大数据领域,HBase被广泛用于实时读/写访问以及随机查询的大规模数据集。...

    hbase用于查询客户端工具

    1. **HBase Shell**:这是HBase自带的一个命令行接口,用户可以通过Java REPL(Read-Eval-Print Loop)与HBase交互。HBase Shell提供了创建表、删除表、插入数据、查询数据等基本操作,同时也支持复杂的条件查询和...

    HBase(hbase-2.4.9-bin.tar.gz)

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

    hbase安装,节点添加,移除,常见问题解决

    在分布式大数据存储领域,HBase是一个非常重要的列式数据库,尤其在处理海量数据时表现出卓越的性能。本文将深入探讨如何进行HBase的安装、节点的添加与移除,以及如何解决常见的问题。 首先,Hadoop是HBase的基础...

    hbase的rowkey设计与hbase的协处理器运用.docx

    HBase 是一个基于 HDFS 的分布式、面向列的 NoSQL 数据库,具有高性能、可靠性和扩展性等特点。本文将详细介绍 HBase 的 RowKey 设计和协处理器运用。 HBase 的介绍 HBase 是一个基于 HDFS 的分布式、面向列的 ...

    Hbase 删除某一列

    删除Hbase中某个表的一列值 命令 java -jar deleteOneColumn.jar(这个文件的路径) '表名' '列簇名' '列名'

    HBase详细讲解

    HBase是Apache Hadoop项目的子项目,它是一个分布式的、面向列的开源数据库。它采用了Google的Bigtable论文中提到的数据模型,并且与Hadoop的HDFS文件系统紧密集成,适合存储大量非结构化数据。 HBase的历史可以...

    大数据hbase测试项目, String boot + hadoop + hbase 的一个测试项目

    大数据hbase测试项目, String boot + hadoop + hbase 的一个测试项目 1.jdk路径不能有空格,中文 2.spring 示例官方xml配置中需有调整,避免 delete xxx 异常。 3.maven本地版本不能小于cm上hadoop、hbase版本。

    Hbase权威指南(HBase: The Definitive Guide)

    - **HBase的历史**:HBase起源于一个叫做Hadoop的项目中的子项目,最初是为了实现一个类似于Bigtable的功能而创建的。 - **术语介绍**: - **背景层**(Backdrop):HBase运行于Hadoop之上,利用Hadoop提供的分布式...

    Hbase2.2.4.rar

    Hbase2.2.4安装包,HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供...

    HBase学习利器:HBase实战

    HBase是Apache Hadoop生态系统中的一个分布式、可扩展的列族数据库,它提供了类似Bigtable的能力,能够在大规模数据集上进行随机读写操作。HBase是基于Hadoop Distributed File System (HDFS)构建的,能够处理PB级别...

    Hbase

    HBase 是一个分布式的、基于列族的开源数据库,它运行在 Apache Hadoop 文件系统(HDFS)之上。HBase 提供了对大规模数据集的实时读写访问,是大数据领域的重要组件。它设计用于处理PB级别的数据,适合于拥有数十亿...

    scala API 操作hbase表

    HBase是一个分布式、面向列的NoSQL数据库,它构建于Hadoop之上,提供实时访问大量数据的能力。Scala是一种强大的函数式编程语言,与Java虚拟机(JVM)兼容,因此非常适合编写HBase的客户端程序。 首先,确保你的...

    C#操控hbase数据库

    在IT行业中,数据库管理系统是数据存储和处理的关键技术,而HBase作为一个分布式、列式存储的NoSQL数据库,尤其适用于大规模大数据的存储和查询。它基于Google的Bigtable设计,运行于Apache Hadoop之上,提供了高...

    HBase官方文档中文版-HBase手册中文版

    HBase是一种分布式、基于列族的NoSQL数据库,由Apache软件基金会开发并维护,是Hadoop生态系统中的重要组件。这份“HBase官方文档中文版”提供了全面深入的HBase知识,帮助用户理解和掌握如何在大数据场景下有效地...

    pinpoint的hbase初始化脚本hbase-create.hbase

    搭建pinpoint需要的hbase初始化脚本hbase-create.hbase

    在windows上安装Hbase

    HBase是一个分布式的、基于列模式的架构,在Apache Hadoop和Apache Zookeeper上数据库。它具有高性能、可扩展性和灵活性等特点。 七、HBase的应用场景 HBase广泛应用于大数据处理、实时数据处理、数据仓库等领域。...

Global site tag (gtag.js) - Google Analytics