• 大数据学习总结07


    一、Znode节点属性

    dataVersion:数据版本, 每次当 Znode 中的数据发生变化的时候, dataVersion都会自增一下
    cversion:节点版本, 每次当 Znode 的节点发生变化的时候, cversion 都会自增
    aclVersion:ACL(Access Control List) 的版本号, 当 Znode 的权限信息发生变化的时候aclVersion会自增
    zxid:事务ID
    ctime:创建时间
    mtime:最近一次更新的时间
    ephemeralOwner:如果 Znode 为临时节点, ephemeralOwner 表示与该节点关联的 SessionId

    通过get节点的目录,可以得到节点的属性

     

    二、watch机制

    对zookeeper里的某个节点设置个监听,可以知道该节点是否进行了“增加”,“删除”,“修改”

    Watcher 的特点
    一次性触发 一个 Watcher 只会被触发一次, 如果需要继续监听, 则需要再次添加Watcher
    事件封装: Watcher 得到的事件是被封装过的, 包括三个内容 keeperState,eventType, path

    设置监听机制给/hello节点

    另外再打开Hadoop101,修改/hello里的数据,看能否监听到

    证明:可以监听到hello节点的数据改变了

    三、Zoopkeeper的JAVAAPI操作

    这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端框架 Curator ,解决了很多Zookeeper客户端非常底层的细节开发工作 。
    Curator包含了几个包:
    curator-framework:对zookeeper的底层api的一些封装
    curator-recipes:封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式计数器等

    1、创建maven工程,导入jar包

    创建一个测试类,开始进行zookeeper的javaapi编程

    2、创建永久节点

    //创建永久节点
    @Test
    public void createZnode() throws Exception {
        /*
        定制一个重试策略
        param1:重试的时间间隔
        param2:重试的最大次数
         */
        RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1);
        /*
        获取客户端对象
        param1:要连接的zookeeper服务器列表
        param2:会话的超时时间
        param3:链接超时时间
        param4:重试策略
         */
        String connectionStr="192.168.88.100,192.168.88.120,192.168.88.120";
    
        CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,3000,8000,retryPolicy);
        //打开客户端
        client.start();
        //创建节点
        client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/hello2","world".getBytes());
        //关闭客户端
        client.close();
    }

    运行后,进入linux查看,创建成功

    3、创建临时节点

    //创建临时节点
    @Test
    public void createTmpZnode() throws Exception {
        /*
        定制一个重试策略
        param1:重试的时间间隔
        param2:重试的最大次数
         */
        RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1);
        /*
        获取客户端对象
        param1:要连接的zookeeper服务器列表
        param2:会话的超时时间
        param3:链接超时时间
        param4:重试策略
         */
        String connectionStr="192.168.88.100,192.168.88.120,192.168.88.120";
    
        CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,3000,8000,retryPolicy);
        //打开客户端
        client.start();
        //创建节点
        client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/hello3","world".getBytes());
        //关闭客户端
        Thread.sleep(10000);
        client.close();
    }

    和创建永久节点的区别是:临时节点是:EPHEMERAL,而且要让他休眠几秒否则Linux看不到,因为是临时的,会话结束就会消失。

    4、修改节点数据

    使用的是:client.setData().forPath(节点路径,要更新的数据(记得转换成byte))

    //设置节点数据
    @Test
    public void setZnodeData() throws Exception {
        /*
        定制一个重试策略
        param1:重试的时间间隔
        param2:重试的最大次数
         */
        RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1);
        /*
        获取客户端对象
        param1:要连接的zookeeper服务器列表
        param2:会话的超时时间
        param3:链接超时时间
        param4:重试策略
         */
        String connectionStr="node01:2181,node02:2181,node03:2181";
    
        CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,3000,8000,retryPolicy);
        //打开客户端
        client.start();
        //修改节点数据
        client.setData().forPath("/hello2","zookeeper".getBytes());
        //关闭客户端
        client.close();
    }

     

    5、获取节点数据

    用byte数组来获取client里的数据然后转换成String输出

    //获取节点数据
    @Test
    public void getZnodeData() throws Exception {
        /*
        定制一个重试策略
        param1:重试的时间间隔
        param2:重试的最大次数
         */
        RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1);
        /*
        获取客户端对象
        param1:要连接的zookeeper服务器列表
        param2:会话的超时时间
        param3:链接超时时间
        param4:重试策略
         */
        String connectionStr="node01:2181,node02:2181,node03:2181";
    
        CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,3000,8000,retryPolicy);
        //打开客户端
        client.start();
        //修改节点数据
        byte[] bytes=client.getData().forPath("/hello2");
        System.out.println(new String(bytes));
        //关闭客户端
        client.close();
    }

    在打印处输出:

    6、设置节点的watch机制

    通过监听hello3节点,对其进行创建,修改,删除

    //节点的watch机制
    @Test
    public void watchZnode() throws Exception {
        /*
        1、定制一个重试策略
        param1:重试的时间间隔
        param2:重试的最大次数
         */
        RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1);
        /*
        2、获取客户端对象
        param1:要连接的zookeeper服务器列表
        param2:会话的超时时间
        param3:链接超时时间
        param4:重试策略
         */
        String connectionStr="node01:2181,node02:2181,node03:2181";
    
        CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,3000,8000,retryPolicy);
        //3、打开客户端
        client.start();
        //4、创建一个TreeCache对象,指定要监控的节点路径
        final TreeCache treeCache=new TreeCache(client,"/hello3");
        //5、自定义一个监听器
        treeCache.getListenable().addListener(new TreeCacheListener() {
            @Override
            public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {
                ChildData data = treeCacheEvent.getData();
                if(data!=null){
                    switch (treeCacheEvent.getType()){
                        case NODE_ADDED:
                            System.out.println("监听到有新增节点");
                            break;
                        case NODE_REMOVED:
                            System.out.println("监听到有节点被移除");
                            break;
                        case NODE_UPDATED:
                            System.out.println("监听到有节点被更新");
                            break;
                        default:
                            break;
                    }
                }
            }
        });
        //6、开始监听
        treeCache.start();
        Thread.sleep(100000);
    
        //7、关闭客户端
        client.close();
    }

    打印台输出:

  • 相关阅读:
    express获取post传参数据:body-parser使用详解
    设置 -webkit-app-region 后无法响应鼠标点击事件的解决方式
    微信小程序动画效果
    【转】线程及同步的性能
    【转】线程及同步的性能
    Shell命令_smem
    Redis集群(九):Redis Sharding集群Redis节点主从切换后客户端自动重新连接
    Redis集群(八):Redis Sharding集群
    Java并发_volatile实现可见性但不保证原子性
    Java_jvisualvm使用JMX连接远程机器(实践)
  • 原文地址:https://www.cnblogs.com/MoooJL/p/13540951.html
Copyright © 2020-2023  润新知