有没有读取zookeeper服务连接信息的API?

2021-03-26 19:08发布

2条回答
studentaaa
2楼 · 2021-04-11 14:21

获取数据

客户端可以通过Zookeeper的API来获取一个节点的数据内容,


   void getData(String path, boolean watch, DataCallback cb, Object ctx)

    byte[]  getData(String path, boolean watch, Stat stat)

    void    getData(String path, Watcher watcher, DataCallback cb, Object ctx)

    byte[]  getData(String path, Watcher watcher, Stat stat)

1

2

3

4

这里也有同步和异步接口,

path:指定数据节点的节点路径,

watcher:注册的watcher,一旦注册节点内容有变更,就会向客户端发送通知,该参数允许传入null

stat:指定数据节点的节点状态信息,用法是在接口中传入一个旧的stat变量,该stat变量会在方法执行过程中,被来自服务端响应的新stat对象替换

Watch:表明是否需要注册一个watcher

Cb:注册一个异步回调函数

Ctx:用于传递上下文信息的对象


同步读取数据


package com.paic.Spark;


import org.apache.zookeeper.*;

import org.apache.zookeeper.data.Stat;


import java.io.IOException;

import java.util.concurrent.CountDownLatch;


/**

 * Created by Xlucas on 2018/4/16.

 */

public class ZookeeperDemo7 implements  Watcher{

    private static CountDownLatch connectedSe=new CountDownLatch(1);

    private static ZooKeeper zk=null;

    private  static Stat stat=new Stat();

