大数据笔记--Zookeeper(第二篇)

目录

一、Zookeeper

1、概述

2、安装

3、伪分布式安装

4、特点

5、命令

6、节点信息

7、节点类型

8、zookeeper-API

i、普通API无观察者

 ii、观察者API

二、完全分布式安装

1、三台服务器准备

2、安装Zookeeper

3、完成效果


一、Zookeeper

大数据笔记--Zookeeper(第二篇)_第1张图片

1、概述

①、Zookeeper是Yahoo(雅虎)开发后来贡献给了Apache的一套用于分布式管理和协调的框架

②、Zookeeper本身仿照Google的《The Chubby Lock》设计实现的

③、Zookeeper提供了中心化的服务:包括:统一的配置,统一的命名,提供分布式锁,以及提供组服务

2、安装

①、单机模式:在一台机器上安装框架,往往只能启动框架的部分功能

②、伪分布式:也是在一台机器上安装框架,利用了多线程来模拟集群环境,能够启动框架的大部分功能,甚至全部功能

③、完全分布式:在集群(多台服务器)进行安装框架,能够启动框架的全部功能

3、伪分布式安装

①、关闭的防火墙

        临时关闭防火墙:systemctl stop firewalld

        永久关闭防火墙:systemctl disable firewalld

②、下载安装JDK

        wget http://bj-yzjd.ufile.cn-north-02.ucloud.cn/jdk-8u181-linux-x64.tar.gz

        修改jdk的环境变量

③、下载或者上传Zookeeper的安装包

        wget http://bj-yzjd.ufile.cn-north-02.ucloud.cn/apache-zookeeper-3.5.7-bin.tar.gz

④、解压Zookeeper的安装包:tar -xvf zookeeper-3.5.7

       进入Zookeeper的安装目录下的子目录conf目录中:cd zookeeper-3.5.7/conf

        将conf目录下的zoo_sample.cfg文件复制为zoo.cfg。

        Zookeeper在启动的时候会自动寻找zoo.cfg,根据其中的配置来启动服务:

        cp zoo_sample.cfg zoo.cfg

⑤、编辑zoo.cfg文件:vim zoo.cfg

        修改其中的属性dataDir,指定数据的存储目录:dataDir=/home/software/zookeeper-            3.5.7/tmp

        保存并且关闭zoo.cfg

⑥、进入Zookeeper的安装目录下的子目录bin目录中:cd ../bin

⑦、执行zkServer.sh文件,来启动Zookeeper服务器端:sh zkServer.sh start

        查看启动成功 ./zkServer.sh status   出现 standalone

       执行zkCli.sh文件,来启动进入Zookeeper客户端:sh zkCli.sh

4、特点

①、zookeeper底层是一个树状结构,根节点是/

②、zookeeper 中每一个节点称为Znode节点,因此这棵树称为Znode树

③、zookeeper自带一个子节点/zookeeper

④、zookeeper在创建节点的时候可以携带数据,也可以不携带,(早版本的zookeeper在创建节点的时候必须携带数据),数据可以是对节点的描述或者是配置信息。

⑤、在zookeeper中不存在相对路径,所有路径都必须从根节点出发。

⑥、Zookeeper会将携带的数据存储在内存以及磁盘中

⑦、Zookeeper中数据的存储位置由dataDir属性决定,如果不指定默认在/tmp

⑧、在Zookeeper中会将每一个写操作(创建,修改,删除)看成一个事务,并且会给这个事务分配一个全局递增的事务id,这个编号就是Zxid

⑨、临时节点不能挂载子节点-持久节点可以挂载子节点

⑩、在zookeeper中不能存在同名节点

大数据笔记--Zookeeper(第二篇)_第2张图片

5、命令

命令 解释
ls / 查看根节点的子节点
create /video 创建节点
delete /boot 删除节点
rmr /video 递归删除节点
get /aaa 获取节点数据
set /aaa 修改节点数据
create -e /video 创建临时节点video
create -s /txt 表示创建的是持久顺序节点
create -e -s /txt

表示创建一个临时顺序节点

6、节点信息

        cZxid = 节点的创建的事务id
        ctime = 节点的创建时间
        mZxid = 节点的数据修改的事务id
        mtime = 节点的数据修改的时间
        pZxid = 子节点个数变化的事务id
        cversion = 子节点变化的次数
        dataVersion = 节点的数据变化次数
        aclVersion = 节点的权限策略变化的次数
        ephemeralOwner = 如果是持久节点,则此值为0,如果是临时节点,则此值为sessionid
        dataLength = 数据的子节个数
        numChildren = 子节点的个数

7、节点类型

持久节点 临时节点
非顺序节点 Persistent Ephemeral
顺序节点 Persistent_Sequential Ephemeral_Sequential

