7.Hadoop ZooKeeper服务

本文档详细介绍了ZooKeeper的安装步骤,包括在Linux环境下解压、配置、启动和测试。接着展示了如何通过命令行进行节点操作,如创建、删除、查看节点等。最后,讲解了在IDEA中使用Java代码操作ZooKeeper,包括创建连接、创建节点、读写数据以及删除节点等操作。

一.安装ZooKeeper

1./opt下新建zookeeper文件夹,将安装包上传到文件夹内

点击下载

在这里插入图片描述
2.解压
进入安装包目录

cd /opt/ZooKeeper

解压:

tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz

3.重命名为 zookeeper-3.5.7

mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7

4.创建日志文件和数据文件
在这里插入图片描述
5.进入conf,将zoo_sample.cfg改名为zoo.cfg
在这里插入图片描述
6.配置zoo.cfg
主要是 dataDir = 位置
在这里插入图片描述
7.启动测试
首先进入以下目录(即解压的zookeeper-3.5.7下的bin目录):
/opt/zookeeper/zookeeper-3.5.7/bin

Linux命令启动:

./zkServer.sh start

在这里插入图片描述
查看:

jps

二.进入 zookeeper 命令行操作

1.进入命令行(在/opt/zookeeper/zookeeper-3.5.7/bin目录下,不用退出。)

./zkCli.sh

运行完成,回车,即可输入命令
在这里插入图片描述
2.显示所有操作:

help

在这里插入图片描述
3.查看当前节点中包含的内容:

ls /

在这里插入图片描述
4.查看当前节点数据:

ls2 /

在这里插入图片描述
4.创建普通节点app1 数据值为 helloapp1:

create /app1 helloapp1

在这里插入图片描述
5.获取当前节点数据值:

get /app1

在这里插入图片描述
6.创建短暂节点app-emphemeral 数据值 8888:

create -e /app-emphemeral 8888

在这里插入图片描述
7.创建带序号节点:

create /app2 "app2"

在这里插入图片描述
8.修改节点数据值(将app1的数据值修改为999)

set /app1 999

在这里插入图片描述
9.监听节点:

get /app1 watch

在这里插入图片描述
10.删除节点:

delete /app1

在这里插入图片描述
11.查看节点状态:

stat /app2

在这里插入图片描述

三.连接IDEA 使用代码操作

安装Maven 看这里——>这里不在赘述

1.新建项目,配置Maven:
在这里插入图片描述
直接选择Maven---->next
在这里插入图片描述
配置本工程的Maven
在这里插入图片描述
在这里插入图片描述

2.导入依赖

<dependencies>
        
<!--        zookeeper-->
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.6</version>
    </dependency>
        
<!--        测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        
<!--        日志-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>
    </dependencies>

3.在项目的 src/main/resources 目录下,新建一个文件,命名为“log4j.properties”,在文件中填入以下代码。

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c]- %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log 

点击刷新一下依赖:
在这里插入图片描述
4.创建 包和java类
在这里插入图片描述
5.创建 创建zk连接

package com.gingtaishuji.zrt;

import org.apache.zookeeper.*;
import org.junit.Test;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;

public class FirstTest {

    @Test
    public void test() throws Exception {
        //1.创建zk连接,端口一般是2181,前面的ip是自己的,这里是主机名映射
        ZooKeeper zooKeeper = new ZooKeeper("hy:2181", 200000, new Watcher() {
            public void process(WatchedEvent watchedEvent) {
                System.out.println("收到监听:type:" + watchedEvent.getType() + ",路径:"
                        + watchedEvent.getPath() + ",状态:" + watchedEvent.getState());
            }
        });
        
    }
   }

6.创建 父节点
代码接上:

 //2.创建父节点 zrt
        zooKeeper.create("/yyy",
                "nodeValue".getBytes(),
                ZooDefs.Ids.READ_ACL_UNSAFE,
                CreateMode.PERSISTENT
        );

Linux查看:

ls /

7.创建 子节点(应该需要给节点设置权限,否则没权限操作)
代码接上:

  //3.创建子节点 zrt
        String sonPath = zooKeeper.create("/zrt/son",
                "sonNodeValue".getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE,
                CreateMode.PERSISTENT
        );

8.获取父节点中的值
代码接上:

   //4.获取节点中的值
        byte[] value = zooKeeper.getData("/zrt",false,null);
        //打印
        System.out.println("子节点:"+new String(value)
        );

