python zookeeper 学习笔记
1.安装zookeeper
下载zookeeper后,解压,安装
cd zookeeper-3.4./src/c
./configure
make
make install
2.启动zookeeper服务
cd zookeeper-3.4./conf mv zoo_sample.cfg zoo.cfg
vim zoo.cfg #修改dataDir=/data/database/zookeeper
mkdir -p /data/database/zookeeper
cd ..
zookeeper-3.4.-cdh5.0.0]# cd bin/
./zkServer.sh start #启动服务
./zkServer.sh status #查看启动状态
如果显示
Mode: standalone
则表示启动成功
如果显示 It is probably not running,原因是没有安装jdk或者没有配置JAVA_HOME路径
3.安装zkpython
在https://pypi.python.org/pypi/zkpython/0.4.2 下载,然后解压后安装
如果 import zookeeper就表示成功安装
4.python连接和操作zookeeper
输入python进入python界面
>>> import zookeeper
>>> zk=zookeeper.init("localhost:2181") #初始化zookeeper连接
#创建zookeeper节点
>>> zookeeper.create(zk,"/zk_for_py","mydata1",[{"perms":,"scheme":"world","id":"anyone"}],)
'/zk_for_py' #获取'/'下面的所以节点 >>> zookeeper.get_children(zk,"/",None)
['app', 'zookeeper', 'zk_for_py']
#创建zookepper节点
>>> zookeeper.create(zk,"/zk_for_py1","mydata1",[{"perms":0x1f,"scheme":"world","id":"anyone"}],)
'/zk_for_py1' #获取节点信息
>>> zookeeper.get(zk,"/zk_for_py1")
('mydata1', {'pzxid': 9L, 'ctime': 1398512377068L, 'aversion': , 'mzxid': 9L, 'numChildren': , 'ephemeralOwner': 0L, 'version': , 'dataLength': , 'mtime': 1398512377068L, 'cversion': , 'czxid': 9L})
>>> zookeeper.get_children(zk,"/zk_for_py1",None)
[] >>> zookeeper.get_children(zk,"/")
['app', 'zookeeper', 'zk_for_py1', 'zk_for_py']
#节点的数据只能是字符串
>>> zookeeper.set(zk,"/zk_for_py1",{"k":"v"})
Traceback (most recent call last):
File "<stdin>", line , in <module>
TypeError: must be string or read-only buffer, not dict
>>> zookeeper.set(zk,"/zk_for_py1","hello") >>> zookeeper.get(zk,"/zk_for_py1")
('hello', {'pzxid': 9L, 'ctime': 1398512377068L, 'aversion': , 'mzxid': 10L, 'numChildren': , 'ephemeralOwner': 0L, 'version': , 'dataLength': , 'mtime': 1398512533595L, 'cversion': , 'czxid': 9L})
>>> zookeeper.delete(zk,"zk_for_py")
Traceback (most recent call last):
File "<stdin>", line , in <module>
zookeeper.BadArgumentsException: bad arguments
>>> zookeeper.delete(zk,"/zk_for_py") >>> zookeeper.get(zk,"/zk_for_py1")
('hello', {'pzxid': 9L, 'ctime': 1398512377068L, 'aversion': , 'mzxid': 10L, 'numChildren': , 'ephemeralOwner': 0L, 'version': , 'dataLength': , 'mtime': 1398512533595L, 'cversion': , 'czxid': 9L})
这是可以新开一个shell页面,在python中再初始化一个连接,可以获取前面set的数据“hello"
>>> import zookeeper
>>> zk=zookeeper.init("localhost:2181") >>> zookeeper.get(zk,"/zk_for_py1")
('hello', {'pzxid': 9L, 'ctime': 1398512377068L, 'aversion': , 'mzxid': 10L, 'numChildren': , 'ephemeralOwner': 0L, 'version': , 'dataLength': , 'mtime': 1398512533595L, 'cversion': , 'czxid': 9L})
#定义一个监听器
>>> def myWatch(zk,type,state,path):
... print "zk:",str(type),str(state),str(path)
... zookeeper.get(zk,path,myWatch)
...
>>> data=zookeeper.get(zk,"/zk_for_py1",myWatch)#设定监听节点
#当在上面的shell中改变这个节点的数据时,这个shell就会有这样的输出
>>> TypeError: 'str' object is not callable
zk: /zk_for_py1
zk: /zk_for_py1
创建节点说明:
zookeeper.create(self.handle, path, data, [acl2], flags) zk创建节点的api,flags可以为EPHEMERAL SEQUENCE 或0,如果设置为EPHEMERAL ,这个节点只会短暂存在,即过期就好被删除,过期的时间为session的时间,SEQUENCE a unique monotonically increasing sequence number is appended to the path name ,可能是排序的意思。
zookeeper.create(handler,"/zkpython_create_node","mydata1",[{"perms":0x1f,"scheme":"world","id":"anyone"}]),0);
这个地方需要详细的解释一下,第一个参数就是我们刚才建立的链接,第二个参数是创建的节点的路径,第三个是创建的节点的数据,第四个是acl(zookeeper中的访问控制列表),第四个是创建的节点的类型(0表示持久化的,1表示持久化+序号,2表示瞬时的,3表示瞬时加序号型的)
好...疑问来了,acl的描述为什么是这样的,首先第一个参数是perms,这个代表了控制这个节点的权限,具体值参考如下:
int READ = 1 << 0;
int WRITE = 1 << 1;
int CREATE = 1 << 2;
int DELETE = 1 << 3;
int ADMIN = 1 << 4;
也就是说,这是一个数字,而我们例子中为什么是1f呢?实际上就是 READ | WRITE | CREATE | DELETE | ADMIN的结果,这下明白是什么意思了吧??好,后面还有两个参数,实际上现在java和c的api中定义的值只有两种,除了例子中的还有一种是
"scheme":"auth","id":""组合的,但是实际上,官方的文档中是有四种的,有兴趣的同学可以参考:
http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html 里的内容
监听器说明:
首先,我们先要定义一个watch方法,比如这里的myWatch方法,之后在调用get方法的时候,把这个watch传递进去就可以了
接下来详细解释下watcher中的各个参数的意思
handler:就是我们创建连接之后的返回值,我试了下,发现好像指的是连接的一个索引值,以0开始
type:事件类型,-1表示没有事件发生,1表示创建节点,2表示节点删除,3表示节点数据被改变,4表示子节点发生变化
state:客户端的状态,0:断开连接状态,3:正常连接的状态,4认证失败,-112:过期啦
path:这个状态就不用解释了,znode的路径
参考资料:http://justfansty.blog.sohu.com/218331818.html
http://justfansty.blog.sohu.com/217953183.html
http://blog.csdn.net/chenyi8888/article/details/6626302
python zookeeper 学习笔记的更多相关文章
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- ZooKeeper 学习笔记
ZooKeeper学习笔记 1. zookeeper基本概念 zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是hadoop和Habase的重要组件,是为分布式应用提供一致性服 ...
- Python Click 学习笔记(转)
原文链接:Python Click 学习笔记 Click 是 Flask 的团队 pallets 开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现.恰好我最近在开发 ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
- Python Flask学习笔记之模板
Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...
- Python Flask学习笔记之Hello World
Python Flask学习笔记之Hello World 安装virtualenv,配置Flask开发环境 virtualenv 虚拟环境是Python解释器的一个私有副本,在这个环境中可以安装私有包 ...
- 获取字段唯一值工具- -ArcPy和Python案例学习笔记
获取字段唯一值工具- -ArcPy和Python案例学习笔记 目的:获取某一字段的唯一值,可以作为工具使用,也可以作为函数调用 联系方式:谢老师,135-4855-4328,xiexiaokui# ...
- Python高级学习笔记
Python高级学习笔记,此笔记中包含Linux操作系统.Html+CSS+JS.网络协议等. 所有思维导图为本人亲手所画,请勿用于商用. 大哥们,求点赞哦. 第一天笔记:链接 第二天笔记:链接 第三 ...
- ZooKeeper学习笔记(二)——内部原理
zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ...
随机推荐
- 文件I/O(不带缓冲)之lseek函数
每个打开的文件都有一个与其相关联的“当前文件偏移量”(current file offset).它通常是一个非负整数,用以度量从文件开始处计算的字节数.通常,读.写操作都从当前文件偏移量处开始,并使偏 ...
- ASP.NET 相同页面前后端之间传值
aspx页面前后端之间传值:前端的html或js获得后端的cs,后端的cs获得前端的js值. 一.前端获得后端的值 1.html元素 前端: <td><%=str%></ ...
- 转--object-C 与lua使用wax交互
[51CTO独家译文]2011年6月的编程语言排行榜Lua语言一军突起,一举进入前十名.这与一年前苹果决定在iOS系统上使用Lua语言密不可分.但是,你了解如何用Lua语言在iOS上开发应用吗?51C ...
- git 版本控制系统初学
Git -The stupid content tracker, 傻瓜内容跟踪器,是一个由Linux内核开发者Linus为了更好地管理Linux内核开发而创立的分布式版本控制软件. 1.建立本地git ...
- 分布式算法(一致性Hash算法)
一.分布式算法 在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法( ...
- 类型转换(CCstring int string char UTF-8互转)
在做数据转换时,最好包含以下头文件 #include <iostream> #include <cmath> #include <string> #include ...
- HTML5 服务器发送事件
单向传输:服务器端——>客户端 作用:传回的能每过3s重新刷新一遍.从而能过跟数据库同步,与ajax配合使用 一.客户端写法 必须的用 message 方法 JSON.parse() ...
- VS 2015 (RC)下Entitiy Framework 升级后CodeFirst命令不能使用
前阵子闲的没事吧自己项目的Entitiy Framework 升级到6.1.3了,然后紧接着问题来了: Join-Path : 无法将参数绑定到参数“Path”,因为该参数是空值. 所在位置 F:\S ...
- zxing.dll生成条码
引入zxing.dll using System; using System.Drawing; using ZXing.QrCode; using ZXing; using ZXing.Common; ...
- 03_线程的创建和启动_实现Runnable接口方式
[线程的创建和启动的步骤(实现Runnable接口方式)] 1.定义Runnable接口的实现类,并重写其中的run方法.run()方法的方法体是线程执行体. class SonThread imp ...