python zookeeper 學習筆記


1.安裝zookeeper

下載zookeeper后,解壓,安裝

cd zookeeper-3.4.5/src/c  
./configure  
make   
make install

2.啟動zookeeper服務

cd zookeeper-3.4.5/conf

mv zoo_sample.cfg zoo.cfg
vim zoo.cfg #修改dataDir=/data/database/zookeeper
mkdir -p /data/database/zookeeper
cd ..
zookeeper-3.4.5-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":4,"scheme":"world","id":"anyone"}],0) '/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"}],0)
'/zk_for_py1'

#獲取節點信息 >>> zookeeper.get(zk,"/zk_for_py1") ('mydata1', {'pzxid': 9L, 'ctime': 1398512377068L, 'aversion': 0, 'mzxid': 9L, 'numChildren': 0, 'ephemeralOwner': 0L, 'version': 0, 'dataLength': 7, 'mtime': 1398512377068L, 'cversion': 0, '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 1, in <module> TypeError: must be string or read-only buffer, not dict >>> zookeeper.set(zk,"/zk_for_py1","hello") 0 >>> zookeeper.get(zk,"/zk_for_py1") ('hello', {'pzxid': 9L, 'ctime': 1398512377068L, 'aversion': 0, 'mzxid': 10L, 'numChildren': 0, 'ephemeralOwner': 0L, 'version': 1, 'dataLength': 5, 'mtime': 1398512533595L, 'cversion': 0, 'czxid': 9L}) >>> zookeeper.delete(zk,"zk_for_py") Traceback (most recent call last): File "<stdin>", line 1, in <module> zookeeper.BadArgumentsException: bad arguments >>> zookeeper.delete(zk,"/zk_for_py") 0 >>> zookeeper.get(zk,"/zk_for_py1") ('hello', {'pzxid': 9L, 'ctime': 1398512377068L, 'aversion': 0, 'mzxid': 10L, 'numChildren': 0, 'ephemeralOwner': 0L, 'version': 1, 'dataLength': 5, 'mtime': 1398512533595L, 'cversion': 0, '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': 0, 'mzxid': 10L, 'numChildren': 0, 'ephemeralOwner': 0L, 'version': 1, 'dataLength': 5, 'mtime': 1398512533595L, 'cversion': 0, '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:
3 3 /zk_for_py1 zk: 3 3 /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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM