Hadoop高手之路6-ZooKeeper

文章目录

  • Hadoop高手之路6-Zookeeper分布式协调服务
    • 一、Zookeeper简介
    • 二、Zookeeper的特性
      • 1. 一致性C
      • 2. 可靠性
      • 3. 顺序性
      • 4. 原子性A
      • 5. 实时性
    • 三、Zookeeper分布式集群的部署
      • 1. 下载安装包
      • 2. 上传
      • 3. 解压
      • 4. 配置环境变量
      • 5. 配置Zookeeper
        • 1) 复制一个配置模板文件
        • 2) 修改配置文件
        • 3) 创建myid文件
      • 6. 分发zookeeper文件
      • 7. 在各服务器上创建myid文件
      • 8. 分发环境变量配置文件
      • 9. 使环境变量起作用
    • 四、Zookeeper集群服务的启动和关闭
      • 1. 启动Zookeeper服务
      • 2. 查看zookeeper集群各服务器的角色
      • 3. 关闭Zookeeper服务
    • 五、测试Zookeeper服务
      • 1. 启动各节点的Zookeeper服务
      • 2. 杀死leader,模拟服务器宕机
      • 3. 查看各节点角色
      • 4. 通过zookeeper客户端连接zookeeper服务
    • 六、Zookeeper的Shell操作
      • 1. 启动Zookeeper集群
      • 2. 启动shell
      • 3. help显示所有的操作命令
      • 4. ls查看目录信息
      • 5. ls -sw查看目录的数据信息
      • 6. create创建节点
      • 7. get获取节点数据
      • 8. 修改节点
      • 9. delete删除节点
    • 七、Zookeeper的Java API操作
      • 1. 启动idea,创建一个新的maven项目
      • 2. 添加pom依赖
      • 3. 新建一个包,并在包下新建类
        • 1) 测试客户端代码
        • 2) 创建目录节点
        • 3) 创建子目录节点
        • 4) 获取节点数据
        • 5) 获取子目录节点数据
        • 6) 修改子目录节点数据
        • 7) 判读节点是否存在
        • 8) 删除节点
        • 9) 完整代码
    • 八、Zookeeper的数据模型
      • 1. 数据的存储结构
      • 2. Znode类型
      • 3. 节点的属性
    • 九、Zookeeper的Watch机制
      • 1. Watch机制简介
      • 2. Watch机制的特点
        • 1) 一次性触发
        • 2) 事件封装
        • 3) 异步发送
        • 4) 先注册再发送
    • 十、Zookeeper的选举机制
      • 1. 选举机制简介
        • 1) 服务器ID
        • 2) 选举状态
        • 3) 数据ID
        • 4) 逻辑时钟
      • 2. 选举机制的类型
        • 1) 全新选举
        • 2) 非全新选举
    • 十一、Zookeeper的应用场景
      • 1. 数据发布与订阅
      • 2. 统一命名服务
      • 3. 分布式锁

Hadoop高手之路6-ZooKeeper_第1张图片

Hadoop高手之路6-Zookeeper分布式协调服务

一、Zookeeper简介

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

ZooKeeper包含一个简单的原语集,提供Java和C的接口。

ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_home\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

zookeeper主要是用来解决分布式集群中的一致性和单点故障问题

Hadoop高手之路6-ZooKeeper_第2张图片

二、Zookeeper的特性

保证了数据的AC特性

1. 一致性C

每个服务器都保存一份相同的数据副本,客户端连接到zookeeper集群的任意节点上,看到的的目录树都是一致的。

2. 可靠性

如果对目录结构进行任意的增删改查,那么所有的节点都会随着进行相应的改变。

3. 顺序性

Zookeeper顺序性分为全局有序和偏序两种。

  • 全局有序:如果在一台服务器上某一种操作(消息)a先于b进行,那么所有的服务器上都是a先于b进行的。

  • 偏序:如果一个操作(消息)b在a后被同一个发送者发布,a必将排在b前面。

4. 原子性A

一次数据的更新操作要么成功要么失败,不存在中间的状态。

5. 实时性

Zookeeper保证客户端在一个时间间隔范围内获得服务器的更新信息。

