如下图所示,Zookeeper常用的四字命令见下图所示

屏幕会输出可用的Zookeeper命令,Zookeeper常用的四字命令见下图所示,但是为了方面学建议在伪分布式模式的Zookeeper学习Zookeeper的shell命令,屏幕会输出可用的Zookeeper命令,Zookeeper常用的四字命令见下图所示,屏幕会输出可用的Zookeeper命令,Zookeeper常用的四字命令见下图所示,配置服务、名字服务、分布式同步、组服务等,Zookeeper的原语操作是很丰富的

图片 7

3.3 列出组成员

 

今后,我们供给一段程序来查看组成员,参见代码如下:

 

代码 用于列出组成员的先后

package org.zk;

import java.io.IOException;
import java.util.List;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;

public class ListGroup extends ConnectionWatcher {
    public void list(String groupNmae) throws KeeperException, InterruptedException{
        String path ="/"+groupNmae;
        try {
            List<String> children = zk.getChildren(path, false);
            if(children.isEmpty()){
                System.out.printf("No memebers in group %s\n",groupNmae);
                System.exit(1);
            }
            for(String child:children){
                System.out.println(child);
            }
        } catch (KeeperException.NoNodeException e) {
            System.out.printf("Group %s does not exist \n", groupNmae);
            System.exit(1);
        } 
    }
    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        ListGroup listGroup = new ListGroup();
        listGroup.connect(args[0]);
        listGroup.list(args[1]);
        listGroup.close();
    }
}

 

在list()方法中,大家调用了getChildren()方法来索求并打字与印刷输出多个znode的子节点列表,调用参数为:该znode的渠道和
设为false的体察标识。若是在一znode上安装了观测标记,那么只要该znode的境况改换,关联的洞察(Watcher)会被触发。即便在此处大家能够不采纳阅览,但在查阅三个znode的子节点时,也能够安装阅览,让应用程序接收到组成员插手、退出和组被删除的关于布告。

 

在这段程序中,大家捕捉了KeeperException.NoNodeException至极,代表组的znode不真实时,那么些特别就能够被抛
出。上面看一下ListGroup程序的干活进度:纵然搭建了遍及式的ZooKeeper,但布满式ZooKeeper运行运营比较耗费时间,笔者在那采纳前面提到的复制方式下的ZooKeeper来拓展测验。

 

首先大家得运维ZooKeeper,运转之后将方面包车型大巴源程序放到Linux目录中并开始展览编写翻译,笔者将其置于了”/usr/code”目录下,并在该目录下创设一个classes文件夹,用于寄存生成字节码文件:

[[email protected] ~]# cd /usr/code
[[email protected] code]# ls
ConnectionWatcher.java  DeleteGroup.java  ListGroup.java
classes  CreateGroup.java  JoinGroup.java  PackageTest.java
[[email protected] code]# javac -d ./classes ConnectionWatcher.java
[[email protected] code]# javac -d ./classes *.java

 

由于方今大家还尚未在组中增添任何成员,因而zoo是空的:

 

[[email protected] code]# java org.zk.ListGroup  localhost zoo
2014-10-30 01:52:19,703 [myid:] - INFO  [main:[email protected]100] - Client environment:……
……
No memebers in group zoo

 

我们能够利用JoinGroup来向组中加多成员。在sleep语句的效应下,那个作为组成员的znode不会和谐终止,所以大家能够,未来台进程的措施来运维他们:

[[email protected] code]# java org.zk.JoinGroup localhost zoo duck &
2014-10-30 02:06:05,018 [myid:] - INFO  [main:[email protected]100] - Client environment:……
……
Created:/zoo/duck
[[email protected] code]# java org.zk.JoinGroup localhost zoo cow &
2014-10-30 02:06:05,018 [myid:] - INFO  [main:[email protected]100] - Client environment:……
……
Created:/zoo/cow
[[email protected] code]# java org.zk.JoinGroup localhost zoo goat &
2014-10-30 02:06:05,018 [myid:] - INFO  [main:[email protected]100] - Client environment:……
……
Created:/zoo/goat

 

末尾一行命令保存了将goat增加到组中的java进度的ID。大家必要保留这几个进度的ID,以便能够在查看组成员之后杀死进度。

