解决ZooKeeper实验进程协作中的一些问题
一、前言
这个实验我在9月30号的时候就已经做过了,本次博客主要来解决其中的一些问题,因为刚好今天我们的大数据编程期中考试就是做这个实验。
二、出现的问题
这是在之前实验中遇见的问题,能正常抛出数据但同时也会抛出异常,当时并不知道是什么原因,今天经过了一次讨论解决掉了。
三、解决问题
我们大数据编程基础老师说,这是因为实验中给出的java程序头文件缺失,我们需要在两个java文件开始添加一些头文件,具体如下:
WriteMsg.java
/*import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;*/
import java.util.Date;
import org.apache.zookeeper.ZooKeeper;
public class WriteMsg extends Thread {
@Override
public void run() {
try {
ZooKeeper zk = new ZooKeeper("10.30.108.18: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();
}
}
}
ReadMsg.java
/*import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.zookeeper.KeeperException;*/
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooKeeper;
public class ReadMsg {
public static void main(String[] args) throws Exception {
final ZooKeeper zk = new ZooKeeper("10.30.108.18: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目录信息,触发watch
while(true)
{
Thread.sleep(2000);
new WriteMsg().start();
//watch一次生效就会删除需重新设置
zk.exists("/testZk", wacher);
}
}
}
其中我们需要主要的是两个java程序中的这两个地方:
前面是节点状态为leader的主机号,这里划重点!一定要是节点状态为leader,我们有三台虚拟机,两个节点是follower状态,一个是leader状态,这个在前面的zookeeper部署中有提到,后面我们打包上传到虚拟机也要上传到节点状态为leader的虚拟机中编译运行。
可以通过如下命令去看看自己三台虚拟机哪一台的状态是leader。
cd /usr/cstor/zookeeper/bin
./zkServer.sh status
可以看出我的slave1虚拟机的节点状态是leader,所以我们就要在salve1上进行编译运行jar包。
和之前一样修改好java程序之后我们上传到slave1虚拟机上,然后输入如下命令运行:
java -jar /root/ZooKeeperTest.jar
可以看到我们成功运行了,问题解决!
四、补充一点
这个是主要问题,还有一些其他的问题比较好解决,我在这里就直接说一下。
例如,在进行编译运行之前,我们也需要在节点状态为leader的虚拟机上进入客户端创建/testZk文件夹,这个不能忘记,不然会后面会出现报错或者找不到文件路径。
还有一些小问题那就是,注意单词拼写是否正确,以及单词大小写是否正常,我上午就在一个单词大小写上面出错了,找了一会才找到,所以需要格外的注意。
还有什么找不到主类什么的记得先在本地指定主类等等,如果还有什么问题欢迎前来评论。
五、最后我想说
大概想说的内容就这些了,弄大数据方面的总会出现各种小问题,我们需要学会去解决这些问题就能从中学到很多知识,最后如果还有什么问题欢迎前来评论或者私信我,我尽全力帮你们解决。
如果我的博客帮你解决了问题,还请大家送我点赞收藏转发三连,谢谢支持!