Curatorの基本操作


文書ディレクトリ

  • 1.Curatorコンセプト
  • 2.API
  • 1.pomファイル
  • 2.基本api
  • 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

  • testでユニットテスト
  • を行う
    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);
            }
        }
    }