[[email protected] code]#
2014-10-30 03:15:30,619 [myid:] - INFO  [main:[email protected]100] - Client environment:……
……
duck
cow
goat

 

为了从组中删除一个分子,大家杀死了goat所对应的历程:

[[email protected] code]# kill $goat_pid
几秒钟之后,由于进程的ZooKeeper会话已经结束(超时为5秒),所以goat会从组成员列表消失,并且对应的短暂znode也已经被删除。
[[email protected] code]# java org.zk.ListGroup localhost zoo
2014-10-30 03:23:41,120 [myid:] - INFO  [main:[email protected]100] - Client environment:……
……
duck
cow

 

对此加入到叁个布满式系统中的节点,那样就有了三个创造节点列表的诀要。那个节点也许互相并不通晓。举例,一个想行使列表中节点来成功某个工作的客
户端,能够在那一个节点不知道客户端的景观下开掘它们。最终,注意,组成员关系管理并不可能一举成功与节点通讯进程中出现的互联网问题。即便一个节点是一个组中的成
员,在与其通讯的历程中依然会冒出故障,这种故障必须以一种适于的办法缓慢解决(重试、使用组中其余二个分子等)。☆☆☆

 

3.1.1 代码示例

让大家经过编写制定一段程序的方法来再一次详细介绍ZooKeeper的Java
API,这段示例程序用于为组名叫/zoo的组成立一个znode。代码参见代码3.1:

代码 3.1 该程序在ZooKeeper中新建表示组的Znode

package org.zk;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

public class CreateGroup implements Watcher{

    private static final int SESSION_TIMEOUT=5000;

    private ZooKeeper zk;
    private CountDownLatch connectedSignal=new CountDownLatch(1);
    @Override
    public void process(WatchedEvent event) {
        if(event.getState()==KeeperState.SyncConnected){
            connectedSignal.countDown();
        }
    }

    public static void main(String[] args) throws Exception {
        CreateGroup createGroup = new CreateGroup();
        createGroup.connect(args[0]);
        createGroup.create(args[1]);
        createGroup.close();
    }

    private void close() throws InterruptedException {
        zk.close();
    }

    private void create(String groupName) throws KeeperException, InterruptedException {
        String path="/"+groupName;
        if(zk.exists(path, false)== null){
            zk.create(path, null/*data*/, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        }
        System.out.println("Created:"+path);
    } 

    private void connect(String hosts) throws IOException, InterruptedException {
        zk = new ZooKeeper(hosts, SESSION_TIMEOUT, this);
        connectedSignal.await();
    }
}

运营该程序必要布署classpath境况变量恐怕在试行java命令时增加-classpath选项,具体运作形式参见:http://www.cnblogs.com/sunddenly/p/4050812.html

运作后的结果为:

[root@hadoop code]# ls
build  classes  CreateGroup.java  HelloWorld.java  jar.jar  PackageTest.java  zookeeper.out
[root@hadoop code]# javac -d ./classes CreateGroup.java
[root@hadoop code]# java org.zk.CreateGroup localhost:2181 zoo
2014-10-28 18:00:26,154 [myid:] - INFO  [main:Environment@100] 
- Client environment:zookeeper.version=3.4.5-1392090, built on 
2014-10-28 18:00:26,157 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=hadoop
2014-10-28 18:00:26,157 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.6.0_24
2014-10-28 18:00:26,157 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Sun Microsystems Inc.
2014-10-28 18:00:26,158 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/usr/local/jdk/jre
2014-10-28 18:00:26,158 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=……
……
Created:/zoo
2014-10-28 18:00:26,236 [myid:] - INFO  [main:ZooKeeper@684] - Session: 0x4956f7f1d70005 closed
2014-10-28 18:00:26,237 [myid:] - INFO  [main-EventThread:ClientCnxn$EventThread@509] - EventThread shut down
[root@hadoop code]#

2.2 Zookeeper的api的简练利用

3.1 创建组

10. 观望触发器

能够对客户端和服务器端之间的连日装置阅览触发器(后面称之为zookeeper的景况观看触发器),也足以对znode设置旁观触发器。

