大数据zk学习
zk的ACL策略
ZooKeeper的权限控制系统类似于UNIX文件系统,它采用的是ACL(AccessControl Lists)策略。
ZooKeeper定义了如下5种权限。
·CREATE:创建子节点的权限。
·READ:获取节点数据和子节点的权限。
·WRITE:更新节点数据的权限。
·DELETE:删除子节点的权限。
·ADMIN:设置节点ACL的权限。
zk启动命令: ./zkServer.sh start
zk查看当前状态: ./zkServer.sh status
zk关闭命令: ./zkServer.sh stop
zk重启命令: ./zkServer.sh restart
客户端连接zk: zkCli.sh-server IP:port 例如: ./zkCli.sh -server 127.0.0.1:2181
连接成功后可以看到如下结果:
可以通过help查看zk有哪些命令:
通过这些命令,我们就可以实现对ZooKeeper的操作了。这里的操作都是对ZooKeeper的节点进行操作,比如列出节点、创建节点和删除节点,可以把ZooKeeper理解为以下结构,如图
connect命令用于连接ZooKeeper服务器端,比如通过connect127.0.0.1:2181,可以连接到本机的2181端口。
ls命令格式:ls path,表示列出path下的文件。
create命令格式如下:
create [-s] [-e] path data acl
其中,-s和-e参数分别指定节点为持久节点或临时节点,在不指定的情况下,则表示是持久节点;acl用来进行权限控制。如果是临时节点,会话关闭后节点也就不存在了。
比如create/mynode1 content1命令用于创建mynode1节点,并且给mynode1赋值为content1:
get命令用于获取ZooKeeper节点的数据内容和相关信息,比如我们要取得mynode1的内容,执行get/mynode1命令后,运行结果是节点的数据内容content1和此节点的相关匹配信息。
set path data [version]
set命令用于修改节点内容,其中data参数是需要更新的新内容,在这里第1次把mynode1的内容修改为content2,第2次修改为content3。具体代码如下:
通过运行结果会发现,在运行set/mynode1 content2后,dataVersion=1,运行完set/mynode1 content3后,dataVersion=2。
修改完后,通过get命令查看结果,发现内容已经变成了Content 3,具体如下:
delete命令格式如下: delete path [version]
在这里需要注意的是,如果节点存在子节点,需要先将子节点删除。
使用Java API访问ZooKeeper
package it.basic.hadoop.zk; import org.apache.zookeeper.*; import org.apache.zookeeper.Watcher.Event; import scala.math.Ordering; import java.io.IOException; public class ZookeeperDemo1 implements Watcher { private static final int SESSION_TIMEOUT=30000; public static ZooKeeper zooKeeper; public static void main(String[] args) throws Exception { String path = "/zknode10"; zooKeeper = new ZooKeeper("192.168.10.13:2181", SESSION_TIMEOUT, new ZookeeperDemo1()); //注册 zooKeeper.exists(path,true); //创建节点 zooKeeper.create(path,"myconten1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); Thread.sleep(300); //得到节点内容 byte[] bytes1 = zooKeeper.getData(path, null, null); String result1 = new String(bytes1); System.out.println("result1 : "+ result1); //再次得到节点 zooKeeper.setData(path,"testData0000".getBytes(),-1); byte[] bytes2 = zooKeeper.getData(path, null, null); String result2 = new String(bytes2); System.out.println("result2 : "+result2); Thread.sleep(300); //删除节点 zooKeeper.delete(path,-1); zooKeeper.close(); } @Override public void process(WatchedEvent watchedEvent) { if(Event.KeeperState.SyncConnected == watchedEvent.getState()){ if(Event.EventType.NodeCreated ==watchedEvent.getType()){ //当节点创建成功时进行回调,此处进行提示打印 System.out.println("Node created suceess"); try { zooKeeper.exists(watchedEvent.getPath(),true); }catch (Exception e){ e.printStackTrace(); } } else if(Event.EventType.NodeDeleted == watchedEvent.getType()){ try { zooKeeper.exists(watchedEvent.getPath(),true); }catch (Exception e){ e.printStackTrace(); } System.out.println("Node deleted success"); }else if(Event.EventType.NodeDataChanged==watchedEvent.getType()){ try { zooKeeper.exists(watchedEvent.getPath(),true); }catch (Exception e){ e.printStackTrace(); } System.out.println("Node Changed success"); } } } }
运行结果如下: