hadoop(五)、zookeeper相关功能及原理

一、zookeeper概念简介
Zookeeper是一个分布式协调服务;就是为用户的分布式应用程序提供协调服务
A、zookeeper是为别的分布式程序服务的
B、zoopkeeper本身就是一个分布式程序(只要半数以上节点存活,zk就能正常服务)
C、zookeeper所提供的服务涵盖:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务等…
D、虽然说可以提供各种服务,但是zookeeper在底层只提供两个功能:

管理(存储、读取)用户程序提交的数据
为用户程序提供数据节点监听服务

二、zookeeper集群机制
半数机制,集群中半数以上机器存活,集群可用
zookeeper适合装在奇数台机器上

三、zk节点
znode是zk树形结构中的数据节点,用于存储数据;
zookeeper两种类型的节点:

  • 持久节点(PERSISENT):一旦创建,除非主动调用删除操作,否则一直存储在zk上;
  • 临时节点(EPHEMERAL):与客户端会话绑定,一旦客户端会话失效,这个客户端所创建的所有临时几点都会被移除

四、java连接zookeeper实现zookeeper的基本操作(znode的增删改查)

	private static final String connectString="hdpbasic1:2181,hdpbasic2:2181,hdpbasic3:2181";
    private static final int sessionTimeout=2000;

    ZooKeeper zkClient=null;

    /**
     * 初始化监听事件处理
     * @throws Exception
     */
    @Before
    public void init() throws Exception{
        zkClient=new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            //收到事件通知后的回调函数
            public void process(WatchedEvent event) {
                System.out.println(event.getType()+"---"+event.getPath());
                try {
                    //监听事件处理后重新注册监听器,一个监听器只能监听一次
                    zkClient.getChildren("/",true);
                } catch (KeeperException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * 创建数据节点到zk中
     * */
    @Test
    public void  createNode() throws Exception{
        //参数1:要创建的节点的路径 2:节点大数据参数 3:节点的权限参数 4:节点的类型
        String nodeCreate=zkClient.create("/idea","hellozk".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
        System.out.println("创建节点:"+nodeCreate);
    }

    /**
     * 获取子节点
     */
    @Test
    public void getChildNode() throws Exception{
        List<String> childs = zkClient.getChildren("/",true);
        for (String child:childs){
            System.out.println("子节点:"+child);
        }
        Thread.sleep(Long.MAX_VALUE);
    }

    /**
     * 获取znode数据
     */
    @Test
    public void getData() throws Exception{
        byte[] data= zkClient.getData("/idea",true,null);
        System.out.println("数据为:"+new String(data));
    }

    /**
     * 删除znode
     */
    @Test
    public void deleteData() throws Exception{
        //-1表示删除所有版本数据
        zkClient.delete("/idea",-1);
    }

    //判断znode是否存在
    @Test
    public void isNodeExits() throws Exception{
        Stat stat=zkClient.exists("/idea",false);
        System.out.println(stat==null?"not exits":"exits");
    }

    //修改znode数据
    @Test
    public void updateZnode() throws Exception{
        Stat stat=zkClient.setData("/idea","235".getBytes(),-1);
    }

猜你喜欢

转载自blog.csdn.net/qq_34300892/article/details/88532144