  • 气象观看器

zk的方方面素不相识命周期如下:

图片 1

可在开创zk对象时传出三个旁观器,在成功CONNECTING状态到CONNECTED状态时,观察器会触发叁个平地风波,该触发的事件类型为NONE,通过event.getState()方法获得事件意况为SyncConnected。有几许索要小心的就是,在zk调用close方法时不会触发任何事件,因为那类的显示调用是开采者主动施行的,属于可控的,不用选拔事件通报来报告程序。这一块在下篇博文还有可能会详细解释。

  • 安装znode的观望器

能够在读操作exists、getChildren和getData上安装观察,在推行写操作create、delete和setData将会触发观望事件,当然,在实行写的操作时,也足以选拔是不是触发znode上安装的观看器,具体可查阅相关的api。

当观看的znode被成立、删除或其数据被更新时,设置在exists上的观望将会被触发;

当观看的znode被删去或数量被更新时,设置在getData上的观看比赛将会被触发;

当观察的znode的子节点被创设、删除或znode本身被剔除时,设置在getChildren上的洞察将会被触发,可通过观望事件的等级次序来剖断被删去的是znode如故它的子节点。

图片 2

对此NodeCreated和NodeDeleted根据路线就会开掘是哪位znode被写;对于NodeChildrenChanged可依照getChildren来赢得新的子节点列表。

注意:在抽出收到触发事件到实践读操作之间,znode的情景恐怕会时有发滋事态,那一点需求牢记。

迄今结束,编写简单的zookeeper应该是足以的了,下篇博文大家来深切探究zookeeper的相关知识。

参照地址:

参照书籍:《Hadoop权威指南》

Hadoop权威指南(第3版) 修订版(带目录书签) 中文PDF高清晰 下载见

更加多详细情形见请继续读书下一页的特出内容:

  • 1
  • 2
  • 下一页

【内容导航】

第1页:第一篇:ZooKeeper快捷入门

第2页:第二篇:ZooKeeper深刻研讨

1. 概述
Zookeeper是Hadoop的三个子项目,它是布满式系统中的和谐系统,可提供的劳务着重有:配置服务、名字服务、布满式…

2.1  Zookeeper的shell操作

2.1 Zookeeper的shell操作

3.4 ZooKeeper命令行工具

 

ZooKeeper提供了二个命令行工具用于在其命名空间内进行相互。大家得以行使这几个命令工具列出/zoo节点之下的znode列表,如下所示

[root@hadoop code]# zkCli.sh -server localhost ls /zoo
Connecting to localhost
……
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[duck, cow]
[root@hadoop code]#

 

一、Zookeeper的四字命令

Zookeeper帮助有些特定的四字命令字母与其的相互。他们好些个是询问命令,用来获取Zookeeper服务的当前事态及连锁信息。用户在客户端能够经过telnet或nc向Zookeeper提交相应的一声令下。Zookeeper常用的四字命令见下图所示。

图片 3

上海教室,是Zookeeper四字命令的贰个归纳用例。

[root@hadoop ~]# echo ruok|nc localhost 2181
[root@hadoop ~]# zkServer.sh start zoo1.cfg
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo1.cfg
Starting zookeeper ... STARTED
[root@hadoop ~]#  zkServer.sh start zoo2.cfg
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo2.cfg
Starting zookeeper ... STARTED
[root@hadoop ~]#  zkServer.sh start zoo3.cfg
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo3.cfg
Starting zookeeper ... STARTED
[root@hadoop ~]# echo ruok|nc localhost 2181
imok[root@hadoop ~]# echo ruok|nc localhost 2182
imok[root@hadoop ~]# echo ruok|nc localhost 2183
imok[root@hadoop ~]# echo conf|nc localhost 2181
clientPort=2181
dataDir=/usr/local/zk/data_1/version-2
dataLogDir=/usr/local/zk/logs_1/version-2
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=0
initLimit=10
syncLimit=5
electionAlg=3
electionPort=3387
quorumPort=2287
peerType=0
[root@hadoop ~]#

1. 概述

Zookeeper是Hadoop的三个子项目,它是分布式系统中的和煦系统,可提供的劳动重要有:配置服务、名字服务、布满式同步、组服务等。

它有如下的一对风味:

  • 简单

Zookeeper的主导是四个简洁的文件系统,它支持部分简练的操作和一部分架空操作,举例,排序和通告。

  • 丰富

       
Zookeeper的原语操作是很丰盛的,可实现部分调护医治数据结谈判协调。比方,布满式队列、布满式锁和一组同等第节点中的“领导者大选”。

