美文网首页
4)zookeeper实战

4)zookeeper实战

作者: bullion | 来源:发表于2019-03-10 14:25 被阅读0次

    分布式安装部署

    1.集群规划

    在hadoop102、hadoop103和hadoop104三个节点上部署Zookeeper。

    2.解压安装

        (1)解压Zookeeper安装包到/opt/module/目录下

    $ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/

        (2)同步/opt/module/zookeeper-3.4.10目录内容到hadoop103、hadoop104

    $ xsync zookeeper-3.4.10/

    3.配置服务器编号

        (1)在/opt/module/zookeeper-3.4.10/这个目录下创建zkData

    $ mkdir -p zkData

        (2)在/opt/module/zookeeper-3.4.10/zkData目录下创建一个myid的文件

    $ touch myid

    添加myid文件,注意一定要在linux里面创建,在notepad++里面很可能乱码

        (3)编辑myid文件

    $ vi myid

           在文件中添加与server对应的编号:

    2

        (4)拷贝配置好的zookeeper到其他机器上

    $ xsync myid

    并分别在hadoop102、hadoop103上修改myid文件中内容为3、4

    4.配置zoo.cfg文件

        (1)重命名/opt/module/zookeeper-3.4.10/conf这个目录下的zoo_sample.cfg为zoo.cfg

    $ mv zoo_sample.cfg zoo.cfg

        (2)打开zoo.cfg文件

    $ vim zoo.cfg

    修改数据存储路径配置

    dataDir=/opt/module/zookeeper-3.4.10/zkData

    增加如下配置

    #######################cluster##########################

    server.2=hadoop102:2888:3888

    server.3=hadoop103:2888:3888

    server.4=hadoop104:2888:3888

        (3)同步zoo.cfg配置文件

    $ xsync zoo.cfg

        (4)配置参数解读

    server.A=B:C:D。

    A是一个数字,表示这个是第几号服务器;

    集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。

    B是这个服务器的ip地址;

    C是这个服务器与集群中的Leader服务器交换信息的端口;

    D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

    5.集群操作

        (1)分别启动Zookeeper

    $ bin/zkServer.sh start

        (2)查看状态

    $ bin/zkServer.sh status

    客户端命令操作

    1.启动客户端

    $ bin/zkCli.sh

    2.显示所有操作命令

    $ help

    3.查看当前znode中所包含的内容

    $ ls /

    4.查看当前节点详细数据

    $ ls2 /

    5.分别创建2个普通节点

    $ create /sanguo "jinlian"

    $ create /sanguo/shuguo "liubei"

    6.获得节点的值

    $ get /sanguo

    7.创建短暂节点

    $ create -e /sanguo/wuguo "zhouyu"

        (1)在当前客户端是能查看到的

    $ ls /sanguo 

        (2)退出当前客户端然后再重启客户端

    $ quit

    $ bin/zkCli.sh

        (3)再次查看根目录下短暂节点已经删除

    $ ls /sanguo

    8.创建带序号的节点

    $ create -s /sanguo/weiguo "caocao"

    9.修改节点数据值

    $ set /sanguo/weiguo "simayi"

    10.节点的值变化监听

    $ get /sanguo watch

    11.节点的子节点变化监听(路径变化)

    $ ls /sanguo watch

    12.删除节点

    $ delete /sanguo/jin

    13.递归删除节点

    $ rmr /sanguo/shuguo

    14.查看节点状态

    $ stat /sanguo

    API应用(环境搭建)

    1.创建一个Maven工程

    2.添加pom文件

    <dependency>

        <groupId>junit</groupId>

        <artifactId>junit</artifactId>

        <version>RELEASE</version>

    </dependency>

    <dependency>

        <groupId>org.apache.logging.log4j</groupId>

        <artifactId>log4j-core</artifactId>

        <version>2.8.2</version>

    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->

    <dependency>

        <groupId>org.apache.zookeeper</groupId>

        <artifactId>zookeeper</artifactId>

        <version>3.4.10</version>

    </dependency>


    3.拷贝log4j.properties文件到项目根目录

    需要在项目的src/main/resources目录下,新建一个文件,命名为“log4j.properties”,在文件中填入

    log4j.rootLogger=INFO, stdout

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender 

    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 

    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n 

    log4j.appender.logfile=org.apache.log4j.FileAppender 

    log4j.appender.logfile.File=target/spring.log 

    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout 

    log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

    API应用(ZooKeeper API)

    创建zookeeper客户端

    public class TestZookeeper {

        private String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181";

        private int sessionTimeout = 2000;

        private ZooKeeper zkClient;

        @Before

        public void init() throws IOException {

            zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {

                @Override

                public void process(WatchedEvent event) {

                    // 收到事件通知后的回调函数(用户的业务逻辑)

                    System.out.println(event.getType() + "--" + event.getPath());

                    // 再次启动监听

                    try {

                        zkClient.getChildren("/", true);

                    } catch (Exception e) {

                        e.printStackTrace();

                    }

                }

            });

        }

    }

    创建子节点

        @Test

        public void createNode() throws Exception{

            String path = zkClient.create("/sanguo", "shuguo".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

            System.out.println(path);

        }

    获取子节点并监听节点变化

        @Test

        public void getChildren() throws Exception{

            List<String> children = zkClient.getChildren("/", true);

            for (String child : children) {

                System.out.println(child);

            }

            // 延时阻塞

            Thread.sleep(Long.MAX_VALUE);

        }

    收到通知后会回调:

        @Before

        public void init() throws IOException {

            zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {

                @Override

                public void process(WatchedEvent event) {

                    // 收到事件通知后的回调函数(用户的业务逻辑)

                    System.out.println(event.getType() + "--" + event.getPath());

                    // 再次启动监听

                    try {

                        zkClient.getChildren("/", true);

                    } catch (Exception e) {

                        e.printStackTrace();

                    }

                }

            });

        }

    判断节点是否存在

        @Test

        public void exist() throws KeeperException, InterruptedException {

            Stat stat = zkClient.exists("/atguigu", false);

            System.out.println(stat == null ? "not exist" : "exist");

        }

    案例

    监听服务器节点动态上下线案例 - 简书

    相关文章

      网友评论

          本文标题:4)zookeeper实战

          本文链接:https://www.haomeiwen.com/subject/pybupqtx.html