Zookeeper-api
Zookeeper-API
ZooKeeperには、JavaとCの公式APIバインディングがあります。 ZooKeeperコミュニティは、ほとんどの言語(.NET、pythonなど)に非公式のAPIを提供しています。 ZooKeeper APIを使用すると、アプリケーションは、ZooKeeperアンサンブルとの接続、対話、データの操作、調整、および最終的な切断を行うことができます。
ZooKeeper APIには、ZooKeeperアンサンブルのすべての機能をシンプルかつ安全な方法で取得するための豊富な機能セットがあります。 ZooKeeper APIは、同期メソッドと非同期メソッドの両方を提供します。
ZooKeeperアンサンブルとZooKeeper APIは、あらゆる面でお互いを完全に補完し、開発者に大きなメリットをもたらします。 この章では、Javaバインディングについて説明します。
ZooKeeper APIの基本
ZooKeeperアンサンブルと対話するアプリケーションは、 ZooKeeper Client または単に Client と呼ばれます。
ZnodeはZooKeeperアンサンブルのコアコンポーネントであり、ZooKeeper APIはZooKeeperアンサンブルでznodeのすべての詳細を操作するためのメソッドの小さなセットを提供します。
クライアントは、以下に示す手順に従って、ZooKeeperアンサンブルと明確かつクリーンな対話を行う必要があります。
- ZooKeeperアンサンブルに接続します。 ZooKeeperアンサンブルは、クライアントにセッションIDを割り当てます。
- サーバーにハートビートを定期的に送信します。 そうでない場合、ZooKeeperアンサンブルはセッションIDを失効させ、クライアントは再接続する必要があります。
- セッションIDがアクティブである限り、znodeを取得/設定します。
- すべてのタスクが完了したら、ZooKeeperアンサンブルから切断します。 クライアントが長時間アクティブでない場合、ZooKeeperアンサンブルは自動的にクライアントを切断します。
Javaバインディング
この章で、ZooKeeper APIの最も重要なセットを理解しましょう。 ZooKeeper APIの中心部分は* ZooKeeperクラス*です。 ZooKeeperアンサンブルをコンストラクターで接続するオプションを提供し、次のメソッドがあります-
- connect -ZooKeeperアンサンブルに接続します
- create -znodeを作成します
- exists -znodeが存在するかどうかとその情報を確認します
- getData -特定のznodeからデータを取得する
- setData -特定のznodeにデータを設定します
- getChildren -特定のznodeで利用可能なすべてのサブノードを取得します
- delete -特定のznodeとそのすべての子を取得します
- close -接続を閉じる
ZooKeeper Ensembleに接続する
ZooKeeperクラスは、コンストラクターを介して接続機能を提供します。 コンストラクタの署名は次のとおりです-
ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)
どこで、
- connectionString -ZooKeeperアンサンブルホスト。
- sessionTimeout -ミリ秒単位のセッションタイムアウト。
- watcher -「Watcher」インターフェースを実装するオブジェクト。 ZooKeeperアンサンブルは、ウォッチャーオブジェクトを介して接続ステータスを返します。
新しいヘルパークラス ZooKeeperConnection を作成し、メソッド connect を追加しましょう。 connect メソッドは、ZooKeeperオブジェクトを作成し、ZooKeeperアンサンブルに接続して、オブジェクトを返します。
ここで、 CountDownLatch は、クライアントがZooKeeperアンサンブルに接続するまでメインプロセスを停止(待機)するために使用されます。
ZooKeeperアンサンブルは、* Watcherコールバック*を介して接続ステータスを返信します。 クライアントがZooKeeperアンサンブルに接続すると、Watcherコールバックが呼び出され、Watcherコールバックは、 CountDownLatch の countDown メソッドを呼び出して、メインプロセスでロック、 await を解放します。
ZooKeeperアンサンブルに接続するための完全なコードは次のとおりです。
コーディング:ZooKeeperConnection.java
//import java classes
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
//import zookeeper classes
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.AsyncCallback.StatCallback;
import org.apache.zookeeper.KeeperException.Code;
import org.apache.zookeeper.data.Stat;
public class ZooKeeperConnection {
//declare zookeeper instance to access ZooKeeper ensemble
private ZooKeeper zoo;
final CountDownLatch connectedSignal = new CountDownLatch(1);
//Method to connect zookeeper ensemble.
public ZooKeeper connect(String host) throws IOException,InterruptedException {
zoo = new ZooKeeper(host,5000,new Watcher() {
public void process(WatchedEvent we) {
if (we.getState() == KeeperState.SyncConnected) {
connectedSignal.countDown();
}
}
});
connectedSignal.await();
return zoo;
}
//Method to disconnect from zookeeper server
public void close() throws InterruptedException {
zoo.close();
}
}
上記のコードを保存すると、次のセクションでZooKeeperアンサンブルを接続するために使用されます。
Znodeを作成する
ZooKeeperクラスは、ZooKeeperアンサンブルに新しいznodeを作成する* createメソッド*を提供します。 *作成*メソッドの署名は次のとおりです-
create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
どこで、
- path -Znodeパス。 たとえば、/myapp1、/myapp2、/myapp1/mydata1、myapp2/mydata1/myanothersubdata
- data -指定されたznodeパスに保存するデータ
- acl -作成されるノードのアクセス制御リスト。 ZooKeeper APIは、基本的なACLリストの一部を取得するための静的インターフェイス ZooDefs.Ids を提供します。 たとえば、ZooDefs.Ids.OPEN_ACL_UNSAFEは、開いているznodeのaclのリストを返します。
- createMode -一時的、シーケンシャル、またはその両方のノードのタイプ。 これは enum です。
ZooKeeper APIの*作成*機能を確認するために、新しいJavaアプリケーションを作成しましょう。 ファイル ZKCreate.java を作成します。 mainメソッドで、タイプ ZooKeeperConnection のオブジェクトを作成し、 connect メソッドを呼び出してZooKeeperアンサンブルに接続します。
connectメソッドは、ZooKeeperオブジェクト zk を返します。 次に、カスタム path および data を使用して zk オブジェクトの create メソッドを呼び出します。
znodeを作成するための完全なプログラムコードは次のとおりです-
コーディング:ZKCreate.java
import java.io.IOException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
public class ZKCreate {
//create static instance for zookeeper class.
private static ZooKeeper zk;
//create static instance for ZooKeeperConnection class.
private static ZooKeeperConnection conn;
//Method to create znode in zookeeper ensemble
public static void create(String path, byte[] data) throws
KeeperException,InterruptedException {
zk.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
}
public static void main(String[] args) {
//znode path
String path = "/MyFirstZnode";//Assign path to znode
//data in byte array
byte[] data = "My first zookeeper app”.getBytes();//Declare data
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
create(path, data);//Create the data to the specified path
conn.close();
} catch (Exception e) {
System.out.println(e.getMessage());//Catch error message
}
}
}
アプリケーションがコンパイルおよび実行されると、指定されたデータを持つznodeがZooKeeperアンサンブルに作成されます。 ZooKeeper CLI zkCli.sh を使用して確認できます。
cd/path/to/zookeeper
bin/zkCli.sh
>>> get/MyFirstZnode
存在する-Znodeの存在を確認する
ZooKeeperクラスは、znodeの存在を確認する* existsメソッド*を提供します。 指定されたznodeが存在する場合、znodeのメタデータを返します。 *存在する*メソッドの署名は次のとおりです-
exists(String path, boolean watcher)
どこで、
- path -Znodeパス
- watcher -指定されたznodeを監視するかどうかを指定するブール値
ZooKeeper APIの「存在する」機能を確認する新しいJavaアプリケーションを作成しましょう。 ファイル_“ ZKExists.java” を作成します。 メインメソッドで、“ ZooKeeperConnection” オブジェクトを使用してZooKeeperオブジェクト“ zk” を作成します。 次に、カスタム“パス” で“ zk” オブジェクトの“ exists” _メソッドを呼び出します。 完全なリストは次のとおりです-
コーディング:ZKExists.java
import java.io.IOException;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;
public class ZKExists {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
//Method to check existence of znode and its status, if znode is available.
public static Stat znode_exists(String path) throws
KeeperException,InterruptedException {
return zk.exists(path, true);
}
public static void main(String[] args) throws InterruptedException,KeeperException {
String path = "/MyFirstZnode";//Assign znode to the specified path
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
Stat stat = znode_exists(path);//Stat checks the path of the znode
if(stat != null) {
System.out.println("Node exists and the node version is " +
stat.getVersion());
} else {
System.out.println("Node does not exists");
}
} catch(Exception e) {
System.out.println(e.getMessage());//Catches error messages
}
}
}
アプリケーションをコンパイルして実行すると、次の出力が得られます。
Node exists and the node version is 1.
getDataメソッド
ZooKeeperクラスは、指定されたznodeに添付されたデータとそのステータスを取得する getData メソッドを提供します。 getData メソッドのシグネチャは次のとおりです-
getData(String path, Watcher watcher, Stat stat)
どこで、
- path -Znodeパス。
- watcher -タイプ Watcher のコールバック関数。 ZooKeeperアンサンブルは、指定されたznodeのデータが変更されると、Watcherコールバックを介して通知します。 これは1回限りの通知です。
- stat -znodeのメタデータを返します。
ZooKeeper APIの getData 機能を理解するために、新しいJavaアプリケーションを作成しましょう。 ファイル ZKGetData.java を作成します。 mainメソッドで、 ZooKeeperConnection オブジェクトを使用してZooKeeperオブジェクト zk を作成します。 次に、カスタムパスを使用してzkオブジェクトの getData メソッドを呼び出します。
指定されたノードからデータを取得するための完全なプログラムコードは次のとおりです-
コーディング:ZKGetData.java
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;
public class ZKGetData {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
public static Stat znode_exists(String path) throws
KeeperException,InterruptedException {
return zk.exists(path,true);
}
public static void main(String[] args) throws InterruptedException, KeeperException {
String path = "/MyFirstZnode";
final CountDownLatch connectedSignal = new CountDownLatch(1);
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
Stat stat = znode_exists(path);
if(stat != null) {
byte[] b = zk.getData(path, new Watcher() {
public void process(WatchedEvent we) {
if (we.getType() == Event.EventType.None) {
switch(we.getState()) {
case Expired:
connectedSignal.countDown();
break;
}
} else {
String path = "/MyFirstZnode";
try {
byte[] bn = zk.getData(path,
false, null);
String data = new String(bn,
"UTF-8");
System.out.println(data);
connectedSignal.countDown();
} catch(Exception ex) {
System.out.println(ex.getMessage());
}
}
}
}, null);
String data = new String(b, "UTF-8");
System.out.println(data);
connectedSignal.await();
} else {
System.out.println("Node does not exists");
}
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
アプリケーションをコンパイルして実行すると、次の出力が得られます
My first zookeeper app
そして、アプリケーションは、ZooKeeperアンサンブルからのさらなる通知を待ちます。 ZooKeeper CLI zkCli.sh を使用して、指定したznodeのデータを変更します。
cd/path/to/zookeeper
bin/zkCli.sh
>>> set/MyFirstZnode Hello
これで、アプリケーションは次の出力を出力して終了します。
Hello
setDataメソッド
ZooKeeperクラスは、指定されたznodeに添付されたデータを変更するための setData メソッドを提供します。 setData メソッドのシグネチャは次のとおりです-
setData(String path, byte[] data, int version)
どこで、
- path -Znodeパス
- data -指定されたznodeパスに保存するデータ。
- version -znodeの現在のバージョン。 ZooKeeperは、データが変更されるたびにznodeのバージョン番号を更新します。
ZooKeeper APIの setData 機能を理解するために、新しいJavaアプリケーションを作成しましょう。 ファイル ZKSetData.java を作成します。 mainメソッドで、 ZooKeeperConnection オブジェクトを使用してZooKeeperオブジェクト zk を作成します。 次に、指定されたパス、新しいデータ、ノードのバージョンを使用して、 zk オブジェクトの setData メソッドを呼び出します。
以下は、指定されたznodeに添付されたデータを変更するための完全なプログラムコードです。
コード:ZKSetData.java
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import java.io.IOException;
public class ZKSetData {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
//Method to update the data in a znode. Similar to getData but without watcher.
public static void update(String path, byte[] data) throws
KeeperException,InterruptedException {
zk.setData(path, data, zk.exists(path,true).getVersion());
}
public static void main(String[] args) throws InterruptedException,KeeperException {
String path= "/MyFirstZnode";
byte[] data = "Success".getBytes();//Assign data which is to be updated.
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
update(path, data);//Update znode data to the specified path
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
アプリケーションをコンパイルして実行すると、指定したznodeのデータが変更され、ZooKeeper CLIの zkCli.sh を使用して確認できます。
cd/path/to/zookeeper
bin/zkCli.sh
>>> get/MyFirstZnode
getChildrenメソッド
ZooKeeperクラスは、特定のznodeのすべてのサブノードを取得する getChildren メソッドを提供します。 getChildren メソッドのシグネチャは次のとおりです-
getChildren(String path, Watcher watcher)
どこで、
- path -Znodeパス。
- watcher -タイプ「Watcher」のコールバック関数。 ZooKeeperアンサンブルは、指定されたznodeが削除されるか、znodeの下の子が作成/削除されると通知します。 これは1回限りの通知です。
コーディング:ZKGetChildren.java
import java.io.IOException;
import java.util.*;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;
public class ZKGetChildren {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
//Method to check existence of znode and its status, if znode is available.
public static Stat znode_exists(String path) throws
KeeperException,InterruptedException {
return zk.exists(path,true);
}
public static void main(String[] args) throws InterruptedException,KeeperException {
String path = "/MyFirstZnode";//Assign path to the znode
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
Stat stat = znode_exists(path);//Stat checks the path
if(stat!= null) {
//“getChildren” method- get all the children of znode.It has two
args, path and watch
List <String> children = zk.getChildren(path, false);
for(int i = 0; i < children.size(); i++)
System.out.println(children.get(i));//Print children's
} else {
System.out.println("Node does not exists");
}
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
プログラムを実行する前に、ZooKeeper CLI zkCli.sh を使用して、 /MyFirstZnode の2つのサブノードを作成します。
cd/path/to/zookeeper
bin/zkCli.sh
>>> create/MyFirstZnode/myfirstsubnode Hi
>>> create/MyFirstZnode/mysecondsubmode Hi
これで、プログラムをコンパイルして実行すると、上記で作成したznodeが出力されます。
myfirstsubnode
mysecondsubnode
Znodeを削除する
ZooKeeperクラスは、指定されたznodeを削除する delete メソッドを提供します。 *削除*メソッドの署名は次のとおりです-
delete(String path, int version)
どこで、
- path -Znodeパス。
- version -znodeの現在のバージョン。
ZooKeeper APIの*削除*機能を理解するために、新しいJavaアプリケーションを作成しましょう。 ファイル ZKDelete.java を作成します。 mainメソッドで、 ZooKeeperConnection オブジェクトを使用してZooKeeperオブジェクト zk を作成します。 次に、指定された path とノードのバージョンで zk オブジェクトの delete メソッドを呼び出します。
znodeを削除するための完全なプログラムコードは次のとおりです-
コーディング:ZKDelete.java
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
public class ZKDelete {
private static ZooKeeper zk;
private static ZooKeeperConnection conn;
//Method to check existence of znode and its status, if znode is available.
public static void delete(String path) throws KeeperException,InterruptedException {
zk.delete(path,zk.exists(path,true).getVersion());
}
public static void main(String[] args) throws InterruptedException,KeeperException {
String path = "/MyFirstZnode";//Assign path to the znode
try {
conn = new ZooKeeperConnection();
zk = conn.connect("localhost");
delete(path);//delete the node with the specified path
} catch(Exception e) {
System.out.println(e.getMessage());//catches error messages
}
}
}