  • 高可靠

Zookeeper支持集群情势,能够很轻易的解决单点故障难点。

  • 松耦合交互

分歧进程间的竞相无需领会相互,以至足以不必同时存在,某进度在zookeeper中留给音讯后,该进程截至后另外进度还可以够读那条新闻。

  • 资源库

       
Zookeeper实现了三个关于通用和睦方式的开源分享存款和储蓄库,能使开采者免于编写那类通用协议。

 

2.2.2 Zookeeper API的使用

那边通过二个事例来回顾介绍怎么样运用Zookeeper API
编写自身的应用程序,代码如下:

package org.zk;

import java.io.IOException;
import java.util.List;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;

public class ListGroup extends ConnectionWatcher {
    public void list(String groupNmae) throws KeeperException, InterruptedException{
        String path ="/"+groupNmae;
        try {
            List<String> children = zk.getChildren(path, false);
            if(children.isEmpty()){
                System.out.printf("No memebers in group %s\n",groupNmae);
                System.exit(1);
            }
            for(String child:children){
                System.out.println(child);
            }
        } catch (KeeperException.NoNodeException e) {
            System.out.printf("Group %s does not exist \n", groupNmae);
            System.exit(1);
        } 
    }
    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        ListGroup listGroup = new ListGroup();
        listGroup.connect(args[0]);
        listGroup.list(args[1]);
        listGroup.close();
    }
}

该类满含七个重要的 ZooKeeper 函数,分别为 createZKInstance ()和 ZKOperations()。个中:

(1) createZKInstance()函数肩负对 ZooKeeper
实例 zk 举办伊始化。

ZooKeeper 类有八个构造函数,大家这边运用“ ZooKeeper (String connectString, int sessionTimeout ,沃特cher watcher
)”对其开始展览伊始化。由此,我们必要提供开头化所需的,连接字符串新闻,会话超时时间,以及四个watcher 实例。 19行到 25行代码,是先后所协会的多少个watcher
实例,它亦可输出所发生的平地风波。

(2) ZKOperations
()函数是大家所定义的对节点的一雨后玉兰片操作。

它包涵:创造 ZooKeeper 节点(
35行到 36行代码)、查看节点(
38 行到 39
行代码)、修改节点数据( 41 行到 42 行代码)、查看修改后节点数据( 44
行到 45行代码)、删除节点( 47行到
48行代码)、查看节点是还是不是留存( 50
行到 51
行代码)。

代码的运维结果如下:

1. 创建ZooKeeper节点(Znode:/znode;数据:myData2;权限:OPEN_ACL_UNSAFE;节点类型:Persistent)
 None
2. 查看节点是否创建成功:
 /znode myData2
3. 修改节点数据:
4. 查看是否修改成功:
 jiang1234
5. 删除节点:
6. 查看/znode节点状态:
 节点间状态:[null]

ZooKeeper中的组成员关系

·驾驭ZooKeeper的一种格局正是将其当做三个具备高可用性的文件系统。但那些文件系统中尚无公文和目录,而是统一选取“节点”(node)的定义,称为znode。znode不仅可以看成保留数据的容器(就好像文件),也能够看作保留其余znode的容器(就像目录)。全数的znode构成三个档次化的命名空间。一种自然的创立组成员列表的方法便是行使这种档次结构,创立三个以组名称叫节点名的znode作为父节点,然后以组成员名(服务器名)为节点名来创制作为子节点的znode。如下图给出了一组具有档次结构的znode。

此地写图片描述

图 ZooKeeper中的znode

在那么些示例中,大家从未在别的znode中寄存数据,但在二个实际的行使中,你能够将“关于成员的多寡”存款和储蓄在它们的znode中,例如主机名。

一、Zookeeper的四字命令

Zookeeper支持某个特定的四字命令字母与其的并行。他们非常多是查询命令,用来获得Zookeeper服务的此时此刻情景及连锁音信。用户在客户端能够透过telnet或nc向Zookeeper提交相应的通令。Zookeeper常用的四字命令见下图所示。

图片 4

上海体育场面,是Zookeeper四字命令的一个粗略用例。

