创建ZNode 在整个的ZooKeeper 操作过程之中,如果要想进行数据的保存,那么所有的数据一定要有各自的节点,并且在ZooKeeper 里 面节点不允许多级创建,必须一级一级的向下创建。如果要想通过程序进行节点创建那么可以继续使用ZooKeeper 程序类完成,在 这个类中提供有一个创建节点方法:public String create(String path, byte[] data, List< ACL > acl, CreateMode createMode) throws KeeperException,InterruptedException; |- “String path”:表示要创建节点路径(父节点必须存在); |- “byte[] data”:表示要在节点上保存的数据,数据必须使用byte 数组来设置; |- “List< ACL > acl”:设置访问控制列表,这个操作通过“org.apache.zookeeper.ZooDefs.Ids”来进行配置,有如下取值: |- 随意访问:public static final ArrayList< ACL > OPEN_ACL_UNSAFE; |- 随意读取:public static final ArrayList< ACL > READ_ACL_UNSAFE; |- “CreateMode createMode”:表示该节点的类型,对于节点的类型通过“CreateMode”枚举来设置: |- 永久节点:客户端关闭后该节点依然会保留; |- 用户定义名称:public static final CreateMode PERSISTENT; |- 用户定义名称-序列:public static final CreateMode PERSISTENT_SEQUENTIAL; |- 临时节点:客户端连接时会保留几点,但是关闭之后节点自动删除; |- 用户定义名称:public static final CreateMode EPHEMERAL; |- 用户定义名称-序列:public static final CreateMode EPHEMERAL_SEQUENTIAL; 创建永久化的ZNode
public class ZooKeeperCreateZNodeP { private static final String CONNECT_HOSTS = "ZooKeeper主机IP,ZooKeeper主机IP....(,隔开):2181:2181" ; public static void main(String[] args) throws Exception { ZooKeeper zkClient = new ZooKeeper(CONNECT_HOSTS, 2000, new Watcher(){ @Override public void process(WatchedEvent event) { // 此处的方法体暂时为空 }}) ; String noseqZNode = zkClient.create("/java", "新世界,你好!".getBytes("UTF-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT) ; System.out.println("1、创建新节点:" + noseqZNode); String seqZNode = zkClient.create("/bigdata", "世界,晚安!".getBytes("UTF-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL) ; System.out.println("2、创建新节点:" + seqZNode); } }当前的节点不存在才可以进行创建处理,否则无法创建。
创建临时节点
public class ZooKeeperCreateZNodeE { private static final String CONNECT_HOSTS = "ZooKeeper主机IP,ZooKeeper主机IP....(,隔开):2181" ; public static void main(String[] args) throws Exception { ZooKeeper zkClient = new ZooKeeper(CONNECT_HOSTS, 2000, new Watcher(){ @Override public void process(WatchedEvent event) { // 此处的方法体暂时为空 }}) ; String noseqZNode = zkClient.create("/a", "新世界,你好!".getBytes("UTF-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL) ; System.out.println("1、创建新节点:" + noseqZNode); String seqZNode = zkClient.create("/b", "世界,晚安!".getBytes("UTF-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL) ; System.out.println("2、创建新节点:" + seqZNode); Thread.sleep(Long.MAX_VALUE); } }节点数据操作 节点的数据操作有设置、取得等基本功能。 1、 取得节点数据: 在ZooKeeper 客户端里面可以使用“get”命令取得节点的内容,那么对于程序而言,则可以使用如下的方法取得节点的数据: · 取得数据:public byte[] getData(String path, boolean watch, Stat stat) throws KeeperException,InterruptedException; |- “String path”:设置要取得数据的节点名称; |- “boolean watch”:表示的是是否需要进行监听; |- “Stat stat”:取得节点状态信息;
public class ZooKeeperGetData { private static final String CONNECT_HOSTS = "ZooKeeper主机IP,ZooKeeper主机IP....(,隔开):2181" ; public static void main(String[] args) throws Exception { ZooKeeper zkClient = new ZooKeeper(CONNECT_HOSTS, 2000, new Watcher(){ @Override public void process(WatchedEvent event) { // 此处的方法体暂时为空 }}) ; Stat stat = new Stat() ; String data = new String(zkClient.getData("/java", true, stat)) ; System.out.println(data); System.out.println(stat); } }2、 判断数据节点是否存在 正常来讲当节点存在的时候才可以通过节点取得相应的数据,所以如果要想判断节点是否存在可以使用以下方法: · 判断:public Stat exists(String path, boolean watch) throws KeeperException, InterruptedException; |- 该判断方法返回的是一个Stat 对象,如果有节点则不为null;
public class ZooKeeperExists { private static final String CONNECT_HOSTS = "ZooKeeper主机IP,ZooKeeper主机IP....(,隔开):2181" ; public static void main(String[] args) throws Exception { ZooKeeper zkClient = new ZooKeeper(CONNECT_HOSTS, 2000, new Watcher(){ @Override public void process(WatchedEvent event) { // 此处的方法体暂时为空 }}) ; Stat stat = zkClient.exists("/java", true) ; if (stat != null) { // 当前节点存在 String data = new String(zkClient.getData("/java", true, stat)) ; System.out.println(data); } } }3、 修改节点数据: 在ZooKeeper 客户端里面如果要修改节点的数据使用的set 命令完成,现在可以使用如下方法完成: · 方法:public Stat setData(String path, byte[] data, int version) throws KeeperException,InterruptedException;
public class ZooKeeperSetData { private static final String CONNECT_HOSTS = "ZooKeeper主机IP,ZooKeeper主机IP....(,隔开):2181" ; public static void main(String[] args) throws Exception { ZooKeeper zkClient = new ZooKeeper(CONNECT_HOSTS, 2000, new Watcher(){ @Override public void process(WatchedEvent event) { // 此处的方法体暂时为空 }}) ; Stat stat = zkClient.setData("/java", "hadoop".getBytes(), 0) ; // 设置数据 System.out.println(stat); } }4、 删除节点 如果要删除节点,使用方法:public void delete(String path, int version) throws InterruptedException, KeeperException;
public class ZooKeeperDelete { private static final String CONNECT_HOSTS = "ZooKeeper主机IP,ZooKeeper主机IP....(,隔开):2181" ; public static void main(String[] args) throws Exception { ZooKeeper zkClient = new ZooKeeper(CONNECT_HOSTS, 2000, new Watcher(){ @Override public void process(WatchedEvent event) { // 此处的方法体暂时为空 }}) ; if (zkClient.exists("/java", true) != null) { // 节点存在 zkClient.delete("/java", -1); } } }