Hadoop之Zookeeper的简介 / 安装(单节点/集群)/shell和java客户端的一些基本命令和相关操作
一 Zookeeper是什么 ?有什么作用 ?
zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
简单来说zookeeper=文件系统+监听通知机制。
二 Zookeeper软件的安装
1 在linux的/opt/apps 目录下上传zookeeper安装包 ,操作如下 : (apps是自定义创建的一个专门存放安装软件的文件夹)
2 查看是否上传成功 ,如果成功上传 ,开始解压安装包 ,操作如下 :
tar -zxvf zookeeper-3.4.6.tar.gz
3 解压完成后 ,开始修改配置信息 ,首先进入zookeeper软件包 ,查看软件包文件目录,进入到 conf文件夹中 ,修改配置信息:
4 将zoo_sample.cfg 文件的名字修改成 zoo.cfg ,命令如下 :
mv zoo_sample.cfg zoo.cfg
5 回到上一级目录 ,即 zookeeper 软件包目录下 ,创建一个 zkData 文件夹 ,并且在文件夹里面创建一个名字为 myid 的文件,将数字1 编辑进去,如下操作 :
6 回到 软件包的 conf / 目录下 ,对 zoo.cfg 文件里面的配置信息进行修改 ,如下:
7 修改信息如下 :
8 回到 apps / 目录下 , 将修改好配置信息的 zookeeper软件包分发给其他两台虚拟机 ,操作命令如下 :
scp -r zookeeper-3.4.6 linuxXX:$PWD
linuxXX :将要接收软件包的虚拟机域名
$PWD : 发送至与当前目录路径相同的路径下
9 启动集群 ,需要手动在每一台机器上一个一个的启动 ,每台机器都执行如下命令 :
bin/zkServer.sh start zk服务启动
bin/zkServer.sh status zk 查看服务状态
bin/zkServer.sh stop zk停止服务
10 客户端连接, 每台虚拟机的 zookeeper需要单独的手动连接, 连接客户端操作如下 :
bin/zkCli.sh 本地连接
bin/zkCli.sh -server doit02:2181 连接到指定的服务节点
三 shell客户端的一些基本命令
1 连接上客户端之后 ,可以对zookeeper 进行创建/ 删除 /获取 /添加等操作 :
ls / 查看某个路径下的key (查询信息简略版)
ls / 查看某个路径下的key(查询信息详细版)
create ( (-s)/-e (-s)) /aaa ddd 在跟目录下创建一个znode节点并添加内容
参数(-p) 表示创建的节点是永久的--> -p 不需要写出来 ,默认是永久的
参数 (-p) -s 表示创建的节点是永久的,有序的
参数-e 表示创建的节点是临时的,客户端断开后,这个节点会被删除
参数 -e -s 表示创建的节点是临时的 ,有序的 (namenode节点都是创建的临时的)
create /zoo/hadoop xx 创建一个多级节点并添加内容
get /zoo/hadoop 查看子节点的内容 ,即查看一个key的value
set /zoo/hadoop 修改/更新/覆盖子节点的内容
rmr /zoo/hadoop 删除一个znode节点
2 事件监听 ,zookeeper中对znode节点的变化描述有3中事件类型 :
1) 节点value变化事件
2) 节点的子节点变化事件(个数变化等)
3) 节点的被创建 /被删除事件
3 对应的, 客户端向 zk 注册监听的命令为 :
get /zoo watch 监控节点数据的变化
ls /zoo watch 监控节点个数发生变化
ls2 /zoo watch 监控节点个数变化的详细信息
stat /zoo watch
四 java客户端的操作
1 创建一个节点
public class CreateZKNode {
public static void main(String[] args) {
ZooKeeper zk = null;
try {
//创建一个 zookeeper 对象 ,有四个参数
//参数一 "connectString": 连接 zookeeper 的机器 ,可以只写一台机器域名,当时可能遇到连接不上的情况,
// 为了保证能及时连接成功,写三台,当一台连接不上的时候就可以换另一台机器连接
//参数二 "sessionTimeout": 会话/会晤超时,指zookeeper连接机器时间超过设置的时间 ,就不连接了 ,会重新换一台机器连接
//参数三 "watcher" : 监控/监听连接状态
zk = new ZooKeeper("doit03:2181,doit04:2181,doit05:2181", 2000, null);
//参数一 创建zookeeper节点的路径
//参数二 数据值
//参数三 节点的权限
//参数四 节点的类型 -p永久 -p-s永久有序 -e临时 -e-s临时有序
zk.create("/hdfs","zoo".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
Thread.sleep(Integer.MAX_VALUE);
zk.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2 监听节点数据/内容变化情况
public class NodeDatachangedWatcher {
static ZooKeeper zk =null;
//zookeeper对象只需要创建一次 ,所以放在静态代码块中 ,但是 zk 对象后续还需要使用,所以需要提出去
static {
try {
zk = new ZooKeeper("doit03:2181,doit04:2181,,doit05:2181,", 2000, null);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
/**
* 获取节点的数据
* 参数一 节点名
* 参数二 在当前节点绑定一个监听 当这个节点的数据发生变化的时候触发时间 执行process
* 参数三 节点的状态
*/
byte[] old = zk.getData("/cch", new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
try {
System.out.println("/cch节点的数据发生变化了");
System.out.println(watchedEvent.getPath()+"----"+watchedEvent.getState()+"--"+watchedEvent.getType());
byte[] data = zk.getData("/cch", this, null);
System.out.println("变化后的数据是 :"+new String(data));
} catch (Exception e) {
e.printStackTrace();
}
}
}, null);
System.out.println(new String(old));
//如果监听的是临时的节点 ,就需要让当前线程在这里睡一觉 ,
//不然程序运行到这来后会被直接close,也就监听不到临时节点数据变化情况了
Thread.sleep(Integer.MAX_VALUE);
zk.close();
}
}
3 在java客户端编辑 监听节点数据/内容变化情况 代码并且运行时,需要连接上Zookeeper ,也需要在当前操作的项目(project)里面的 pom.xml 文件中导入Zookeeper jar包(maven repository官网中也可以找到对应版本的jar包) ,代码如下 :
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
因为如果不导这个jar包的话 ,创建的zookeeper对象系统会直接导入 hadoop jar包依赖下的zookeeper jar包 ,那在程序运行时就会出现"ZookConnectionLoss KeeperErrorCode = ConnectionLoss for"异常 !!!
4