[root@hadoop ~]# echo ruok|nc localhost 2181
[root@hadoop ~]# zkServer.sh start zoo1.cfg
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo1.cfg
Starting zookeeper ... STARTED
[root@hadoop ~]#  zkServer.sh start zoo2.cfg
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo2.cfg
Starting zookeeper ... STARTED
[root@hadoop ~]#  zkServer.sh start zoo3.cfg
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo3.cfg
Starting zookeeper ... STARTED
[root@hadoop ~]# echo ruok|nc localhost 2181
imok[root@hadoop ~]# echo ruok|nc localhost 2182
imok[root@hadoop ~]# echo ruok|nc localhost 2183
imok[root@hadoop ~]# echo conf|nc localhost 2181
clientPort=2181
dataDir=/usr/local/zk/data_1/version-2
dataLogDir=/usr/local/zk/logs_1/version-2
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=0
initLimit=10
syncLimit=5
electionAlg=3
electionPort=3387
quorumPort=2287
peerType=0
[root@hadoop ~]#

三、ZooKeeper示例

要是一组服务器,用于为客户端提供部分劳务。大家期待每种客户端都能够能够找到当中一台服务器,使其能够运用那个劳务,挑战之一正是维护那组服务器
列表。那组服务器的成员列表显明不能够存在互连网中的单个节点上,因为倘若不行节点产生故障,就代表是一连串统的故障(大家期待以此列表有异常高的可用性)。
纵然大家有了三个可信的点子消除了这些成员列表的仓库储存难点。假设内部一台服务器出现故障,大家还是需求减轻哪些从服务器成员列表中将它删除的难题。有些进程须要担当删除故障服务器,但只顾不可能由故障服务器自身来完结,因为故障服务器已经不再运营。

作者们所叙述的不是一个被动的分布式数据结构,而是一个主动的、能够在某些外部事件时有爆发时修改数据项景况的数据结构。ZooKeeper提供这种服务,所以让大家看看如何使用它来完成这种明确性的组成员管理选用。

ZooKeeper中的组成员关系

知晓ZooKeeper的一种艺术就是将其视作多少个持有高可用性的文件系统。但以此文件系统中未有公文和目录,而是统一使用“节点”(node)的概念,称为znode。znode不仅可以作为保留数据的器皿(就像文件),也能够看成保留别的znode的器皿(就像是目录)。全部的znode构成八个等级次序化的命名空间。一种自然的创设组成员列表的艺术正是选用这种档案的次序结构,创建贰个以组名叫节点名的znode作为父节点,然后以组成员名(服务器名)为节点名来创立作为子节点的znode。如下图给出了一组具备档期的顺序结构的znode。

 图片 5

在这一个示例中,我们从未在其余znode中积累数据,但在三个实打实的应用中,你能够将“关于成员的多少”存款和储蓄在它们的znode中,举例主机名。

7. Zookeeper删除Znode

/**
 * 删除分组
 * @author leo
 *
 */
public class DeleteGroup extends ConnectionWatcher {
    public void delete(String groupName) {
        String path = "/" + groupName;

        try {
            List<String> children = zk.getChildren(path, false);

            for(String child : children){
                zk.delete(path + "/" + child, -1);
            }
            zk.delete(path, -1);//版本号为-1,
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

zk.delete(path,version)方法的第四个参数是znode版本号,若是提供的版本号和znode版本号一致才会去除那个znode,那样能够检验出对znode的退换争辩。通过将版本号设置为-1,能够绕过这几个版本检验机制,无论znode的版本号是哪些,都会从来将其除去。

测试类:

图片 6  

public class DeleteGroupTest {
    private static final String HOSTS = "192.168.1.137";
    private static final String groupName = "zoo";

    private DeleteGroup deleteGroup = null;

    @Before
    public void init() throws IOException, InterruptedException {
        deleteGroup = new DeleteGroup();
        deleteGroup.connection(HOSTS);
    }

    @Test
    public void testDelete() throws IOException, InterruptedException, KeeperException {
        deleteGroup.delete(groupName);
    }

    @After
    public void destroy() throws InterruptedException {
        if(null != deleteGroup){
            try {
                deleteGroup.close();
            } catch (InterruptedException e) {
                throw e;
            }finally{
                deleteGroup = null;
                System.gc();
            }
        }
    }
}

View
Code

三、ZooKeeper示例

即使一组服务器,用于为客户端提供一些劳动。大家愿意每一种客户端都能够可以找到当中一台服务器,使其能够利用这一个劳动,挑衅之一正是保险那组服务器
列表。那组服务器的分子列表扬着不能存在互连网中的单个节点上,因为假如那二个节点产生故障,就象征是全数种类的故障(大家愿意这些列表有极高的可用性)。
假设大家有了八个保障的秘籍消除了那一个成员列表的蕴藏难题。就算中间一台服务器出现故障,大家依然须要消除什么从服务器成员列表上将它删除的主题材料。有个别进度要求担当删除故障服务器,但注意不能够由故障服务器自身来成功,因为故障服务器已经不复运转。

大家所描述的不是三个消沉的遍及式数据结构,而是贰个百尺竿头更上一层楼的、能够在有个别外界事件产生时修改数据项意况的数据结构。ZooKeeper提供这种劳动,所以让大家看看哪些采用它来促成这种眼看的组成员处理接纳。

ZooKeeper中的组成员关系

精通ZooKeeper的一种办法正是将其看做八个负有高可用性的文件系统。但这几个文件系统中从不公文和目录,而是统一行使“节点”(node)的概念,称为znode。znode不仅可以够当做保留数据的容器(就如文件),也能够当作保留其余znode的器皿(就像目录)。全数的znode构成叁个档期的顺序化的命名空间。一种自然的建构组成员列表的不二诀要就是使用这种档案的次序结构,创制三个以组名叫节点名的znode作为父节点,然后以组成员名(服务器名)为节点名来成立作为子节点的znode。如下图给出了一组具备档次结构的znode。

在那几个示例中,我们并未有在另外znode中蕴藏数据,但在贰个忠实的选拔中,你能够将“关于成员的多寡”存款和储蓄在它们的znode中,比如主机名。

 

3.2 加入组

下边包车型大巴这一段程序用于注册组的分子。每种组成员将用作一个程序运维,并且插手到组中。当程序退出时,那些组成员应当从组中被剔除。为了促成这点,我们在ZooKeeper的命名空间中利用短暂znode来代表二个组成员。

代码3.2 中的程序JoinGroup
完结了那些主见。在基类Connection沃特cher中,对成立和接二连三ZooKeeper实例的程序逻辑进行了重构,参见代码3.2。

代码 3.2 用于将成员参与组的先后

package org.zk;

import java.io.IOException;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs.Ids;

public class JoinGroup extends ConnectionWatcher{

    public void join(String groupName,String memberName) throws Exception {
        String path="/"+groupName+"/"+memberName;
        String createdPath=zk.create(path, null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        System.out.println("Created:"+createdPath);
    }

    public static void main(String[] args) throws Exception {
        JoinGroup joinGroup = new JoinGroup();
        joinGroup.connect(args[0]);
        joinGroup.join(args[1], args[2]);

        //stay alive until process is killed or thread is interrupted
        Thread.sleep(Long.MAX_VALUE);
    }
}

代码 3.3 用于等待构建与ZooKeeper连接的提携类

package org.zk;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;

public class ConnectionWatcher implements Watcher{
    private static final int SESSION_TIMEOUT=5000;

    protected ZooKeeper zk;
    CountDownLatch connectedSignal=new CountDownLatch(1);
    public void connect(String host) throws IOException, InterruptedException{
        zk=new ZooKeeper(host, SESSION_TIMEOUT, this);
        connectedSignal.await();
    }

    @Override
    public void process(WatchedEvent event) {
        if(event.getState()==KeeperState.SyncConnected){
            connectedSignal.countDown();
        }
    }
    public void close() throws InterruptedException{
        zk.close();
    }

}

2.2.2 Zookeeper API的使用

此地通过三个事例来简要介绍怎么样行使Zookeeper API
编写自个儿的应用程序,代码如下:

package org.zk;

import java.io.IOException;
import java.util.List;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;

public class ListGroup extends ConnectionWatcher {
    public void list(String groupNmae) throws KeeperException, InterruptedException{
        String path ="/"+groupNmae;
        try {
            List<String> children = zk.getChildren(path, false);
            if(children.isEmpty()){
                System.out.printf("No memebers in group %s\n",groupNmae);
                System.exit(1);
            }
            for(String child:children){
                System.out.println(child);
            }
        } catch (KeeperException.NoNodeException e) {
            System.out.printf("Group %s does not exist \n", groupNmae);
            System.exit(1);
        } 
    }
    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        ListGroup listGroup = new ListGroup();
        listGroup.connect(args[0]);
        listGroup.list(args[1]);
        listGroup.close();
    }
}

该类包括多少个重大的 ZooKeeper 函数,分别为 createZKInstance ()和 ZKOperations()。当中:

(1) createZKInstance()函数担负对
ZooKeeper 实例 zk 举办初始化。

ZooKeeper 类有四个构造函数,大家那边运用“ ZooKeeper (String connectString, int sessionTimeout ,Watcher watcher
)”对其举办起先化。由此,大家必要提供发轫化所需的,连接字符串音讯,会话超时时间,以及四个watcher 实例。 19行到 25行代码,是先后所组织的贰个watcher
实例,它亦可输出所发生的事件。

(2) ZKOperations
()函数是大家所定义的对节点的一种类操作。

它包含:创造 ZooKeeper 节点( 35行到 36行代码)、查看节点( 38 行到 39 行代码)、修改节点数据( 41 行到 42 行代码)、查看修改后节点数据( 44 行到
45行代码)、删除节点(
47行到 48行代码)、查看节点是还是不是留存( 50 行到
51
行代码)。

代码的运作结果如下:

1. 创建ZooKeeper节点(Znode:/znode;数据:myData2;权限:OPEN_ACL_UNSAFE;节点类型:Persistent)
 None
2. 查看节点是否创建成功:
 /znode myData2
3. 修改节点数据:
4. 查看是否修改成功:
 jiang1234
5. 删除节点:
6. 查看/znode节点状态:
 节点间状态:[null]

2.1.1 Zookeeper命令工具

再起步Zookeeper服务之后,输入以下命令,连接受Zookeeper服务:

    zkCli.sh -server localhost:2181

实践结果如下所示:

[root@hadoop ~]# zkCli.sh -server localhost:2181
Connecting to localhost:2181
2014-10-17 03:35:51,051 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.5-1392090, built on 09/30/2012 17:52 GMT
2014-10-17 03:35:51,055 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=hadoop
2014-10-17 03:35:51,057 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.6.0_24
2014-10-17 03:35:51,057 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Sun Microsystems Inc.
2014-10-17 03:35:51,066 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/usr/local/jdk/jre
2014-10-17 03:35:51,079 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/usr/local/zk/bin/../build/classes:/usr/local/zk/bin/../build/lib/*.jar:/usr/local/zk/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zk/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zk/bin/../lib/netty-3.2.2.Final.jar:/usr/local/zk/bin/../lib/log4j-1.2.15.jar:/usr/local/zk/bin/../lib/jline-0.9.94.jar:/usr/local/zk/bin/../zookeeper-3.4.5.jar:/usr/local/zk/bin/../src/java/lib/*.jar:/usr/local/zk/bin/../conf:
2014-10-17 03:35:51,083 [myid:] - INFO  [main:Environment@100] - Client environment:java.library.path=/usr/local/jdk/jre/lib/i386/client:/usr/local/jdk/jre/lib/i386:/usr/local/jdk/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
2014-10-17 03:35:51,084 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2014-10-17 03:35:51,086 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=<NA>
2014-10-17 03:35:51,099 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Linux
2014-10-17 03:35:51,100 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=i386
2014-10-17 03:35:51,101 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=2.6.32-358.el6.i686
2014-10-17 03:35:51,101 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=root
2014-10-17 03:35:51,102 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=/root
2014-10-17 03:35:51,106 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=/root
2014-10-17 03:35:51,120 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@b02e7a
Welcome to ZooKeeper!
JLine support is enabled
2014-10-17 03:35:51,233 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@966] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (Unable to locate a login configuration)
2014-10-17 03:35:51,247 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@849] - Socket connection established to localhost/127.0.0.1:2181, initiating session
[zk: localhost:2181(CONNECTING) 0] 2014-10-17 03:35:51,290 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1207] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x491da0e20b0000, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

[zk: localhost:2181(CONNECTED) 0]

总是成功现在,系统会输出Zookeeper的连带条件及安顿音信,并在荧屏输出“welcome
to
Zookeeper!”等音信。输入help之后,荧屏会输出可用的Zookeeper命令,如下图所示

图片 7

ZooKeeper学习总括