在这里插入图片描述
9.获取子节点中的值

//5.获取子节点中的值
        List<String> children = zooKeeper.getChildren("/zrt",false);
        for (String child : children){
            System.out.println("子节点:"+child);
        }

10.判断节点是否存在

//6.判断节点是否存在
        Stat exists = zooKeeper.exists("/zrt/son",false);
        System.out.println(exists);

11.删除节点

 //7.删除节点
        zooKeeper.delete("/hhh",-1);
### 问题分析 `java.lang.IllegalStateException: Received event is not valid: Closed` 是 HBase 和 ZooKeeper 集成时常见的错误。此错误通常表明客户端与 ZooKeeper 服务器之间的连接被关闭,且事件处理逻辑未能正确处理这种状态变化。根据提供的引用内容[^1],可以确定该问题发生在 `ZooKeeperWatcher.connectionEvent` 方法中。 以下是可能的原因及解决方案: --- ### 可能原因 1. **ZooKeeper 连接断开** 如果 ZooKeeper 服务器不可用或网络连接中断,HBase 客户端会收到 `Closed` 状态的事件,从而导致 `IllegalStateException` 的抛出。 2. **ZooKeeper 版本不匹配** HBase 和 ZooKeeper 的版本不兼容可能导致连接异常。例如,HBase 1.2.0 默认使用 ZooKeeper 3.4.x,若使用其他版本可能会引发问题[^3]。 3. **依赖库冲突** HBase 的 lib 目录中可能存在多个版本的依赖库(如 Guava、Protobuf),这可能导致运行时异常。例如,`guava-12.0.1.jar` 和更高版本的 Guava 库共存可能会引发兼容性问题[^3]。 4. **Watch 事件未正确处理** 当 ZooKeeper 连接关闭时,`ZooKeeperWatcher.process` 方法未能正确处理 `Closed` 状态的事件,从而抛出异常。 --- ### 解决方案 #### 1. 检查 ZooKeeper 连接状态 确保 ZooKeeper 服务正常运行,并验证 HBase 配置文件中的 ZooKeeper 地址是否正确。可以通过以下命令检查 ZooKeeper 状态: ```bash echo stat | nc <zookeeper_host> <zookeeper_port> ``` 如果返回 ZooKeeper 的统计信息,则说明服务正常。 #### 2. 升级或降级 ZooKeeper 版本 根据 HBase 的版本选择合适的 ZooKeeper 版本。对于 HBase 1.2.0,推荐使用 ZooKeeper 3.4.x。如果当前版本不匹配,请重新安装或升级 ZooKeeper[^3]。 #### 3. 检查依赖库冲突 在 HBase 的 lib 目录中检查是否存在多个版本的依赖库。例如: ```bash ls /usr/local/hbase-1.2.0/lib/ | grep guava ls /usr/local/hbase-1.2.0/lib/ | grep protobuf ``` 如果有多个版本的 Guava 或 Protobuf,请移除旧版本以避免冲突。 #### 4. 修改 Watcher 处理逻辑 如果问题仍然存在,可以尝试修改 `ZooKeeperWatcher` 的源代码以增强对 `Closed` 状态的处理能力。例如,在 `connectionEvent` 方法中添加额外的日志记录或忽略无效事件[^1]。 #### 5. 增加重试机制 在 HBase 配置中启用 ZooKeeper 连接的自动重试功能。编辑 `hbase-site.xml` 文件,增加以下配置: ```xml <property> <name>zookeeper.session.timeout</name> <value>60000</value> </property> <property> <name>zookeeper.recovery.retry</name> <value>3</value> </property> ``` --- ### 示例代码 以下是一个简单的脚本,用于检查 ZooKeeper 服务状态并重启服务(如果需要): ```bash #!/bin/bash ZOOKEEPER_HOST="localhost" ZOOKEEPER_PORT="2181" # 检查 ZooKeeper 状态 STATUS=$(echo stat | nc $ZOOKEEPER_HOST $ZOOKEEPER_PORT) if [[ -z "$STATUS" ]]; then echo "ZooKeeper is down. Attempting to restart..." # 重启 ZooKeeper 服务 sudo service zookeeper-server restart else echo "ZooKeeper is running." fi ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_胡杨_

感谢打赏,会多多更新的。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值