如何解决java接口访问ZooKeeper时的connectionloss错误
常见错误日志如下:
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss
1. 原因:
是因为ZooKeeper建立连接时采用异步操作,连接操作后并不能保证ZK连接已成功。如果在ZK连接成功前的这个小时间窗口去访问ZK,就会碰到如上错误。
2. 解决思路
我们在新建ZK连接后要等一段时间,保证连接成功后再访问ZK。
3. 网上比较赞同的解决方案:
主要利用两个Java类:
(1)java.util.concurrent.CountDownLatch:
一个同步辅助类,类似倒数计数,直到计数器为0时才能对资源“解锁”。未解锁前等待该资源的进程只能被阻塞。
主要方法:
public CountDownLatch(int count); /* 构造函数,参数指定计数次数 */
public void countDown(); /* 当前线程调用此函数,则计数减一 */
public void await() throws InterruptedException; /* 此函数会一直阻塞当前线程,直到计时器的值为0为止 */
(2)org.apache.zookeeper.Watcher
ZooKeeper有一个很有用的功能,就是集群上每一个变化都可以通知到自定义的Watchcer。
第一种情况:
1.测试hbase:
a) cd hbase-0.90.4
b) bin/start-hbase.sh
c) bin/hbase shell
d) create ‘database’,’cf’
e) list
f) 如果成功则可以看到有下面的结果:
hbase(main):001:0>list TABLE database 1 row(s)in 0.5910 seconds
2. 创建Java project, 将hbase-0.90.4下面的lib目录拷贝到工程,将其中的jar包加入classpath, 还有hbase-0.90.5.jar 和 test.jar
3. 创建类
public class HelloHBase {
public static void main(String[] args) throws IOException {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "192.168.128.128");
HBaseAdmin admin = new HBaseAdmin(conf);
HTableDescriptor tableDescriptor = admin.getTableDescriptor(Bytes.toBytes("database"));
byte[] name = tableDescriptor.getName();
System.out.println(new String(name));
HColumnDescriptor[] columnFamilies = tableDescriptor.getColumnFamilies();
for (HColumnDescriptor d : columnFamilies) {
System.out.println(d.getNameAsString());
}
}
运行,此时应该打印出下面两行:
database cf
若没有,说明配置失败,请检查其他设置。
==============================================
问题1:
java.net.ConnectException: Connection refused: no further information
a. zookeeper.ClientCnxn: Session 0x0 for server null,
解决: zppkeeper未启动,或无法连接,从查看各节点zookeeper启动状态、端口占用、防火墙等方面查看原因
b. getMaster attempt 4 of 10 failed; retrying after sleep of 2000
解决:查看 master log , 如果有信息org.apache.hadoop.hbase.regionserver.HRegionServer: Serving as BRDVM0240,43992,1373943529301, RPC listening on /127.0.0.1:43992, sessionid=0x13fe56a7d4b0001
则说明, HRegionServer
监听的端口是localhost 127.0.0.1, 需要修改 server端 /etc/hosts 文件, 127.0.0.1
servername localhost.localdomain localhost
去掉 servername, 然后重启hbase
第二种情况:
java.net.ConnectException: Connection refused: no further information
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1119)
12/09/03 15:37:15 INFO zookeeper.ClientCnxn: Opening socket connection to server /192.168.0.118:2181
12/09/03 15:37:16 INFO zookeeper.ClientCnxn: EventThread shut down
12/09/03 15:37:16 INFO zookeeper.ZooKeeper: Session: 0x0 closed
Exception in thread "main" org.apache.hadoop.hbase.ZooKeeperConnectionException: HBase is able to connect to ZooKeeper but the connection closes immediately. This could be a sign that the server has too many connections (30 is the default). Consider inspecting your ZK server logs for that error and then make sure you are reusing HBaseConfiguration as often as you can. See HTable's javadoc for more information.
at org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher.(ZooKeeperWatcher.java:156)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getZooKeeperWatcher(HConnectionManager.java:1209)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.setupZookeeperTrackers(HConnectionManager.java:511)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.(HConnectionManager.java:502)
at org.apache.hadoop.hbase.client.HConnectionManager.getConnection(HConnectionManager.java:172)
at org.apache.hadoop.hbase.client.HBaseAdmin.(HBaseAdmin.java:92)
at com.biencloud.test.first_hbase.main(first_hbase.java:22)
Caused by: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase
at org.apache.zookeeper.KeeperException.create(KeeperException.java:90)
at org.apache.zookeeper.KeeperException.create(KeeperException.java:42)
at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:809)
at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:837)
at org.apache.hadoop.hbase.zookeeper.ZKUtil.createAndFailSilent(ZKUtil.java:931)
at org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher.(ZooKeeperWatcher.java:134)
... 6 more
这个错误说明eclipse没有连接到zookeeper,在程序中添加zookeeper配置信息即可,具体如下:
Configuration conf=HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum","192.168.0.118, 192.168.0.186, 192.168.0.182");
conf.set("hbase.zookeeper.property.clientPort","2222");
附上出处链接:http://www.aboutyun.com/thread-5866-1-1.html
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss
1. 原因:
是因为ZooKeeper建立连接时采用异步操作,连接操作后并不能保证ZK连接已成功。如果在ZK连接成功前的这个小时间窗口去访问ZK,就会碰到如上错误。
2. 解决思路
我们在新建ZK连接后要等一段时间,保证连接成功后再访问ZK。
3. 网上比较赞同的解决方案:
主要利用两个Java类:
(1)java.util.concurrent.CountDownLatch:
一个同步辅助类,类似倒数计数,直到计数器为0时才能对资源“解锁”。未解锁前等待该资源的进程只能被阻塞。
主要方法:
public CountDownLatch(int count); /* 构造函数,参数指定计数次数 */
public void countDown(); /* 当前线程调用此函数,则计数减一 */
public void await() throws InterruptedException; /* 此函数会一直阻塞当前线程,直到计时器的值为0为止 */
(2)org.apache.zookeeper.Watcher
ZooKeeper有一个很有用的功能,就是集群上每一个变化都可以通知到自定义的Watchcer。
nginx部署java项目?
如何在开发时部署和运行前后端分离的JavaWe在开发中大型的JavaEE项目时,前后端分离的框架逐渐成为业界的主流,传统的单机部署前后端在同一个项目中的工程项目越来越少。这类JavaWeb项目的后端通常都采用微服务的架构,后端会被分解为诸多个小项目,然后使用dubbo+zookeeper或者springCloud来构建微服务,前端则...
HBase访问接口
HBase提供了多种访问接口,以满足不同场景的需求:Native Java API:这是最常见的高效方式,适用于与Hadoop MapReduce Job并行处理大批量HBase数据。 HBase Shell:作为命令行工具,适合于HBase的日常管理和操作。 Thrift Gateway:利用Thrift技术,支持C++、PHP、Python等多种语言,适合异构系统在线...
zookeeper集群为什么是3个以上节点?
它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper包含一个简单的原语集,提供Java和C的接口。ZooKeeper代码版本中,提供了分布式独享锁、选举、...
dubbo和eureka的区别
3. 调用方式不同:Spring Cloud 使用 HTTP 协议进行远程调用,采用 REST 风格的接口,灵活性高;Dubbo 使用 Dubbo 协议,接口通常是 Java 的服务接口,格式固定,但采用 Netty 的 NIO 传输,性能较好。4. 组件差异:例如,Spring Cloud 常用 Eureka 作为注册中心,而 Dubbo 使用 ZooKeeper;Spring Cloud...
java中怎么实现负载均衡算法?
以下是一个使用Dubbo实现轮询负载均衡算法的示例代码片段。在这个例子中,我们通过配置文件指定使用RoundRobinLoadBalance作为负载均衡策略:java \/\/ 配置文件中指定负载均衡策略 dubbo.application.name=service-provider dubbo.protocol.name=dubbo dubbo.registry.address=zookeeper:\/\/localhost:2181 dubbo.consumer...
如何使用JMeter测试Dubbo接口
步骤包括调用Dubbo服务,填写Dubbo Sample请求内容并点击Get Provider List按钮获取提供者列表,查看日志以确认获取成功。若列表获取失败,需检查zookeeper地址或服务状态。获取到提供者列表后,选择需要调用的接口和方法。运行脚本后,检查结果以确认成功请求Dubbo接口并接收返回数据。另外,直连方式请求Dubbo接口也...
基于JSch 实现服务的自定义监控解决方案
JSch 是一个纯 Java 实现的 SSH2 库,用于连接服务器、执行命令、端口转发等操作,可集成至自定义程序。借助 JSch,监控服务能够远程查看、监控特定服务,如监控进程运行状态或服务接口响应。面对非容器化部署的老项目或特定环境,自定义监控尤为关键。实现方案分为两步:一是通过定时任务检查服务进程,...
zookeeper介绍及安装
安装流程 访问Zookeeper的官方地址,选择下载二进制发行包(apache-zookeeper-3.8.0-bin.tar.gz)并解压至指定目录(例如 \/data\/zk\/)。解压后目录包含bin、conf、docs、lib四个子目录。bin目录用于运行脚本,conf目录存放配置文件,docs是一份文档,lib目录包含Zookeeper运行所需的jar包。安装前确保目标...
如何使用Java API操作Hbase
import org.apache.hadoop.hbase.ZooKeeperConnectionException;import org.apache.hadoop.hbase.client.Connection;import org.apache.hadoop.hbase.client.ConnectionFactory;import org.apache.hadoop.hbase.client.Delete;import org.apache.hadoop.hbase.client.Get;import org.apache.hadoop.hbase.client.H...
新版的Kafka抛弃ZooKeeper 后如何启动。
新版Kafka抛弃了ZooKeeper,启动方式变得更为简便。首先,访问官网下载最新的Kafka版本,即3.7.1。确保服务器已安装Java环境。接着,通过下载链接获取Kafka,使用-o参数指定存放路径并解压。Kafka是一种高效分布式消息系统,能处理网站活动数据流。在早期版本中,启动Kafka需先启动ZooKeeper,步骤繁琐。自发布2...