一大早过来,有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);
}
}
分享到:
相关推荐
- **Java API**:HBase提供了丰富的Java客户端API,包括HTable、HBaseAdmin等接口,用于操作表、region和行。 - **Shell**:HBase还包含了一个基于JRuby的命令行工具,可以执行各种管理操作。 5. **数据读写流程*...
在Linux环境下,我们可以使用hbase-2.3.2-client.jar来实现这一目标。这个客户端库包含了连接HBase集群、执行Get、Put、Scan等操作所需的API。 1. 连接集群:首先,我们需要配置HBase的连接参数,如Zookeeper地址。...
1. `HBaseAdmin`:用于管理HBase表,如创建、删除、修改表结构。 2. `HTable`:代表一个HBase表,提供了增删改查的基本操作。 3. `Put`:用于向表中写入数据。 4. `Get`:用于从表中读取数据。 5. `Scan`:用于执行...
在Java中,我们通过HBase客户端API与HBase交互,这些API包括了`HBaseAdmin`、`HTable`、`Put`、`Get`、`Scan`等核心类。 1. **连接HBase**:在Java代码中,我们使用`HBaseConfiguration.create()`来创建一个配置...
5. **批量操作**:为了提高性能,`hbase-client.jar`支持批处理,允许一次性发送多条操作到服务器。 除了`hbase-client.jar`,可能还包含其他相关的JAR包,如`hbase-common.jar`,它包含了HBase的通用工具和模块,`...
### hbase+opentsdb+grafana视图展现 #### HBase 部署与配置 ...这一系列操作能够实现基于HBase存储的数据,通过OpenTSDB处理并由Grafana展示实时视图的功能,从而帮助用户更好地监控和分析大数据平台的性能。
在实际使用中,开发人员会通过HBase的API(如Admin API和Table API)来创建表、管理Region、读写数据等。例如,使用HBase的Put对象可以向表中插入一行数据,而Get对象则用于检索数据。Scan操作则允许按条件查询多行...
例如,使用HBaseAdmin创建表,使用Table对象进行增删改查操作。 4. **最小依赖jar包**:这个合集包含HBase客户端所需的最小集,主要包括HBase的client、protocol和common模块,可能还包含Zookeeper和Hadoop的相关库...
HBase提供了原生的Java Client/API,包括Get、Scan、Put、Delete等类,以及HTable类用于数据的读写操作,HBaseAdmin类则负责管理任务。此外,HBase还支持非Java客户端通过Thrift访问接口或REST-WebService接口进行...
例如,`HBaseAdmin`类提供了管理表的各种方法。 2. 数据存取:客户端通过`HTable`对象与特定表进行交互,执行put、get、delete和scan等操作。`Put`用于写入数据,`Get`用于读取数据,`Delete`用于删除数据,`Scan`...
例如,使用HBaseAdmin类的createTable方法可以创建表,并指定列族: ```java HBaseAdmin admin = new HBaseAdmin(conf); HTableDescriptor desc = new HTableDescriptor(TableName.valueOf("myTable")); desc....
创建表主要是通过`HBaseAdmin`对象来完成的,该对象提供了`createTable`方法用于创建表。 - `public void createTable(HTableDescriptor desc)`: 这个方法用于创建一个新的表,其中`HTableDescriptor`包含了表的元...
HBase的Replication功能允许在一个集群(称为来源集群)中的RegionServer将变更复制到另一个集群(称为目标集群)。这种复制是异步的,意味着更改在源集群中提交后才会被复制。每个集群都有一个“replication peer...
### Java大数据作业_3HBase知识点解析 #### 1. 使用Java集合的代码描述HBase的表结构 在HBase中,表结构由一系列的行组成,每行都有唯一的row key,并且每个单元格都存储在列族下。为了描述这样一个表结构,我们...
- **功能**: 显示HBase集群的状态信息,包括活动Master节点以及RegionServer的状态。 - **示例**: ```shell hbase(main):002:0> status { "cluster" : "test-cluster", "timestamp" : 1649309921757, "master" ...
《Learning HBase(中文版)》是一本专为学习HBase设计的中文教材,适合对大数据处理和分布式数据库感兴趣的读者。HBase,全称为Apache HBase,是建立在Hadoop文件系统之上的分布式、版本化、列式存储的NoSQL数据库...
HBaseAdmin admin = new HBaseAdmin(config); admin.createTable(new HTableDescriptor(TableName.valueOf("myTable"))); ``` 而在`HbaseSelecter.java`中,可能有如下代码用于查询数据: ```java Configuration ...
1. HBase客户端:包含用于与HBase交互的API,如HTable和HBaseAdmin。 2. HBase服务器端:包括RegionServer和Master,它们负责处理客户端请求和集群管理。 3. Region分裂:当Region变得过大时,HBase会自动将其分裂...
第二步,结合索引定义和 DataTable Region 的 StartKey 信息,调用 HBaseAdmin 的 createTable(final HTableDescriptor desc, byte[][] splitKeys) 方法创建索引表。 知识点三:IndexTable RowKey 的设计 Index...