成功最有效的方法就是向有经验的人学习!

Hadoop笔记整理(三):Zookeeper

为了方便知识的管理,把zk归到hadoop知识中来进行整理。

zookeeper基础知识

zookeeper概述

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,
    是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:
    配置维护、域名服务、分布式同步、组服务等。
    一言以蔽之,ZooKeeper是分布式系统中的协调系统。
    有如下特点:
    简单
       ZooKeeper的核心是一个精简的文件系统,它支持一些简单的操作和一些抽象操作,例如,排序和通知。
    丰富
        ZooKeeper的操作是很丰富的,可实现一些协调数据结构和协议。例如,分布式队列、分布式锁和一组同级别节点中的“领导者选举”。
    高可靠
        ZooKeeper支持集群模式,可以很容易的解决单点故障问题。
    松耦合交互
       不同进程间的交互不需要了解彼此,甚至可以不必同时存在,某进程在ZooKeeper中留下消息后,该进程结束后其它进程还可以读这条消息。
    资源库
       ZooKeeper实现了一个关于通用协调模式的开源共享存储库,能使开发者免于编写这类通用协议。

zookeeper的角色

    领导者(leader):负责进行投票的发起和决议,更新系统状态。
    学习者(learner):包括跟随者(follower)和观察者(observer)
        follower:用于接受客户端请求并向客户端返回结果,在选举过程中参与投票。
        Observer:可以接受客户端连接,将写请求转发给leader,但observer不参与投票过程,只同步leader的状态,observer的
        目的是为了扩展系统,提高读取速度。
    客户端(client):请求发起方。

zookeeper的数据模型

    层次化的目录结构,命名符合常规文件系统规范
    每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
    节点znode可以包含数据和子节点,但是EPHEMERAL类型的节点不能有子节点
    znode中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据就需要带上版本
    客户端应用可以在节点上设置监视器
    节点不支持部分读写,而是一次性完整读写

zookeeper的节点类型

        ZooKeeper节点znode有两种类型,临时节点(ephemeral)和持久节(persistent)。znode的类型在创建时确定并且之后不能再修改。
    ephemeral节点在客户端会话结束时,将会被zookeeper删除,并且ephemeral节点不可以有子节点。
    persistent节点不依赖与客户端会话,只有当客户端明确要删除该persistent节点时才会被删除。
        目前znode有四种形式的目录节点,PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMERAL、EPHEMERAL_SEQUENTIAL
    znode可以是临时节点,一旦创建这个znode的客户端与服务器失去联系,这个znode也将自动删除,
    ZooKeeper的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,
    这个连接状态称之为session,如果znode是临时节点,这个seesion失效,znode也就删除了;
    持久化目录节点,这个目录节点存储的数据不会丢失;顺序自动编号的目录节点,
    这种目录节点会更具当前已经存放在的节点数自动加1,然后返回给客户端已经成功创建的目录节点名;
    临时目录节点,一旦创建这个节点的客户端和服务器端口也就是session超时,这种节点会被自动删除。33

zookeeper的安装与操作

    约定:安装在/opt目录下面
    http://zookeeper.apache.org/releases.html
    单节点安装
        解压:
            tar -zxvf /opt/soft/zookeeper-3.4.6.jar -C /opt/
        重命名:
            mv  /opt/soft/zookeeper-3.4.6  /opt/soft/zookeeper
        添加到环境变量中
            vim /etc/profile.d/hadoop-eco.sh,添加一下内容:
                export ZOOKEEPER_HOME=/opt/zookeeper
                export PATH=$PATH:$ZOOKEEPER_HOME/bin
            让配置生效
            source /etc/profile.d/hadoop-eco.sh
        配置zookeeper
            $ZOOKEEPER_HOME/conf
                cp zoo_sample.cfg zoo.cfg
            vim zoo.cfg
            只需要修改一个地方
                dataDir=/opt/zookeeper/data
            在$ZOOOKEEPER创建一个目录data即可
        启动:
            $ZOOKEEPER_HOME/bin/zkServer.sh start
        关于zk的日志文件存储
            修改$ZOOKEEPER_HOME/bin/zkServer.sh,94行添加
            ZOO_LOG_DIR=$ZOOKEEPER_HOME/log
        客户端连接:
            $ZOOKEEPER_HOME/bin/zkCli.sh
        基本的命令行操作:
            [zk: localhost:2181(CONNECTED) 10] help
            ZooKeeper -server host:port cmd args
                stat path [watch]
                set path data [version]
                ls path [watch]
                delquota [-n|-b] path
                ls2 path [watch]
                setAcl path acl
                setquota -n|-b val path
                history 
                redo cmdno
                printwatches on|off
                delete path [version]
                sync path
                listquota path
                rmr path
                get path [watch]
                create [-s] [-e] path data acl
                addauth scheme auth
                quit 
                getAcl path
                close 
                connect host:port
    Java API的方式来访问ZooKeeper
                // 创建一个目录节点
        String path = "/zk";
        byte data[] = "this is my first zk node".getBytes();
//        String ret = zooKeeper.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
//        System.out.println("创建临时节点返回值:" + ret);
        String zk = zooKeeper.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("创建持久节点返回值:" + zk);
        // 创建一个子目录节点
        path = "/zk/childone";
        data = "child one node".getBytes();
        zooKeeper.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        // 取出子目录节点列表
        List<String> cList = zooKeeper.getChildren("/zk", true);
        for (String child : cList) {
            System.out.println(child);
        }
        // 修改子目录节点数据
        data = "child one node last information".getBytes();
        zooKeeper.setData(path, data, -1);
        // 创建另外一个子目录节点
        path = "/zk/childtwo";
        data = "child two node".getBytes();
        zooKeeper.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        List<String> cList = zooKeeper.getChildren("/zk", true);
        for (String child : cList) {
            System.out.println(child);
        }
        // 删除子目录节点
        zooKeeper.delete("/zk/childtwo", -1);
        zooKeeper.delete("/zk/childone", -1);
        // 删除父目录节点
        /**
         * 这里没有提供一个递归删除的API
         */
        zooKeeper.delete("/zk", -1);        
    分布式安装
        uplooking01 zk
        uplooking02 zk
        uplooking03 zk
        解压:
            tar -zxvf /opt/soft/zookeeper-3.4.6.tar.gz -C /opt/
        重命名:
            mv  /opt/soft/zookeeper-3.4.6  /opt/soft/zookeeper
        添加到环境变量中
            vim /etc/profile.d/hadoop-etc.sh,添加一下内容:
                export ZOOKEEPER_HOME=/opt/zookeeper
                export PATH=$PATH:$ZOOKEEPER_HOME/bin
                export ZOO_LOG_DIR=/opt/zookeeper/logs  ##zookeeper的日志目录
            让配置生效
            source /etc/profile.d/hadoop-eco.sh
        配置zookeeper
            $ZOOOKEEPER/conf
                cp zoo_sample.cfg zoo.cfg
            vim zoo.cfg
                dataDir=/opt/zookeeper/data
                在$ZOOOKEEPER创建一个目录data即可
                添加集群中的三台机器
                    server.100=uplooking01:2888:3888
                    server.101=uplooking02:2888:3888
                    server.102=uplooking03:2888:3888                
                端口
                    2181--->zookeeper服务器开放给client连接的端口
                    2888--->zookeeper服务器之间进行通信的端口
                    3888--->zookeeper和外部进程进行通信的端口
        拷贝zookeeper安装目录和环境变量文件到其它两台机器上
            scp -r /opt/zookeeper root@uplooking02:/opt/
            scp -r /opt/zookeeper root@uplooking03:/opt/
            scp /etc/profile.d/hadoop-eco.sh root@uplooking02:/etc/profile.d/
            scp /etc/profile.d/hadoop-eco.sh root@uplooking03:/etc/profile.d/
        启动:
            到每一台机器上执行脚本zkServer.sh start
            查看zk的角色:zkServer.sh status
            其中有一台是leader,另外两台是follower
        为了保障zookeeper在为其它进程服务的时候,能够做出决策,进行投票,有结果,所以需要配置
        zookeeper机器的个数,一般都要是2N+1(N是正整数)
赞(0) 打赏
未经允许不得转载:陈桂林博客 » Hadoop笔记整理(三):Zookeeper
分享到

大佬们的评论 抢沙发

全新“一站式”建站,高质量、高售后的一条龙服务

微信 抖音 支付宝 百度 头条 快手全平台打通信息流

橙子建站.极速智能建站8折购买虚拟主机

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册