8、zookeeper-API

i、普通API无观察者

package cn.yang.zookeeper;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;

public class ZookeeperDemo01 {
    private ZooKeeper zk;
    // 连接Zookeeper
    @Before
    public void connect() throws IOException, InterruptedException {
        // 获取Zookeeper对象
        // ConnectString --连接Zookeeper的ip和端口号
        // SessionTimeOut-会话超时时间
        // Watcher-监控者-用于监控连接是否建立
        // Zookeeper底层是基于netty来完成连接
        // netty是基于NIO的异步非阻塞的通信框架
        // 非阻塞:无论连接上还是没有连接上都会向下执行
        // 异步:Zookeeper可能还没有建立连接或者还在监控中,测试线程(test)可能已经抢占资源执行了
        CountDownLatch cdl = new CountDownLatch(1);
        zk = new ZooKeeper(
                "192.168.186.1",
                5000, // 现阶段,值4000-40000之间
                new Watcher() {
                    @Override
                    public void process(WatchedEvent watchedEvent) {
                        if(watchedEvent.getState()==Event.KeeperState.SyncConnected){
                            System.out.println("连接成功");
                            cdl.countDown();
                        }
                    }
                });
        // 上面的连接线程执行完成之前,这个测试线程不能执行
        // 即便抢到了执行权限也要阻塞
        cdl.await();
        System.out.println("finish");
    }
    //--创建节点
    @Test
    public void createNode() throws KeeperException, InterruptedException {
        //--path-节点的路径
        //--data-节点的数据
        //--acl-权限策略
        //--createMode-创建节点类型
        //--返回值-节点名
        String s=zk.create("/log",
                "hello Zookeeper".getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE,
                CreateMode.PERSISTENT);
        System.out.println(s);
    }
    //--修改节点数据
    @Test
    public void setData() throws KeeperException, InterruptedException {
        //--path-节点的路径
        //--data-节点的数据
        //--version-实际上指的就是dataVersion
        //--当客户端尝试修改数据的时候,会校验version和节点的dataversion是否一致
        //--如果不一致就会报错BadVersionException
        //--如果版本一致就可以修改成功
        //--如果不想受版本的控制,那么需要将version的值设置为-1
        Stat stat=zk.setData("/log",
                "hello log".getBytes(),
                0);//-1不校验版本
        System.out.println(stat);//返回值会返回一些节点的信息。
    }
    //--获取节点数据
    @Test
    public void getData() throws KeeperException, InterruptedException {
        Stat s= new Stat();
        //--watcher-观察者 可以不传
        byte[] data=zk.getData("/log",null,s);
        System.out.println(new String(data));
    }
    //--获取子节点
    @Test
    public void getChildren() throws KeeperException, InterruptedException {
        //--将子节点的名字放在list中返回
        List children=zk.getChildren("/",null);
        for(String c: children){
            System.out.println(c);
        }
    }
    //--删除节点
    @Test
    public void deleteNode() throws KeeperException, InterruptedException {
        zk.delete("/log",-1);
    }
    //--判断节点是否存在
    @Test
    public void exist() throws KeeperException, InterruptedException {
        Stat s=zk.exists("/log",null);
        System.out.println(s==null);
    }

}

 ii、观察者API

package cn.yang.zookeeper;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

public class ZookeeperDemo02 {
    private ZooKeeper zk;
    // 连接Zookeeper
    @Before
    public void connect() throws IOException, InterruptedException {
        // 获取Zookeeper对象
        // ConnectString --连接Zookeeper的ip和端口号
        // SessionTimeOut-会话超时时间
        // Watcher-监控者-用于监控连接是否建立
        // Zookeeper底层是基于netty来完成连接
        // netty是基于NIO的异步非阻塞的通信框架
        // 非阻塞:无论连接上还是没有连接上都会向下执行
        // 异步:Zookeeper可能还没有建立连接或者还在监控中,测试线程(test)可能已经抢占资源执行了
        CountDownLatch cdl = new CountDownLatch(1);
        zk = new ZooKeeper(
                "192.168.186.1",
                5000, // 现阶段,值4000-40000之间
                new Watcher() {
                    @Override
                    public void process(WatchedEvent watchedEvent) {
                        if(watchedEvent.getState()==Event.KeeperState.SyncConnected){
                            System.out.println("连接成功");
                            cdl.countDown();
                        }
                    }
                });
        // 上面的连接线程执行完成之前,这个测试线程不能执行
        // 即便抢到了执行权限也要阻塞
        cdl.await();
        System.out.println("finish");
    }
    //--监控节点数据是否被修改
    @Test
    public void dataChanged() throws KeeperException, InterruptedException {
        //--zookeeper的连接过程是异步阻塞的
        //--所以无论是否监控到数据的变化,代码都会向下执行。
        //--Test线程会抢占执行
        CountDownLatch cdl = new CountDownLatch(1);
        zk.getData("/log", new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                // --在实际开发过程中需要记录日志
                System.out.println("节点数据被修改了。。。。");
                cdl.countDown();
            }
        },null);
        cdl.await();
    }
    //--用来监控子节点的个数是否发生变化
    @Test
    public void childrenChanged() throws KeeperException, InterruptedException {
        CountDownLatch cdl = new CountDownLatch(1);
        zk.getChildren("/log", new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                if(watchedEvent.getType()==Event.EventType.NodeChildrenChanged){
                    System.out.println("子节点的个数发生了改变。。。");
                    cdl.countDown();
                }
            }
        });
        cdl.await();
    }
    //--监控节点的增删
    @Test
    public void nodeChanged() throws KeeperException, InterruptedException {
        final CountDownLatch cdl = new CountDownLatch(1);
        zk.exists("/book", new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                if(watchedEvent.getType()==Event.EventType.NodeCreated){
                    System.out.println("节点被创建了。。。");
                }else if(watchedEvent.getType()==Event.EventType.NodeDeleted){
                    System.out.println("节点被删除了。。。");
                }
                cdl.countDown();
            }
        });
    cdl.await();
    }
}

