实验指导:
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