大数据实战三十二课 - ZK

第一章: 上次课回顾

第二章: 初识Zookeeper

第一章:上次课回顾

https://blog.csdn.net/zhikanjiani/article/details/100547003

  • kafka和spark Streaming的整合,需要导Kafka Utils包,使用package的方式打包;一般情况下集群下有一两台机器提供上网服务;建议瘦包使用,复杂的使用小胖包;对于生产上有的依赖scope;要明白kafka和spark streaming整合的注意事项

  • PK使用老的配合offset管理;对于以前的版本写到外部数据库中,应用程序开始的时候需要去找偏移量.

第二章:Zookeeper

抽象的了解下:它是大数据框架中的管理者。
在这里插入图片描述

对于我们的Hadoop的集群是一个大象集群,Zookeeper可以是单节点也可以是分布式。

Zookeeper是干什么的呢?

简介:

  • Apache Zookeeper is an effort to develop(致力于发展) and maintain an open-source server(维护一个开源服务器) which enables highly reliable distributed coordination(支持高可靠的分布式协调)

回顾高级班
在上hadoop 集群的时候,hdfs的namenode节点同一时间只有一个提供对外服务,那这两个NameNode是怎么进行协调的呢,通过Zokeeper自动完成切换,当active状态的namenode挂了,相当于只把standby状态的namenode给它切换为active。

What is Zookeeper?

  • Zookeeper is a centralized service for maintaining configuration information(中心化服务来维护配置信息、命名空间、提供分布式同步), naming, providing distributed synchronization, and providing group services(提供组服务). All of these kinds of services used in some form of another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them, which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.

问题:

  • 如果我们现在要做一件事情,监控各个节点上的状态信息,如果某一个节点下线、上线,完全可以通过Zookeeper来监控的。

Getting Started:

目前我们只要知道它是一个分布式协调服务即可。

2.1 Zookeeper安装

System Requirements:
1、Java运行环境

进入到服务器上安装:/home/hadoop/app

  • 下载文件:wget http://archive.cloudera.com/cdh5/cdh/5/zookeeper-3.4.5-cdh5.7.0.tar.gz
  • 解压文件:tar -xzvf /home/hadoop/app/zookeeper-3.4.5-cdh5.7.0.tar.gz

我们只需要注意到解压目录后的文件:

  • bin lib conf

我们进入到conf目录下,cp zoo_sample.cfg zoo.cfg 拷贝一份并且重命名下;
我们编辑zoo.cfg,只需要更改以下两点:datadir的临时目录:mkdir tmp/zookeeper;

如何启动呢?在Bin目录下:./zkServer.sh start,启动后jps查看进程:QuorumPeerMain,表示server已经启动了。
使用./zkCLi.sh这个客户端连接。
2181是zk默认的端口。

如何使用呢?
set path data [version]
create [-s] [-e] path data acl

[zk: localhost:2181(CONNECTED)  1]	ls	/
[zookeeper]
[zk: localhost:2181(CONNECTED)  1]	ls	/zookeeper
[quota]
[zk: localhost:2181(CONNECTED)  1]	ls	/zookeeper/quota
[]

单节点搭建是很简单的。

回到cd $ZK_HOME/bin,使用命令:./zkServer.sh status 展示出来的是:Mode:standalone。现在的这种模式就是standalone模式。

我们回到datadir所在的目录查看是否有东西,发现有两个东西:version-2和zookeeper_server.pid(存取的是进程id)

2.2 ZK数据模型

1)、树形结构:/
2)、ZK中的每个节点:znode,具有唯一的路径标识
a)每个znode都有自己
3)、znode有两种类型 a)、临时:当前session有效 b)、永久:不依赖于session,只要创建好就都能用

由于我们是树形结构,会导致我们文件夹下有文件夹,或者文件夹下有文件;注意到临时znode下不能有子节点;
4)、znode四种形式:PERSISTENT、PERSISTENT_SEQUENTIAL(带顺序编号的)、EPHEMERAL(临时的)、EPHEMERAL_SEQUENTIAL

2.3 ZK实际应用

重启zk服务,连一个客户端过来爽一把:

  • ./zkServer.sh restart ./zkCli.sh

1、ls /

2、ls2 /

ls2 / 和ls / 的区别?
stat / 显示当前znode的一个状态信息
ls2 / = ls / + stat /
在这里插入图片描述
3、get /
解析:
cZxid : 节点id
ctime : 节点id的创建时间
mZxid:修改后的znode的id
mtime:修改后的时间
pZxid:最后更新的子节点id
cversion:子节点的版本号
dataversion : 数据的版本
aclVersion:权限的版本
ephemeralOwner = 0X0 : 是否是临时的
dataLength = 0 :数据的长度
numChildren = 1:有几个孩子

在这里插入图片描述

实际操作:

1、创建一个节点:create /ruoze ruoze-data
create [-s] [-e]
-s指的的带不带编号,-e指的是有没有顺序

解析:刚被被创建,修改时间和创建时间是一样的,数据长度是10,现在还没有numChildren.
在这里插入图片描述
2、在ruoze下面创建一个numChildren,它是临时的

  • create -e /ruoze/xiaoruoze xiaoruoze

使用get /ruoze去查看信息:
pZxid = 0X5,子节点的id
cversion = 1子节点的版本是1

使用get /ruoze/xiaoruoze
ephemeralOwner = 0X16bqisq9we9 说明它是临时目录

3、我们结束当前客户端,等待再次连接,ls /ruoze下已经找不到xiaoruoze了,-e体现的是临时,重新启动就没了。

4、带顺序的创建,拷贝五份进行创建,在分布式锁的zookeeper实现会借助于sequence的方式实现
create -s /ruoze/seq seq
create -s /ruoze/seq seq
create -s /ruoze/seq seq

5、在zookeeper客户端中,不能多层级的操作,只支持API创建
create /ruoze/a/b/c ruoze 客户端不支持

6、修改ruoze的值,set /ruoze www.ruozedata.com
get /ruoze 值已经被改掉了;注意上面写的,znode的dataversion一旦发生变化,会依次递增+1.

7、set path data [version]

  • set /ruoze spark-version 1
  • 假设第二个用户进来了,set /ruoze spark-flink-ruoze 1 无法修改,最新版本是2了,使用1就是不行的。

8、删除:delete /ruoze/seq000000001 发现已经被删除了

9、set /ruoze/seq000000002 123
get /ruoze/seq000000002 123 值已经变成123了
修改删除都能指定版本。
delete path [version]

ZK中的四字命令:

  • echo stat | nc localhost 2181 查看zk的状态信息,是否单机还是集群,

  • echo ruok| nc localhost 2181 返回值是imok

  • echo dump | nc localhost 2181 dump出来一些信息,能够看出临时节点的信息有哪些? 演示:create -e /tmp 123,回到echo dump | nc localhost 2181
    在这里插入图片描述

  • echo conf | nc localhost 2181 能够看到当前zookeeper的所有配置信息。

  • echo cons | nc localhost 2181 打出所有连接的信息

  • echo envi | nc localhost 2181 打出依赖的一堆信息

  • echo mntr | nc localhost 2181 打出监控信息

  • echo wchs | nc localhost 2181 查看监控
    get /tmp watch ,使用命令查看监控:echo wchs | nc localhost 2181 已经有一把锁了。

Java中乐观锁和悲观锁都是什么?

如果要配置集群怎么配置,在/conf/zoo.cfg下加编号就行了。

ZK节点数:一般是奇数个(>=3),我们做选举,只要有一半能提供服务即可。

节点存活一半以上就可以。存活的机器必须大于(N/2+1)台。

zk集群的写操作,leader负责,会把通知所有节点写入操作
只有收到半数以上节点的成功反馈,才算成功

leader + follower:
3台机器要收到2台,4台机器要收到3台,5台机器要收到3台;

2.4 ZK的IDEA编程

ZookeeperConnectApp.java

package ZK;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

public class ZookeeperConnectApp implements Watcher {

        public static Logger logger = LoggerFactory.getLogger(ZookeeperConnectApp.class);


       private static CountDownLatch connected = new CountDownLatch(1);


        public static void main(String[] args) throws Exception{
                try {
                        ZooKeeper zk = new ZooKeeper("hadoop002:2181",5000,new ZookeeperConnectApp());

                        logger.warn("客户端开始连接zk...,状态是:{}", zk.getState());
//                        Thread.sleep(2000);
                        connected.await();  //等到CountDown执行完后会往下走
                        logger.warn("客户端开始连接zk....."+zk.getState());

                } catch (IOException e) {
                        e.printStackTrace();
                }
        }

        public void process(WatchedEvent watchedEvent){
            if(Event.KeeperState.SyncConnected == watchedEvent.getState()){
                logger.warn("接收到watch通知:{}",watchedEvent);
                connected.countDown();  //1-1=0
            }
        }
}

调整log4j的输出日志:必须如下图连接上了才行。
在这里插入图片描述

这种方式low了?
多个zookeeper的话,
ZooKeeper zk = new ZooKeeper(“hadoop002:2181”,5000,new ZookeeperConnectApp());

ZKNodeApp.java
当前时间段、当前控制台,此处是创建的同步。

package ZK;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ZKNodeApp {

        public static Logger logger = LoggerFactory.getLogger(ZookeeperConnectApp.class);
        public static void main(String[] args) throws Exception {
            ZooKeeper zk = new ZooKeeper("hadoop002:2181",5000,new ZookeeperConnectApp());
            Thread.sleep(1000);
            logger.warn("状态是",zk.getState());

            //测试创建临时节点
            String path = zk.create("/zk-test-eph","".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL)

             //怎样设置让他在控制台上显示出来
             logger.warn("临时节点创建成功,路径是:{}",path);
        }
}

在这里插入图片描述

测试修改版本号:
stat stat = zk.setData(path:"/ruoze",“http://www.ruozedata.com”.getBytes(),verison(-1))
logger.warn(“version.{}”,stat.getVersion());
不知道版本号,放个-1在里面。

再次改动这个名称,再次运行,会提示bad version,不知道版本号,加个-1,可以写任何值。

测试删除
hadoop下创建一个节点:create /zk-test-deleted delete
ls /
在这里插入图片描述
IDEA下删除路径:
zk.delete(path:"/zk-test-delete",version(-1)),version写-1就是能全部干掉。

方法定义:getData(String path, boolean watch, Stat stat) byte[]

Stat stat = new Stat();
byte[] data = zk.getData(path:"/ruoze",watch:null,stat);
logger.warn(“version:{}”, new String(stat.getVersion()));

再查看节点存不存在?

zk.exists(path:"/ruoze",watcher:null);
if (stat != null) {
logger.warn(“version:{}”,stat.getVersion());
} else{
logger.warn(“该节点不存在…”)
}

获取列表

List children = zk.getChildren(path:"/",watcher:null);
for (String child:children) {
logger.warn(“该节点不存在…”)
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值