二、完全分布式安装

1、三台服务器准备

完全分布式的安装,我们需要建立三台服务器,我们在虚拟机中可以选择克隆,完整的克隆出另外两台电脑。注意选择完整克隆

大数据笔记--Zookeeper(第二篇)_第3张图片

克隆后修改一下ip地址,与主机名;

修改主机名:vim /etc/hostname        三台分别为hadoop01、hadoop02、hadoop03

修改ip地址:vim /etc/sysconfig/network-scripts/ifcfg-ens33 

        将IPADDR修改为:192.168.186.128、192.168.186.129、192.168.186.130

        这里根据自己的来,然后重启电脑

后面可以配置ssh免密登录,以前教程中写到过,在克隆之前,我们已经将jdk安装完成了,就不需要重复安装了,如果克隆之前没安装,在之前linux教程中有讲解安装jdk的方法。

大数据笔记--Zookeeper(第二篇)_第4张图片 

2、安装Zookeeper

①、关闭防火墙

临时关闭:systemctl stop firewalld
永久关闭:systemctl disable firewalld

②、安装JDK,上传或者下载Zookeeper安装包,我们将所有软件安在/home/software目录下,没有的话创建一个目录。

③、解压Zookeeper安装包

tar -xvf apache-zookeeper-3.5.7-bin.tar.gz

重命名:mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7

④、进入Zookeeper安装目录的子目录conf下

cd zookeeper-3.5.7/conf

⑤、复制文件重命名

 cp zoo_sample.cfg zoo.cfg

⑥、编辑文件

vim zoo.cfg

⑦、修改属性dataDir,这个属性是用于指定Zookeeper快照文件的存储位置,如果不指定,则默认放在/tmp目录下

dataDir=/home/software/zookeeper-3.5.7/tmp

⑧、在文件末尾添加server.x=IP/hostname:port1:port2,其中x表示选举编号,要求不重复,port1为原子广播端口,port2为选举端口,例如:

大数据笔记--Zookeeper(第二篇)_第5张图片

 ⑨、新建dataDir指定的目录

cd /home/software/zookeeper-3.5.7/

mkdir tmp

进入该目录,在该目录下编辑文件myid,在这个文件中填写当前主机给定的编号

cd tmp

vim myid

填写编号,例如第一台主机给定的编号为1

 ⑩、将第一台主机的配置远程拷贝给其他另外两台主机,例如

cd /home/software

scp -r zookeeper-3.5.7/ 192.168.186.129:/home/software/

scp -r zookeeper-3.5.7/ 192.168.186.130:/home/software/

拷贝完成之后,需要修改另外两台主机的myid

cd /home/software/zookeeper-3.5.7/tmp/

vim myid

修改成对应的编号,例如第二台主机给定编号为2

三台主机进入Zookeeper安装目录的子目录bin下,启动Zookeeper

cd /home/software/zookeeper-3.5.7/bin/

启动zookeeper

sh zkServer.sh start

查看Zookeeper运行状态

sh zkServer.sh status

3、完成效果

第一台:

大数据笔记--Zookeeper(第二篇)_第6张图片

 第二台:

大数据笔记--Zookeeper(第二篇)_第7张图片

第三台:

大数据笔记--Zookeeper(第二篇)_第8张图片

 

你可能感兴趣的:(大数据02-Zookeeper,big,data,zookeeper,大数据)