Zookeeper 是hadoop的分布式协调服务。本文为单机测试版本,旨在熟悉API。
说在前面
- 工作环境:VMware® Workstation 12 Pro 12.5.6 build-5528349
- linux版本:CentOS-7-x86_64-Minimal-1611.iso
- JDK版本:jdk-8u65-linux-x64.tar.gz
- Hadoop版本:hadoop-2.7.6.tar.gz
- Zookeeper版本:zookeeper-3.4.12.tar.gz
Zookeeper的特点
-
Zookeeper的核心是精简的文件系统,它提供了一些简单的操作和一些额外的抽象操作,例如:排序和通知。
-
Zookeeper的基本操作是一组丰富的构建,可用于实现多种协调数据结构和协议。例如:分布式对列,分布式锁和一组节点中的"领导者选举"(leader election)。
-
Zookeeper具有高可用性,Zookeeper可以帮助系统避免单点故障,可以用于构建一个可靠的应用程序。
-
Zookeeper采用松耦合交互方式,在Zookeeper支持的交互过程中,参与者不需要彼此了解。
-
Zookeeper是一个资源库,Zookeeper提供了一个通用协调模式实现方法的开源共享库,是程序员免于写这类通用的协议。
Zookeeper的安装
- 下载 zookeeper-3.4.12.tar.gz,解压于 /soft 目录下,并为其创建符号链接 zk
//解压
$> tar -xzvf /mnt/hgfs/bigdata/soft/zookeeper-3.4.12.tar.gz -C /soft
//创建符号链接
$> ln -s zookeeper-3.4.12 zk
- 配置zk的环境变量,source profile :立即生效
$> sudo nano /etc/profile
//导入环境变量
export ZK_HOME=/soft/zk
export PATH=$PATH:$ZK_HOME/bin
- 进入 /soft/zk/conf 目录下,配置zk
$> cp /soft/zk/conf/zoo.cfg.sample zoo.cfg .
$> nano /soft/zk/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/centosmin0/zookeeper //配置临时文件路径
clientPort=2181
- 启动zk服务器
//进入bin目录下启动
$> cd /soft/zk/bin
$> zkServer.sh start
//验证是否启动
$>netstat -anop | grep 2181
- 启动客户端链接到zk服务器(s201:192.168.32.201)
$>zkCli.sh -server s201:2181 //进入zk命令行
$zk]help //查看帮助
$zk]quit //退出
$zk]create /a tom //
$zk]get /a //查看数据
$zk]ls / //列出节点
$zk]set /a tom //设置数据
$zk]delete /a //删除一个节点
$zk]rmr /a //递归删除所有节点。
使用JavaAPI访问zk服务器
- 导入依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.12</version>
</dependency>
- 访问zk服务器
/**
* 列出指定路径下的目录
*/
@Test
public void ls() throws Exception {
ZooKeeper zk = new ZooKeeper("s201:2181", 5000, null);
List<String> list = zk.getChildren("/a", null);
for (String s : list) {
System.out.println(s);
}
}
/**
* 设置数据
*/
@Test
public void setData() throws Exception {
ZooKeeper zk = new ZooKeeper("s201:2181", 5000, null);
zk.setData("/a", "scaca".getBytes(), 0);
}
/**
* 创建临时节点
*/
@Test
public void createEmph() throws Exception {
ZooKeeper zk = new ZooKeeper("s201:2181", 5000, null);
zk.create("/c/c1", "toms".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("hello");
}
/**
* 测试观察者模式
*/
@Test
public void testWatch() throws Exception {
final ZooKeeper zk = new ZooKeeper("s201:2181", 5000, null);
//设置状态
Stat st = new Stat();
Watcher w = null;
w = new Watcher() {
//回调函数
public void process(WatchedEvent event) {
try {
System.out.println("数据被修改了!");
zk.getData("/a", this, null);
} catch (Exception e) {
e.printStackTrace();
}
}
};
//得到数据时加注册,注册的同时给Client一个观测器Watcher
byte[] data = zk.getData("/a", w, st);
System.out.println(new String(data));
while (true) {
Thread.sleep(1000);
}
}