ZooKeeper概述
1. 是一个为用户的分布式应用程序提供协调的服务,是为别的分布式程序服务的.
集群管理:
- 在分布式集群中,各个节点的实时状态统计
将节点信息写入到ZooKeeper的一个znode上,监听这个znode可以获取它的实时状态变化
Hbase中Master状态监控和选举
Hadoop中使用到了ZooKeeper的框架大概有:
1. HBase
2. Spark
3. HDFS HA
4. 还有很多。。。
znode有两种类型:
- 短暂的:ephemeral
- 持久的:persistent
- **znode的类型在创建时确定后就不能修改**
ZooKeeper架构
Zookeeper核心
1. 仲裁机制
2. 目录式数据结构
下载安装包: http://archive.cloudera.com/cdh5/cdh/5/
zoo.cfg配置:
- dataDir
启停ZK Server:
- zkServer.sh start
- zkServer.sh stop
启动客户端:
- zkCli.sh
常用命令:
- ls
- create
- get
set
delete
quit
……
实现服务器与客户端互联:
public class TestZK2 {
private ZooKeeper zooKeeper;
private String path="/dui";
private Watcher watcher=new Watcher() {
@Override
public void process(WatchedEvent watcherEvent) {
if(watcherEvent.getType()==Event.EventType.NodeDeleted){
System.out.println("节点被删除了");
try {
createNode();
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
private void createNode() throws KeeperException, InterruptedException {
org.apache.zookeeper.data.Stat stat=zooKeeper.exists(path,true);
if(stat == null){
System.out.println("创建节点");
zooKeeper.create(path,"test".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
System.out.println("节点创建成功");
zooKeeper.exists(path,true);
Thread.sleep(1000);
}else{
System.out.println("节点存在");
}
}
@Before
public void kaishi() throws IOException {
zooKeeper = new ZooKeeper("hadoop-node4", 30000, watcher);
}
@After
public void guanbi() throws InterruptedException {
zooKeeper.close();
}
@Test
public void run() throws IOException, KeeperException, InterruptedException {
createNode();
System.in.read();
}
}
public class TestZK3 {
private ZooKeeper zooKeeper;
private String path="/info-node";
@Before
public void kaishi() throws IOException {
zooKeeper=new ZooKeeper("hadoop-node3", 30000, new Watcher() {
@Override
public void process(WatchedEvent watcherEvent) {
if(watcherEvent.getType()==Event.EventType.NodeCreated){
System.out.println("节点存在开始删除");
try {
deleteNode();
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
private void deleteNode() throws KeeperException, InterruptedException {
Stat stat=zooKeeper.exists(path,true);
if(stat!=null){
System.out.println("节点存在");
zooKeeper.delete(path,-1);
System.out.println("创建的节点被删除了");
zooKeeper.exists(path,true);
}else{
System.out.println("节点不存在");
}
}
@After
public void close() throws InterruptedException {
zooKeeper.close();
}
@Test
public void run() throws IOException, KeeperException, InterruptedException {
deleteNode();
System.in.read();
}
}