Curatorの基本操作
24964 ワード
文書ディレクトリ
1.curatorコンセプト
zookeeperオリジナルAPIは、ノードの再帰的な作成や削除ができない、Watcherが一度しか使用できない、分散アプリケーションの問題を解決できるapi(分散ロック、leader選挙など)がたくさんあると言わざるを得ないが、ZooKeeperが提供するオリジナルAPIは使いにくいため、その上でいくつかの高度なアプリケーションをカプセル化するのは複雑なことだ.
この時、Curatorが現れ、CuratorはNetflix社がオープンソースのZookeeperクライアントであり、Apacheに寄付され、CuratorフレームワークはzookeeeperのオリジナルAPIインタフェースにパッケージされ、多くのZooKeeperクライアントの非常に下位層の詳細な開発を解決した.ZooKeeperの各種応用シーン(recipe、例えば:分散ロックサービス、クラスタリーダー選挙、共有カウンタ、キャッシュメカニズム、分散キューなど)の抽象パッケージを提供し、FluentスタイルのAPIインタフェースを実現し、最も使いやすく、最も流行しているzookeeperのクライアントである.
2.API
1.pomファイル
<dependencies>
<!--hadoop -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.5-cdh5.15.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
2.基本api
package com.ruozedata.bigdata.zk;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
public class CuratorApp {
final static private String connectString = "ruozedata000:2181";
private static Logger logger = LoggerFactory.getLogger(CuratorApp.class);
ExponentialBackoffRetry retryPolicy;
CuratorFramework curatorFramework;
@Before
public void setUp() {
retryPolicy = new ExponentialBackoffRetry(100, 3); //
curatorFramework = CuratorFrameworkFactory.newClient(connectString, retryPolicy);
curatorFramework.start();
}
//
@Test
public void createPNode() {
String path = "/ruoze/aaa/b/e";
try {
curatorFramework.create()
.creatingParentsIfNeeded() // , ,
.withMode(CreateMode.PERSISTENT) // ,
.withACL(ZooDefs.Ids.OPEN_ACL_UNSAFE) // ACL, API
.forPath(path, "abc".getBytes());
System.out.println("creating persistent node succeed: " + path);
} catch (Exception e) {
logger.error("creating persistent node failed: {}", path);
}
}
//
@Test
public void createENode() {
String path = "/ruoze/d/b/c";
try {
curatorFramework.create()
.creatingParentsIfNeeded()
.withMode(CreateMode.EPHEMERAL)
.withACL(ZooDefs.Ids.OPEN_ACL_UNSAFE)
.forPath(path, "dbc".getBytes());
System.out.println("creating EPHEMERAL node succeed: " + path);
} catch (Exception e) {
logger.error("creating EPHEMERAL node failed: {}", path);
}
}
//
@Test
public void getData() {
String path = "/ruoze/aaa/b/e";
Stat nodeStat = new Stat();
try {
byte[] bytes = curatorFramework.getData()
.storingStatIn(nodeStat)
.forPath(path);
System.out.println("Getting the info for node:" + new String(bytes));
} catch (Exception e) {
logger.error("Failing to get the info for node: {}", path);
}
}
//
@Test
public void isExist() throws Exception {
String path = "/ruoze/aaa/b/e/e";
Stat stat = curatorFramework.checkExists()
.forPath(path);
if (stat != null) {
logger.warn("node exists");
} else {
logger.warn("node does not exist");
}
}
//
@Test
public void deleteNode() {
String path = "/ruoze/aaa/b/e";
try {
curatorFramework.delete()
.deletingChildrenIfNeeded()
.forPath(path);
System.out.println("Succeed to delete the node");
} catch (Exception e) {
logger.error("Failing to delete the node: {}", path);
}
}
//
@Test
public void childPath() throws Exception {
String path = "/ruoze1";
List<String> children = curatorFramework.getChildren()
.forPath(path);
for(String child:children){
logger.warn(child);
}
}
}