    public  static void  main(String[] args) throws IOException, InterruptedException, KeeperException {

        String path="/zk-hosts-getDate";

        zk=new ZooKeeper("10.25.76.173", 2000, new ZookeeperDemo7());

        connectedSe.await();

        //创建父节点

        zk.create(path,"get1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        //获取节点数据内容

        System.out.println(new String(zk.getData(path,true,stat)));

        System.out.println(stat.getCzxid()+","+ stat.getMzxid()+","+stat.getVersion());

        zk.setData(path,"123".getBytes(),-1);

        Thread.sleep(Integer.MAX_VALUE);

    }

    @Override

    public void process(WatchedEvent event) {

        //监听路径节点下是否有变化,

        if(Watcher.Event.KeeperState.SyncConnected==event.getState()){

            if (Watcher.Event.EventType.None==event.getType()&&null ==event.getPath()){

                connectedSe.countDown();

            }else if(event.getType()== Event.EventType.NodeDataChanged){

                try{

                    System.out.println(new String(zk.getData(event.getPath(),true,stat)));

                    System.out.println(stat.getCzxid()+","+stat.getMzxid()+","+stat.getVersion());

                }catch (Exception e){


                }

            }

        }

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

运行结果

get1

30064782423,30064782423,0

123

30064782423,30064782424,1


        首先创建一个节点/zk-hosts-getDate,并初始化其数据内容为”get1”,然后调用getData的同步接口来获取/zk-hosts-getDate节点的数据内容,调用的同时注册了一个watcher,之后我们同样以“123”去更新将该节点的数据内容,此时,由于我们之前在该节点上注册了一个watcher,因此,一旦该节点的数据发生变化,Zookeeper服务端就会向客户端发出一个“数据变更”的事件通知,于是,客户端可以在收到这个事件通知后,再次调用getData接口来获取新的数据内容,

        另外,在调用getData接口的同时,我们传入了一个stat变量,在Zookeeper客户端的内部实现中,会从服务端的相应中获取到数据节点的最新节点状态信息,来替换这个客户端的旧状态

        从上面的内容我们可以看到,Czxid为”30064782423”时被创建,在”30064782424”被更新,于是节点的数据版本从”0“到”1”,从这里我们可以知道,数据内容或者是数据版本变化,都会触发服务端的NodeDataChanged通知。


异步读取数据


package com.paic.Spark;


import org.apache.zookeeper.*;

import org.apache.zookeeper.data.Stat;


import java.io.IOException;

import java.util.concurrent.CountDownLatch;


/**

 * Created by Xlucas on 2018/4/16.

 */

public class ZookeeperDemo8 implements Watcher {

    private static CountDownLatch connectedSe=new CountDownLatch(1);

    private static ZooKeeper zk=null;

    public  static void  main(String[] args) throws IOException, InterruptedException, KeeperException {

        String path="/zk-hosts-getDate1";

        zk=new ZooKeeper("10.25.76.173", 2000, new ZookeeperDemo8());

        connectedSe.await();

        //创建父节点

        zk.create(path,"get1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        zk.getData(path,true,new DataCallBack(),null);

        zk.setData(path,"123".getBytes(),-1);

        Thread.sleep(Integer.MAX_VALUE);

    }

    @Override

    public void process(WatchedEvent event) {

        if(Event.KeeperState.SyncConnected==event.getState()){

            if(Event.EventType.None==event.getType()&&null==event.getPath()){

                connectedSe.countDown();

            }else if(event.getType()== Event.EventType.NodeDataChanged){

                try {

                    zk.getData(event.getPath(),true,new DataCallBack(),null);

                }catch (Exception e){


                }

            }

        }

    }

}


package com.paic.Spark;


import org.apache.zookeeper.AsyncCallback;

import org.apache.zookeeper.data.Stat;


/**

 * Created by Xlucas on 2018/4/16.

 */

public class DataCallBack implements AsyncCallback.DataCallback {

    @Override

    public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {

        System.out.println(rc+", "+path+", "+new String(data));

        System.out.println(stat.getCzxid()+", "+stat.getMzxid()+", "+stat.getVersion());

    }

}

在zookeeper中提供了原生的API可以供我们开发使用,Zookeeper是一种作用于分布式应用高性能的调度服务

相关问题推荐

  • 回答 10

    创建test文件夹hadoop fs -mkdir /test

  • 回答 7

    Hadoop的三大核心组件分别是:1、HDFS(Hadoop Distribute File System):hadoop的数据存储工具。2、YARN(Yet Another Resource Negotiator,另一种资源协调者):Hadoop 的资源管理器。3、Hadoop MapReduce:分布式计算框架。HDFS是一个高度容错性的系统,适合部...

  • 回答 18

    hbase依靠HDFS来存储底层数据。Hadoop分布式文件系统(HDFS)为HBase提供了高可靠性的底层存储支持,HBase中的所有数据文件都存储在Hadoop HDFS文件系统上。

  • 回答 24

    HBase分布式数据库具有如下的显著特点:容量大:HBase分布式数据库中的表可以存储成千上万的行和列组成的数据。面向列:HBase是面向列的存储和权限控制,并支持独立检索。列存储,其数据在表中是按照某列存储的,根据数据动态的增加列,并且可以单独对列进行...

  • 回答 19

    解决问题的层面不一样首先,Hadoop和Apache Spark两者都是大数据框架,但是各自存在的目的不尽相同。Hadoop实质上更多是一个分布式数据基础设施: 它将巨大的数据集分派到一个由普通计算机组成的集群中的多个节点进行存储,意味着您不需要购买和维护昂贵的服务...

  • 回答 14

    1、HBase写快读慢,HBase的读取时长通常是几毫秒,而Redis的读取时长通常是几十微秒。性能相差非常大。2、HBase和Redis都支持KV类型。但是Redis支持List、Set等更丰富的类型。3、Redis支持的数据量通常受内存限制,而HBase没有这个限制,可以存储远超内存大小...

  • 回答 15

    列式存储格式是指以列为单位存储数据的数据存储格式,相比于传统的行式存储格式,它具有压缩比高、读I/O少(此处指可避免无意义的读I/O)等优点,目前被广泛应用于各种存储引擎中。对于HBase而言,它并不是一个列式存储引擎,而是列簇式存储引擎,即同一列簇中...

  • 回答 14

    一、简单理解Hadoop是一个大象:一个hadoop集群主要包含三个主要的模块:Mapreduce,hdfs,yarn。mapreduce是一个分离在合并的计算框架,注意他不是一个集群,而是一个编程框架。hdfs是一个分布式文件系统,是一个分布式集群,用于存放数据。yarn集群是负责集群...

  • 回答 12

    01 网络公开数据集02 数据报采集03 网络爬虫04 日志收集05 社会调查06 业务数据集07 埋点采集08 传感器采集09 数据交易平台10 个人数据收集

  • 回答 9

    1 Hadoop 各个目录的解释bin:Hadoop管理脚本和使用脚本所在目录, sbin目录下的脚本都是使用此目录下的脚本实现的。etc:Hadoop的所有配置文件所在的目录,所有hadoop的配置在etc/hadoop目录下include:对外提供的库的头文件lib :对外提供的动态编程库和静态...

  • 回答 4

    HDFS存储机制,包括HDFS的写入过程和读取过程两个部分: 1、写入过程:  1)客户端向namenode请求上传文件,namenode检查目标文件是否已存在,父目录是否存在。2)namenode返回是否可以上传。3)客户端请求第一个 block上传到哪几个datanode服务器上。4)nam...

  • Shuffle 发生在哪里?2021-04-28 20:11
    回答 4

    adoop核心:MapReduce原理。 MR的核心是shuffle,被称为奇迹发生的地方。 shuffle,弄乱,洗牌的意思。partition 分区,sort 排序,spill溢出,disk 磁盘下面是官方对shuffle的配图: phase 阶段,fetch 最终,merge 合并...

  • 回答 2

    Shuffle阶段分为两部分:Map端和Reduce端。一 map端shuffle过程;1-内存预排序:默认每个map有100M内存进行预排序(为了效率),超过阈值,会把内容写到磁盘;    此过程使用快速排序算法;2-根据key和reducer的数量进行分区和排序;首先根据数据所属的Parti...

  • 回答 3

    大数据时代需要1存储大量数据2快速的处理大量数据3从大量数据中进行分析 

  • Hadoop有哪几种模式?2021-04-27 20:20
    回答 3

    hadoop的四种模式。1、本地模式:本地模式就是解压源码包,不需要做任何的配置。通常用于开发调试,或者感受hadoop。2、伪分布模式:在学习当中一般都是使用这种模式,伪分布模式就是在一台机器的多个进程运行多个模块。虽然每一个模块都有相应的进程,但是却...

  • 回答 1

    进入和退出安全模式 [root@localhost bin]# ./hdfs dfsadmin -safemode enter15/08/03 07:26:24 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where ......

没有解决我的问题,去提问