文章目錄
- Hadoop框架Zookeeper Java API
- 引入zookeeper依賴
- 測驗連接
- 1、新建連接
- 2、創建臨時節點
- 3、運行測驗
- ZKJavaAPI
- 名詞決議
- 創建永久節點
- 創建臨時節點
- 獲取節點資料
- 修改資料
- 洗掉節點
- 事件
- 完整代碼
Hadoop框架Zookeeper Java API
引入zookeeper依賴
??去Maven官網引入Zookeeper依賴,
??選擇3.4.6版本,復制到IDEA的pom檔案里
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
??新建ZOOKEEPER包
??新建ZKJavaAPI
測驗連接
1、新建連接
??這里需要拋出例外
// 1、新建連接
ZooKeeper zk = new ZooKeeper(
"master:2181,node1:2181,node2:2181"
, 100000
, null
);
2、創建臨時節點
??這里需要拋出例外
zk.create("/test1"
,"abcdefg".getBytes()
, ZooDefs.Ids.OPEN_ACL_UNSAFE
, CreateMode.PERSISTENT
);
3、運行測驗
package com.liangzai.ZOOKEEPER;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import java.io.IOException;
public class ZKJavaAPI {
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
// 1、新建連接
ZooKeeper zk = new ZooKeeper(
"master:2181,node1:2181,node2:2181"
, 100000
, null
);
// 2、創建臨時節點
zk.create("/test1"
,"abcdefg".getBytes()
, ZooDefs.Ids.OPEN_ACL_UNSAFE
, CreateMode.EPHEMERAL
);
}
}
控制臺輸出結果:
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Process finished with exit code 0
- 去ZK里查看運行結果
#啟動ZK
zkCli.sh -server node1:2181
#ZK Shell
ls /
get /test1
運行結果:
注意我這里并沒有zk.close();
因為創建的是臨時節點,斷開了就會被洗掉
這里是運行成功的,
下面我將詳細介紹,
ZKJavaAPI
名詞決議
- ZooDefs.Ids :控制所創建的ZNODE的權限
- OPEN_ACL_UNSAFE :完全開放的ACL,任何連接的客戶端都可以操作該屬性znode
- CREATOR_ALL_ACL :只有創建者才有ACL權限
- READ_ACL_UNSAFE :只能讀取ACL
- CreateMode :創建的ZNODE的型別
- PERSISTENT :永久創建,連接斷開不會洗掉
- EPHEMERAL :創建臨時節點,連接斷開即洗掉
創建永久節點
ZooKeeper zk;
@Before
// 創建連接
public void init() throws IOException {
zk = new ZooKeeper(
"master:2181,node1:2181,node2:2181"
, 100000
, null
);
}
@Test
// 創建永久節點
public void createPersistentZNODE() throws InterruptedException, KeeperException {
/**
* ZooDefs.Ids :控制所創建的ZNODE的權限
* OPEN_ACL_UNSAFE : 完全開放的ACL,任何連接的客戶端都可以操作該屬性znode
* CREATOR_ALL_ACL : 只有創建者才有ACL權限
* READ_ACL_UNSAFE:只能讀取ACL
*
* CreateMode : 創建的ZNODE的型別
* PERSISTENT : 永久創建,連接斷開不會洗掉
* EPHEMERAL : 創建臨時節點,連接斷開即洗掉
*/
zk.create(
"/test3"
, "def".getBytes()
, ZooDefs.Ids.OPEN_ACL_UNSAFE
, CreateMode.PERSISTENT
);
}
@After
// 關閉連接
public void closed() throws InterruptedException {
zk.close();
}
ls /
get /test3
運行結果:
可見@After注解關閉了ZK連接
test3被創建了
PERSISTENT :永久創建,連接斷開不會洗掉
創建臨時節點
ZooKeeper zk;
@Before
// 創建連接
public void init() throws IOException {
zk = new ZooKeeper(
"master:2181,node1:2181,node2:2181"
, 100000
, null
);
}
@Test
// 創建臨時節點
public void createEPHEMERALZNODE() throws InterruptedException, KeeperException {
zk.create(
"/test2"
, "abc".getBytes()
, ZooDefs.Ids.OPEN_ACL_UNSAFE
, CreateMode.EPHEMERAL
);
}
@After
// 關閉連接
public void closed() throws InterruptedException {
zk.close();
}
ls /
運行結果:
可見后面@After注解里將ZK連接關閉了
EPHEMERAL : 創建臨時節點,連接斷開即洗掉
所以test2并沒有被創建
獲取節點資料
ZooKeeper zk;
@Before
// 創建連接
public void init() throws IOException {
zk = new ZooKeeper(
"master:2181,node1:2181,node2:2181"
, 100000
, null
);
}
@Test
// 獲取節點資料
public void getZNODE() throws InterruptedException, KeeperException {
byte[] data = zk.getData("/test1", null, new Stat());
// 位元組陣列轉String,這里toString沒有意義
System.out.println(new String(data));
}
@After
// 關閉連接
public void closed() throws InterruptedException {
zk.close();
}
get /test1
運行結果:
這里的watcher就是我們NameNode的故障轉移機制
修改資料
ZooKeeper zk;
@Before
// 創建連接
public void init() throws IOException {
zk = new ZooKeeper(
"master:2181,node1:2181,node2:2181"
, 100000
, null
);
}
@Test
// 修改資料
public void setZNODE() throws InterruptedException, KeeperException {
zk.setData("/test1","liangzai".getBytes(),1);
}
@After
// 關閉連接
public void closed() throws InterruptedException {
zk.close();
}
get /test1
運行結果:
剛剛我們test1里面的資料是bacdef
運行后改成了liangzai
洗掉節點
ZooKeeper zk;
@Before
// 創建連接
public void init() throws IOException {
zk = new ZooKeeper(
"master:2181,node1:2181,node2:2181"
, 100000
, null
);
}
@Test
// 洗掉節點
public void deleteZNODE() throws InterruptedException, KeeperException {
zk.delete("/test3", 0);
}
@After
// 關閉連接
public void closed() throws InterruptedException {
zk.close();
}
ls /
運行結果:
這里通過ls / 查看后
test3被洗掉了
事件
ZooKeeper zk;
@Before
// 創建連接
public void init() throws IOException {
zk = new ZooKeeper(
"master:2181,node1:2181,node2:2181"
, 100000
, null
);
}
@Test
// 事件
public void triggerWatcher() throws InterruptedException, KeeperException {
zk.exists("/test", new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("/test 發生了變化");
System.out.println(event.getPath());
System.out.println(event.getState());
System.out.println(event.getType());
System.out.println(event.getWrapper());
}
});
@After
// 關閉連接
public void closed() throws InterruptedException {
zk.close();
}
set /test node1
運行結果:
/test 發生了變化
/test
SyncConnected
NodeDataChanged
3,3,'/test
事件方便我們去監控NameNode的故障轉移機制
完整代碼
package com.liangzai.ZOOKEEPER;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
public class ZKJavaAPI {
ZooKeeper zk;
@Before
// 創建連接
public void init() throws IOException {
zk = new ZooKeeper(
"master:2181,node1:2181,node2:2181"
, 100000
, null
);
}
@Test
// 創建臨時節點
public void createEPHEMERALZNODE() throws InterruptedException, KeeperException {
zk.create(
"/test2"
, "abc".getBytes()
, ZooDefs.Ids.OPEN_ACL_UNSAFE
, CreateMode.EPHEMERAL
);
}
@Test
// 創建永久節點
public void createPersistentZNODE() throws InterruptedException, KeeperException {
/**
* ZooDefs.Ids :控制所創建的ZNODE的權限
* OPEN_ACL_UNSAFE : 完全開放的ACL,任何連接的客戶端都可以操作該屬性znode
* CREATOR_ALL_ACL : 只有創建者才有ACL權限
* READ_ACL_UNSAFE:只能讀取ACL
*
* CreateMode : 創建的ZNODE的型別
* PERSISTENT : 永久創建,連接斷開不會洗掉
* EPHEMERAL : 創建臨時節點,連接斷開即洗掉
*/
zk.create(
"/test3"
, "def".getBytes()
, ZooDefs.Ids.OPEN_ACL_UNSAFE
, CreateMode.PERSISTENT
);
}
@Test
// 獲取節點資料
public void getZNODE() throws InterruptedException, KeeperException {
byte[] data = zk.getData("/test1", null, new Stat());
// 位元組陣列轉String,這里toString沒有意義
System.out.println(new String(data));
}
@Test
// 修改資料
public void setZNODE() throws InterruptedException, KeeperException {
zk.setData("/test1", "liangzai".getBytes(), 1);
}
@Test
// 洗掉節點
public void deleteZNODE() throws InterruptedException, KeeperException {
zk.delete("/test3", 0);
}
@Test
// 事件
public void triggerWatcher() throws InterruptedException, KeeperException {
zk.exists("/test", new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("/test 發生了變化");
System.out.println(event.getPath());
System.out.println(event.getState());
System.out.println(event.getType());
System.out.println(event.getWrapper());
}
});
// 加入死回圈,不會被退出 方便在控制臺輸出
while (true) {
}
}
@After
// 關閉連接
public void closed() throws InterruptedException {
zk.close();
}
}
到底啦!覺得靚仔的文章對你學習Hadoop有所幫助的話,一波三連吧!q(≧▽≦q)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423763.html
標籤:其他