三、Zookeeper分布式集群的部署

1. 下载安装包

Hadoop高手之路6-ZooKeeper_第3张图片

Hadoop高手之路6-ZooKeeper_第4张图片

Hadoop高手之路6-ZooKeeper_第5张图片

Hadoop高手之路6-ZooKeeper_第6张图片

Hadoop高手之路6-ZooKeeper_第7张图片

Hadoop高手之路6-ZooKeeper_第8张图片

2. 上传

Hadoop高手之路6-ZooKeeper_第9张图片

Hadoop高手之路6-ZooKeeper_第10张图片

3. 解压

image-20221108141120825

Hadoop高手之路6-ZooKeeper_第11张图片

Hadoop高手之路6-ZooKeeper_第12张图片

Hadoop高手之路6-ZooKeeper_第13张图片

4. 配置环境变量

image-20221108142159330

Hadoop高手之路6-ZooKeeper_第14张图片

5. 配置Zookeeper

Hadoop高手之路6-ZooKeeper_第15张图片

1) 复制一个配置模板文件

Hadoop高手之路6-ZooKeeper_第16张图片

2) 修改配置文件

Hadoop高手之路6-ZooKeeper_第17张图片

3) 创建myid文件

myid文件的数据越大,越容易被选举成为leader,这个文件的内容一般就是服务器的编号,在每个服务器上都要创建相应的目录以及该文件。

Hadoop高手之路6-ZooKeeper_第18张图片

Hadoop高手之路6-ZooKeeper_第19张图片

6. 分发zookeeper文件

image-20221108150435026

image-20221108150505483

7. 在各服务器上创建myid文件

在hadoop002上

Hadoop高手之路6-ZooKeeper_第20张图片

在hadoop003上

Hadoop高手之路6-ZooKeeper_第21张图片

8. 分发环境变量配置文件

Hadoop高手之路6-ZooKeeper_第22张图片

9. 使环境变量起作用

Hadoop高手之路6-ZooKeeper_第23张图片

四、Zookeeper集群服务的启动和关闭

1. 启动Zookeeper服务

依次在hadoop001、hadoop002和hadoop003上启动Zookeeper服务

在hadoop001上

Hadoop高手之路6-ZooKeeper_第24张图片

在hadoop002上

Hadoop高手之路6-ZooKeeper_第25张图片

在hadoop003上

Hadoop高手之路6-ZooKeeper_第26张图片

2. 查看zookeeper集群各服务器的角色

角色有三种:leader(领导者)、follower(跟随者)、observer(观察者)

在hadoop001上

image-20221108153415954

在hadoop002上

Hadoop高手之路6-ZooKeeper_第27张图片

在hadoop003上

在这里插入图片描述

说明:因为先启动node1,然后启动node2,node2的myid为2,而且超过节点个数的半数,所以node2被选举为leader

3. 关闭Zookeeper服务

在hadoop001上

Hadoop高手之路6-ZooKeeper_第28张图片

在hadoop002上

Hadoop高手之路6-ZooKeeper_第29张图片

在hadoop003上

Hadoop高手之路6-ZooKeeper_第30张图片

五、测试Zookeeper服务

先启动Zookeeper后,杀掉leader的进程,然后查看选举产生新的leader

1. 启动各节点的Zookeeper服务

Hadoop高手之路6-ZooKeeper_第31张图片

Hadoop高手之路6-ZooKeeper_第32张图片

Hadoop高手之路6-ZooKeeper_第33张图片

2. 杀死leader,模拟服务器宕机

在hadoop002上

Hadoop高手之路6-ZooKeeper_第34张图片

Hadoop高手之路6-ZooKeeper_第35张图片

3. 查看各节点角色

发现hadoop003已经被选举为leader

image-20221108155818846

image-20221108155834834

image-20221108155852262

4. 通过zookeeper客户端连接zookeeper服务

Hadoop高手之路6-ZooKeeper_第36张图片

Hadoop高手之路6-ZooKeeper_第37张图片

没有出现[zk: localhost:2181(CONNECTED) 0],输入回车就可以了

可以输入命令

