`
杨俊华
  • 浏览: 97223 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

用HBaseAdmin的同学要小心--记一次HBase RegionServer的退出

阅读更多
一大早过来,有RegionServer挂了。
查看log,显示
2011-09-25 22:31:51,185 [main-SendThread(XXX:2181)] INFO org.apache.zookeeper.ClientCnxn: Unable to read additional data from server sessionid 0x30694969fba6a9, likely server has closed socket, closing socket connection and attempting reconnect



很明晰,连不上zookeeper了,多次重连接后失败,之后,regionserver退出。
这台机器是比较特殊的,因为我在上面跑了个HBase的availability 监控。

我担心会不会是这个导致的,虽然代码非常简单。
于是
netstat -anp|grep 2181

一查看,果真,这个进程居然占了近3千个zookeeper connection,因为client 端连接zookeeper的connection是有限制的,default 是30, 我们这里设置到3000。这样,regionserver因为获取不到zookeeper的connection而导致 退出。

因为监控的逻辑实在简单,怀疑落在了这样一句语句上

		try {
			HBaseAdmin.checkHBaseAvailable(hbaseConfig);
		} catch (MasterNotRunningException e) {
			logger.error(e.getMessage(),e);
			return new GangliaData("HBase Cluster Availability", e.getMessage() , 0);
		} catch (ZooKeeperConnectionException e) {
			logger.error(e.getMessage(),e);
			return new GangliaData("HBase Cluster Availability", e.getMessage() , 0);
		}


于是看了下checkHBaseAvailable的代码,

  public static void checkHBaseAvailable(Configuration conf)
  throws MasterNotRunningException, ZooKeeperConnectionException {
    Configuration copyOfConf = HBaseConfiguration.create(conf);
    copyOfConf.setInt("hbase.client.retries.number", 1);
    new HBaseAdmin(copyOfConf);
  }


这里,就是拷贝了conf,new一个新的HBaseAdmin,如果能创建,则证明cluster available,否则会抛出异常。

但是等等,这句里面创建了一个HBaseAdmin的实例,在构造函数里面会创建一个连接zookeeper的connection而不释放。

 public HBaseAdmin(Configuration c)
  throws MasterNotRunningException, ZooKeeperConnectionException {
    this.conf = HBaseConfiguration.create(c);
    this.connection = HConnectionManager.getConnection(this.conf);
    this.pause = this.conf.getLong("hbase.client.pause", 1000);
    this.numRetries = this.conf.getInt("hbase.client.retries.number", 10);
    this.retryLongerMultiplier = this.conf.getInt("hbase.client.retries.longer.multiplier", 10);
    this.connection.getMaster();
  }


最后查了一下网上,果真,这是HBase的一个bug, HBase 4417。
修改的方法就是

Index: src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
===================================================================
--- src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java	(revision 1171389)
+++ src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java	(working copy)
@@ -1254,6 +1254,7 @@
   throws MasterNotRunningException, ZooKeeperConnectionException {
     Configuration copyOfConf = HBaseConfiguration.create(conf);
     copyOfConf.setInt("hbase.client.retries.number", 1);
-    new HBaseAdmin(copyOfConf);
+    HBaseAdmin admin = new HBaseAdmin(copyOfConf);
+    HConnectionManager.deleteConnection(admin.getConfiguration(), false);
   }
 }





2
0
分享到:
评论

相关推荐

    hbase-0.98.6.1-src.zip

    - **Java API**:HBase提供了丰富的Java客户端API,包括HTable、HBaseAdmin等接口,用于操作表、region和行。 - **Shell**:HBase还包含了一个基于JRuby的命令行工具,可以执行各种管理操作。 5. **数据读写流程*...

    最新版linux hbase-2.3.2-client-bin.tar.gz

    在Linux环境下,我们可以使用hbase-2.3.2-client.jar来实现这一目标。这个客户端库包含了连接HBase集群、执行Get、Put、Scan等操作所需的API。 1. 连接集群:首先,我们需要配置HBase的连接参数,如Zookeeper地址。...

    hbase-0.94.13 jar和源码

    1. `HBaseAdmin`:用于管理HBase表,如创建、删除、修改表结构。 2. `HTable`:代表一个HBase表,提供了增删改查的基本操作。 3. `Put`:用于向表中写入数据。 4. `Get`:用于从表中读取数据。 5. `Scan`:用于执行...

    hbase 的java代码 集合 hbase 0.96

    在Java中,我们通过HBase客户端API与HBase交互,这些API包括了`HBaseAdmin`、`HTable`、`Put`、`Get`、`Scan`等核心类。 1. **连接HBase**:在Java代码中,我们使用`HBaseConfiguration.create()`来创建一个配置...

    hbase- java开发连接工具类

    5. **批量操作**:为了提高性能,`hbase-client.jar`支持批处理,允许一次性发送多条操作到服务器。 除了`hbase-client.jar`,可能还包含其他相关的JAR包,如`hbase-common.jar`,它包含了HBase的通用工具和模块,`...

    hbase+opentsdb+grafana视图展现

    ### hbase+opentsdb+grafana视图展现 #### HBase 部署与配置 ...这一系列操作能够实现基于HBase存储的数据,通过OpenTSDB处理并由Grafana展示实时视图的功能,从而帮助用户更好地监控和分析大数据平台的性能。

    hadoop-2.7.2-hbase-jar.zip

    在实际使用中,开发人员会通过HBase的API(如Admin API和Table API)来创建表、管理Region、读写数据等。例如,使用HBase的Put对象可以向表中插入一行数据,而Get对象则用于检索数据。Scan操作则允许按条件查询多行...

    hbase1.2+java开发最小依赖jar包合集

    例如,使用HBaseAdmin创建表,使用Table对象进行增删改查操作。 4. **最小依赖jar包**:这个合集包含HBase客户端所需的最小集,主要包括HBase的client、protocol和common模块,可能还包含Zookeeper和Hadoop的相关库...

    [原创]HbaseClient

    例如,`HBaseAdmin`类提供了管理表的各种方法。 2. 数据存取:客户端通过`HTable`对象与特定表进行交互,执行put、get、delete和scan等操作。`Put`用于写入数据,`Get`用于读取数据,`Delete`用于删除数据,`Scan`...

    HBase编程实践

    例如,使用HBaseAdmin类的createTable方法可以创建表,并指定列族: ```java HBaseAdmin admin = new HBaseAdmin(conf); HTableDescriptor desc = new HTableDescriptor(TableName.valueOf("myTable")); desc....

    HBase_Client_Api_Guide

    创建表主要是通过`HBaseAdmin`对象来完成的,该对象提供了`createTable`方法用于创建表。 - `public void createTable(HTableDescriptor desc)`: 这个方法用于创建一个新的表,其中`HTableDescriptor`包含了表的元...

    HBase 应用平台 Replication 功能

    HBase的Replication功能允许在一个集群(称为来源集群)中的RegionServer将变更复制到另一个集群(称为目标集群)。这种复制是异步的,意味着更改在源集群中提交后才会被复制。每个集群都有一个“replication peer...

    java大数据作业_3HBase

    ### Java大数据作业_3HBase知识点解析 #### 1. 使用Java集合的代码描述HBase的表结构 在HBase中,表结构由一系列的行组成,每行都有唯一的row key,并且每个单元格都存储在列族下。为了描述这样一个表结构,我们...

    hbase shell常用命令汇总

    - **功能**: 显示HBase集群的状态信息,包括活动Master节点以及RegionServer的状态。 - **示例**: ```shell hbase(main):002:0> status { "cluster" : "test-cluster", "timestamp" : 1649309921757, "master" ...

    Learning HBase(中文版)

    《Learning HBase(中文版)》是一本专为学习HBase设计的中文教材,适合对大数据处理和分布式数据库感兴趣的读者。HBase,全称为Apache HBase,是建立在Hadoop文件系统之上的分布式、版本化、列式存储的NoSQL数据库...

    HBase start

    HBaseAdmin admin = new HBaseAdmin(config); admin.createTable(new HTableDescriptor(TableName.valueOf("myTable"))); ``` 而在`HbaseSelecter.java`中,可能有如下代码用于查询数据: ```java Configuration ...

    hbase0.94java源代码

    1. HBase客户端:包含用于与HBase交互的API,如HTable和HBaseAdmin。 2. HBase服务器端:包括RegionServer和Master,它们负责处理客户端请求和集群管理。 3. Region分裂:当Region变得过大时,HBase会自动将其分裂...

    HBase二级索引

    第二步,结合索引定义和 DataTable Region 的 StartKey 信息,调用 HBaseAdmin 的 createTable(final HTableDescriptor desc, byte[][] splitKeys) 方法创建索引表。 知识点三:IndexTable RowKey 的设计 Index...

Global site tag (gtag.js) - Google Analytics