实验二十一 ZooKeeper进程协作

26 篇文章 10 订阅
2 篇文章 0 订阅

实验指导:

21.1 实验目的

掌握Java代码如何连接ZooKeeper集群及通过代码读写ZooKeeper集群的目录下的数据,掌握ZooKeeper如何实现多个线程间的协作。

21.2 实验要求

用Java代码实现两个线程,一个向ZooKeeper中某一目录中写入数据,另一线程监听此目录,若目录下数据有更新则将目录中数据读取并显示出来。

21.3 实验原理

通过ZooKeeper实现不同物理机器上的进程间通信。

场景使用:客户端A需要向客户端B发送一条消息msg1。

实现方法:客户端A把msg1发送给ZooKeeper集群,然后由客户端B自行去ZooKeeper集群读取msg1。

21.4 实验步骤

本实验主要完成多线程通过ZooKeeper完成彼此间的协作问题,实验过程包含启动集群、编写代码、客户端提交代码三个步骤。

21.4.1 启动ZooKeeper集群

启动ZooKeeper集群。具体步骤可以参考实验20。

21.4.2 导入jar包

其次,从ZooKeeper安装包的lib目录下,将如下jar包导入到开发工具:

jline-0.9.94.jar

log4j-1.2.16.jar

netty-3.7.0.Final.jar

slf4j-api-1.6.1.jar

slf4j-log4j12-1.6.1.jar

zookeeper-3.4.6.jar

21.4.3 编写java代码

在开发工具编写Java代码,完成实验要求的功能,代码如下:

向/testZk目录写数据线程代码实现:

public class WriteMsg extends Thread {
@Override
public void run() {
     try {
         ZooKeeper zk = new ZooKeeper("slave1:2181", 500000, null);
         String content = Long.toString(new Date().getTime());
         // 修改节点/testZk下的数据,第三个参数为版本,如果是-1,那会无视被
           修改的数据版本,直接改掉
         zk.setData("/testZk", content.getBytes(), -1);
         // 关闭session
         zk.close();
      } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

监听/testZk目录若数据改变则读取数据并显示线程代码实现:

public class ReadMsg {
   public static void main(String[] args) throws Exception {
   final ZooKeeper zk = new ZooKeeper("slave1:2181", 500000, null);
   //定义watch 
   Watcher wacher = new Watcher() {
      public void process(WatchedEvent event) {
      //监听到数据变化取出数据
      if(EventType.NodeDataChanged == event.getType()){
         byte[] bb;
         try {
            bb = zk.getData("/testZk", null, null);
            System.out.println("/testZk的数据: "+new String(bb));
         } catch (Exception e) {
         e.printStackTrace();
         }
       }
     }
   };
   //设置watch 
   zk.exists("/testZk", wacher);
   //更新/testZk目录信息,触发wacth
   while(true)
   {
      Thread.sleep(2000);
      new WriteMsg().start();
      //watch一次生效就会删除需重新设置 
      zk.exists("/testZk", wacher);
   }
  }
}

21.4.4 做成jar包

将上述代码打成jar包,用工具上传到客户端节点,并执行代码:

java -jar ZooKeeperTest.jar

21.5 实验结果

在客户端提交jar包后运行Java代码,打印日志信息为ZooKeeper接收线程监控到/testZk目录信息有变化时,读取该目录的内容,结果如图21-1所示。

图21-1 Java代码运行结果图

实验操作:

步骤1:搭建Hadoop集群

首先修改/etc/hosts文件,配置网络映射:

vi /etc/hosts

配置slave1,slave2,slave3之间的免密

ssh-keygen
ssh-copy-id X (X是包括master在内的所有机器)

步骤2:修改zookeeper配置

修改zoo_sample.cfg文件

新建两个目录。

mkdir /usr/cstor/zookeeper/data
mkdir /usr/cstor/zookeeper/log

将/usr/cstor/zookeeper目录传到另外两台机器上。

scp -r /usr/cstor/zookeeper root@slave2:/usr/cstor
scp -r /usr/cstor/zookeeper root@slave3:/usr/cstor

分别在三个节点上的/usr/local/zookeeper/data目录下创建一个文件:myid。

vi /usr/cstor/zookeeper/data/myid

分别在myid上按照配置文件的server.中id的数值,在不同机器上的该文 件中填写相应过的值,如下:

slave1 的myid内容为1

slave2 的myid内容为2

slave3 的myid内容为3

步骤3:启动zookeeper

启动ZooKeeper集群,进入客户端验证部署完成。

分别在三个节点进入bin目录,启动ZooKeeper服务进程:

cd /usr/cstor/zookeeper/bin
./zkServer.sh start

在各机器上依次执行脚本,查看ZooKeeper状态信息,两个节点是follower状态,一个节点是leader状态:

./zkServer.sh status

步骤4:编写zookeeper读写程序

 

步骤5:打包程序

步骤6:运行程序

在其中一台机器上执行客户端脚本:

./zkCli.sh -server slave1:2181,slave2:2181,slave3:2181

在客户端shell下执行创建目录命令:

create /testZk ""

之后quit退出shell,运行程序:

java -jar /root/ZooKeeperTest.jar

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值