Hadoop高手之路6-ZooKeeper_第38张图片

六、Zookeeper的Shell操作

1. 启动Zookeeper集群

Hadoop高手之路6-ZooKeeper_第39张图片

Hadoop高手之路6-ZooKeeper_第40张图片

Hadoop高手之路6-ZooKeeper_第41张图片

2. 启动shell

Hadoop高手之路6-ZooKeeper_第42张图片

image-20221111123341207

Hadoop高手之路6-ZooKeeper_第43张图片

3. help显示所有的操作命令

Hadoop高手之路6-ZooKeeper_第44张图片

4. ls查看目录信息

image-20221111124320481

Hadoop高手之路6-ZooKeeper_第45张图片

5. ls -sw查看目录的数据信息

image-20221111132129926

Hadoop高手之路6-ZooKeeper_第46张图片

6. create创建节点

格式:

create [-s] [-e] path [data] [acl]

说明:

  • s:开启节点的序列化特性
  • e:创建的是临时节点,如果不加默认创建永久节点

Hadoop高手之路6-ZooKeeper_第47张图片

Hadoop高手之路6-ZooKeeper_第48张图片

image-20221111155203996

7. get获取节点数据

Hadoop高手之路6-ZooKeeper_第49张图片

8. 修改节点

Hadoop高手之路6-ZooKeeper_第50张图片

9. delete删除节点

Hadoop高手之路6-ZooKeeper_第51张图片

Hadoop高手之路6-ZooKeeper_第52张图片

七、Zookeeper的Java API操作

1. 启动idea,创建一个新的maven项目

Hadoop高手之路6-ZooKeeper_第53张图片

2. 添加pom依赖

Hadoop高手之路6-ZooKeeper_第54张图片

3. 新建一个包,并在包下新建类

1) 测试客户端代码

新建包和类

Hadoop高手之路6-ZooKeeper_第55张图片

Hadoop高手之路6-ZooKeeper_第56张图片

Hadoop高手之路6-ZooKeeper_第57张图片

Hadoop高手之路6-ZooKeeper_第58张图片

Hadoop高手之路6-ZooKeeper_第59张图片

2) 创建目录节点

Hadoop高手之路6-ZooKeeper_第60张图片

运行

image-20221111230104628

通过客户端的shell进行查看

在这里插入图片描述

3) 创建子目录节点

先将目录代码注释掉,否则会报错

Hadoop高手之路6-ZooKeeper_第61张图片

运行,查看结果

Hadoop高手之路6-ZooKeeper_第62张图片

4) 获取节点数据

image-20221111231424048

Hadoop高手之路6-ZooKeeper_第63张图片

5) 获取子目录节点数据

image-20221111231935928

6) 修改子目录节点数据

image-20221111232154289
Hadoop高手之路6-ZooKeeper_第64张图片

7) 判读节点是否存在

image-20221111232953865

8) 删除节点

image-20221111233212855

Hadoop高手之路6-ZooKeeper_第65张图片

9) 完整代码

package cn.edu.hgu.bigdata20.zookeeper;


import org.apache.zookeeper.*;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class ZooKeeperDemo {
    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        // 1.创建ZooKeeper客户端
        ZooKeeper zooKeeper = new ZooKeeper("hadoop001:2181,hadoop002:2181,hadoop003:2181",
                30000, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                System.out.println(watchedEvent.toString());
            }
        });
        // 输出客户端
        System.out.println(zooKeeper);
        // 2.创建目录节点
//        zooKeeper.create("/testHello","HelloZookeeper".getBytes(StandardCharsets.UTF_8),
//                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        // 3.创建子目录节点
//        zooKeeper.create("/testHello/testWorld","HelloWorld".getBytes(StandardCharsets.UTF_8),
//                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        // 4.获取节点数据
//        System.out.println(new String(zooKeeper.getData("/testHello",false,null)));
        // 5.获取子目录的节点数据
//        zooKeeper.getChildren("/testHello",true);
        // 6.修改子目录节点数据
//        zooKeeper.setData("/testHello/testWorld","123456".getBytes(StandardCharsets.UTF_8)
//                ,-1);
        // 7.判断节点是否存在
//        System.out.println(zooKeeper.exists("/testHello",true));
        // 8.删除节点
        zooKeeper.delete("/testHello/testWorld", -1);
    }
}

八、Zookeeper的数据模型

1. 数据的存储结构

树型结构,树中的每个节点被称为Znode,每一个Znode默认能够存储1MB的数据,由三部分组成:stat(状态信息)、data(数据信息)和children(子节点)

Hadoop高手之路6-ZooKeeper_第66张图片

2. Znode类型

加上-s选项,可以创建四种类型的节点

  • 永久节点:该节点的生命周期不依赖于会话,只有执行删除操作的时候才还被删除。
  • 临时节点:该节点的生命周期依赖于创建它们的会话,一旦会话结束,临时节点会被自动删除,也可以手动删除,临时节点不允许拥有子节点
  • 序列化永久节点
  • 序列化临时节点

创建一个临时节点:

Hadoop高手之路6-ZooKeeper_第67张图片

退出会话后再次进入,发现临时节点被自动删除

Hadoop高手之路6-ZooKeeper_第68张图片

创建会话

Hadoop高手之路6-ZooKeeper_第69张图片

Hadoop高手之路6-ZooKeeper_第70张图片

3. 节点的属性

Hadoop高手之路6-ZooKeeper_第71张图片

九、Zookeeper的Watch机制

1. Watch机制简介

在Zookeeper中,引入watch机制来实现分布式的通知功能,zookeeper运行客户端向服务器端注册一个watch监听,当服务器端的一些事件触发了这个watch,那就会指定客户端发送一个事件通知,来实现分布式的通知功能。

2. Watch机制的特点

1) 一次性触发

2) 事件封装

包括了状态、类型和路径

image-20221111234109827

3) 异步发送

4) 先注册再发送

十、Zookeeper的选举机制

1. 选举机制简介

Zookeeper为了保证各节点协同工作,需要一个Leader角色,而Zookeeper采用FirstLeaderElection算法,且投票数大于节点的半数则胜出成为Leader。

1) 服务器ID

配置集群时,给每个服务器一个myid,该编号越大,则权重越大,越容易被选举为Leader

2) 选举状态

  • LOOKING:竞选状态
  • FOLLOWING:随从状态,同步leader状态,参与投票
  • OBSERVING:观察状态:同步leader状态,不参与投票
  • LEADING:领导者状态

3) 数据ID

最新的数据版本号,该值越大,说明数据越新,权重越大,越容易被选为leader

4) 逻辑时钟

也叫做投票次数,起始值为0,每投完一次票,这个值就会增加。该值越低,说明投票次数越少,该服务器就有可能宕机。

2. 选举机制的类型

1) 全新选举

是指新搭建起来,没有数据id和逻辑时钟的选举。选举步骤:

步骤1:服务器1启动,先给自己投票后发送投票信息,处于LOOKING状态

步骤2:服务器2启动,先给自己投票,跟服务器1进行对比,服务器2编号大而胜出,服务器1会把票投给服务器2,如果超过半数,则服务器2为Leader状态,服务器1为追随者状态,否则两个服务器都是LOOKING状态。

步骤3:依次进行其他服务器的启动投票,选出Leader状态,其他服务器成为FOLLOWING状态

2) 非全新选举

对于正常运行的Zookeeper集群,一旦中途有服务器宕机,则需要重新选举。

步骤1:首先统计逻辑时钟是否相同,如果不同,有小的逻辑时钟,说明存在宕机,需要重新投票选举。

步骤2:统一逻辑时钟,对比数据ID值,ID值大的胜出。

步骤3:如果逻辑时钟和数据ID都相同,这比较服务器的ID(编号),值大者胜出。

说明:非全新选举是一种优中选优,保证Leader是集群中数据最完整、最可靠的。

十一、Zookeeper的应用场景

1. 数据发布与订阅

也叫全局配置中心

2. 统一命名服务

阿里开源的分布式服务框架Dubbo采用Zookeeper作为命名服务

3. 分布式锁

你可能感兴趣的:(Hadoop高手之路,java-zookeeper,hadoop,zookeeper)