学习大数据的第48天(zookeeper篇)

Hadoop学习——zookeeper的知识点

HA高可用

zookeeper 概述:

Zookeeper使用的数据结构为树形结构,根节点为"/"。Zookeeper集群中的节点,根据其身份特性分为leader、follower、observer。leader负责客户端writer类型的请求;follower负责客户端reader类型的请求,并参与leader选举;observer是特殊的follower,可以接收客户端reader请求,但是不会参与选举,可以用来扩容系统支撑能力,提高读取速度。

Zookeeper是一个基于观察者模式设计的分布式服务管理框架,负责存储和管理相关数据,接收观察者的注册。

zookeeper的安装过程:

1、上传安装包到master并解压

tar -xvf zookeeper-3.4.6.tar.gz

2、配置环境变量

vim /etc/profile

export ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.4.6
export PATH=PATH:PATH:PATH:ZOOKEEPER_HOME/bin

source /etc/profile

3、修改配置文件

cd conf
cp zoo_sample.cfg zoo.cfg

修改
dataDir=/usr/local/soft/zookeeper-3.4.6/data

增加

server.0=master:2888:3888
server.1=node1:2888:3888
server.2=node2:2888:3888

4、同步到其它节点

scp -r zookeeper-3.4.6 node1:pwd
scp -r zookeeper-3.4.6 node2:pwd

配置node1和node2的环境变量
scp /etc/profile node1:/etc/
scp /etc/profile node2:/etc/

在所有节点执行
source /etc/profile

5、创建/usr/local/soft/zookeeper-3.4.6/data目录,所有节点都要创建

mkdir /usr/local/soft/zookeeper-3.4.6/data

在data目录下创建myid文件
vim myid
master,node1,node2分别加上0,1,2

6、启动zk,

zkServer.sh start 三台都需要执行
zkServer.sh status 查看状态

当有一个leader的时候启动成功

7、连接zk

bash zkCli.sh

zk 是一个目录结构 ,每个节点可以存数据,同时可以有子节点

8、zk shell

创建目录
create /test test
create /test/a 1

获取数据
get /test

ls /test

delete 只能删除没有子节点的节点
rmr /test 删除节点

9、重置zk

1、杀掉所有zk进程
kiil -9 pid

2、删除data目录下的version文件, 所有节点都要删除
rm -rf /usr/local/soft/zookeeper-3.4.6/data/version-2

2、启动zk
zkServer.sh start

zookeeoer笔记:

>>>>>>>>>>>>>>>>>>zookeeper配置信息解释<<<<<<<<<<<<<<<<<<<<<<<<# The number of milliseconds of each tick# 心跳时间 ms  2秒一次心跳
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take# 通信限时 当服务启动时 限定初始的心跳数
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement# 超时心跳 数  syncLimit * tickTime = 10s
syncLimit=5# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.dataDir=/usr/local/soft/zookeeper-3.4.6/data
# the port at which the clients will connect
clientPort=2181>>>>>>>>>>>>>>>>>>zookeeper常用命令<<<<<<<<<<<<<<<<<<<<<<<<# 登录zookeeperbash zkcli.sh  <- 默认连接 localhost:2181# 命令:help表示帮助命令ls:表示查看指定路径节点下的节点信息-w : 监听文件夹create /test abc表示创建节点并赋值-e : 表示创建一个临时的节点、-s : 表示创建一个带有编号的节点get /test表示获取指定节点位置的值-s : 表示获取指定节点的值set /test cb 表示重新设置节点的值delete /test/test1表示删除test1节点state 返回一个节点的源信息

zookeeper的常用API操作

zookeeper_0_connection

package com.shujia.zookeeper;import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;/*** 连接zookeeper**/
public class zookeeper_0_connection {public static void main(String[] args) throws Exception{//zookeeper的端口号  conf文件中的zoo.cfg文件String conn = "master:2181,node1:2181,node2:2181";//会话连接超时时间int sessionTimeout = 10 * 1000;/***connectString – comma separated host:port pairs, each corresponding to a zk server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If the optional chroot suffix is used the example would look like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" where the client would be rooted at "/app/a" and all paths would be relative to this root - ie getting/setting/etc... "/foo/bar" would result in operations being run on "/app/a/foo/bar" (from the server perspective).sessionTimeout – session timeout in millisecondswatcher – a watcher object which will be notified of state changes, may also be notified for node events*/ZooKeeper zkCli = new ZooKeeper(conn, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("监听被执行");}});System.out.println("--->"+zkCli);zkCli.close();}
}

zookeeper_1_Create

package com.shujia.zookeeper;import org.apache.zookeeper.*;import java.nio.charset.StandardCharsets;/*** 创建zookeeper节点*/
public class zookeeper_1_Create {public static void main(String[] args) throws Exception {//zookeeper的端口号  conf文件中的zoo.cfg文件String conn = "master:2181,node1:2181,node2:2181";//会话连接超时时间int sessionTimeout = 10 * 1000;/***connectString – comma separated host:port pairs, each corresponding to a zk server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002" If the optional chroot suffix is used the example would look like: "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a" where the client would be rooted at "/app/a" and all paths would be relative to this root - ie getting/setting/etc... "/foo/bar" would result in operations being run on "/app/a/foo/bar" (from the server perspective).sessionTimeout – session timeout in millisecondswatcher – a watcher object which will be notified of state changes, may also be notified for node events*/ZooKeeper zkCli = new ZooKeeper(conn, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("监听被执行");}});/*** path – the path for the node* data – the initial data for the node* acl – the acl for the node* createMode – specifying whether the node to be created is ephemeral and/or sequential*/String path = "/hadoop";/*** path 节点的路径* ZooDefs.Ids.OPEN_ACL_UNSAFE  身份认证  调用zookeeper中的枚举OPEN_ACL_UNSAFE* CreateMode.PERSISTENT  创建节点类型,普通节点,持久化的*///创建普通节点
//        zkCli.create(path,"Hadoop created".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//创建临时节点zkCli.create("/hadoop/ApplicationMaster","Job is running".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);zkCli.close();}
}

zookeeper_2_GetChildren

package com.shujia.zookeeper;import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;import java.util.List;/*** 连接zookeeper*/
public class zookeeper_2_GetChildren {public static void main(String[] args) throws Exception {//zookeeper的端口号  conf文件中的zoo.cfg文件String conn = "master:2181,node1:2181,node2:2181";//会话连接超时时间int sessionTimeout = 10 * 1000;ZooKeeper zkCli = new ZooKeeper(conn, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("监听被执行");}});/*** public List<String> getChildren(String path, boolean watch)*/List<String> children = zkCli.getChildren("/", false);for (String child : children) {System.out.println("child:" + child);}zkCli.close();}
}

zookeeper_3_GetChildrenWatch

package com.shujia.zookeeper;import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;import java.util.List;/*** 获取监听子节点*/
public class zookeeper_3_GetChildrenWatch {public static void main(String[] args) throws Exception {//zookeeper的端口号  conf文件中的zoo.cfg文件String conn = "master:2181,node1:2181,node2:2181";//会话连接超时时间int sessionTimeout = 10 * 1000;ZooKeeper zkCli = new ZooKeeper(conn, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("监听被执行");}});/*** public List<String> getChildren(String path, boolean watch)*/zkCli.getChildren("/", new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("子节点发生变化");System.out.println(event.getPath());}});Thread.sleep(Long.MAX_VALUE);zkCli.close();}
}

zookeeper_4_Exist

package com.shujia.zookeeper;import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;/*** 节点是否是否存在*/
public class zookeeper_4_Exist {public static void main(String[] args) throws Exception {//zookeeper的端口号  conf文件中的zoo.cfg文件String conn = "master:2181,node1:2181,node2:2181";//会话连接超时时间int sessionTimeout = 10 * 1000;ZooKeeper zkCli = new ZooKeeper(conn, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("监听被执行");}});Stat exists = zkCli.exists("/hadoop", false);if (exists == null) {System.out.println("该节点不存在");}else{System.out.println(exists.toString());}zkCli.close();}
}

zookeeper_5_GetChildrenData

package com.shujia.zookeeper;import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;import java.util.List;//获取字节
public class zookeeper_5_GetChildrenData {public static void main(String[] args) throws Exception {//zookeeper的端口号  conf文件中的zoo.cfg文件String conn = "master:2181,node1:2181,node2:2181";//会话连接超时时间int sessionTimeout = 10 * 1000;ZooKeeper zkCli = new ZooKeeper(conn, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("监听被执行");}});String path = "/hadoop";Stat stat = zkCli.exists(path, false);if (stat == null) {System.out.println("子节点不存在");} else {//获取子节点的数据byte[] data = zkCli.getData(path, false, stat);List<String> children = zkCli.getChildren(path, false, stat);//输出父节点的数据String s = new String(data);System.out.println(s);//输出子节点的状态//如果当前的节点有空节点的话,会报错,报出空指针的错误for(String child : children){Stat child_stat = zkCli.exists(path +"/"+ child, false);byte[] data1 = zkCli.getData(path + "/" + child, false, child_stat);String s1 = new String(data1);System.out.println(s1);}}zkCli.close();}
}

zookeeper_6_Delete

package com.shujia.zookeeper;import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;public class zookeeper_6_Delete {public static void main(String[] args) throws Exception {//zookeeper的端口号  conf文件中的zoo.cfg文件String conn = "master:2181,node1:2181,node2:2181";//会话连接超时时间int sessionTimeout = 10 * 1000;ZooKeeper zkCli = new ZooKeeper(conn, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("监听被执行");}});/**** This operation, if successful, will trigger all the watches on the node of the given path left by exists API calls, and the watches on the parent node left by getChildren API calls.* Params:* path – the path of the node to be deleted.* version – the expected node version.*/String path = "/spark/spark011";//-1不指定版本zkCli.delete(path,-1);zkCli.close();// 小作业:删除节点下的子节点}
}

zookeeper_7_DeleteAll

package com.shujia.zookeeper;import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;import java.nio.file.Path;
import java.util.List;/*** 小作业:删除节点下的子节点  完美利用递归实现*/
public class zookeeper_7_DeleteAll {//删除所有的节点public static void deleteall(ZooKeeper zkCli, String path) {//  path = /sparktry {System.out.println("路径为" + path);//获取子节点是否存在List<String> childrens = zkCli.getChildren(path, false);System.out.println(childrens.size());if (childrens.size() == 0) {delete(zkCli, path);  }//删除目标节点public static void delete(ZooKeeper zkCli, String path) {try {zkCli.delete(path, -1);System.out.println("删除路径为 " + path + " 的子节点");} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) throws Exception {String conn = "master:2181,node1:2181,node2:2181";//会话连接超时时间int sessionTimeout = 10 * 1000;ZooKeeper zkCli = new ZooKeeper(conn, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("监听被执行");}});String path = "/spark";deleteall(zkCli, path);}
}

zookeeper的监听原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1k0wNoB2-1649342519873)(G:\数加科技\day55\2022年4月2日\课件\监听原理.png)]

zookeeper的选举机制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xsWv8sol-1649342519875)(G:\数加科技\day55\2022年4月2日\课件\选举机制.png)]

选举机制的总结:也就是如果启动顺序与myid的大小有关,以myid从小到大的顺序进行启动的话,那zoo2都是leader

学习大数据的第48天(zookeeper篇)相关推荐

  1. 学习大数据的第47天(HDFS以及Zookeeper)——HDFS的重要架构知识点以及zookeeper的安装和基本命令

    学习大数据的第47天(HDFS以及Zookeeper)--HDFS的重要架构知识点以及zookeeper的安装和基本命令 HDFS的知识点 HDFS文件块的大小 HDFS的写流程 自己的话总结一下: ...

  2. 零基础学习大数据人工智能,学习路线篇!

    大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后. Python:Python 的排名从去年开始就借助人工智能持续上升,现在它 ...

  3. GitChat · 大数据 | 一步一步学习大数据:Hadoop 生态系统与场景

    目录(?)[-] Hadoop概要 Hadoop相关组件介绍 HDFS Yarn Hive HBase Spark Other Tools Hadoop集群硬件和拓扑规划 硬件配置 软件配置 Hado ...

  4. 大数据薪资一再飙升 学习大数据需要哪些基础?

    2018年6月19日,备受关注的个人所得税法修正案草案迎来第七次大修,个税起征点由每月3500元提高至每月5000元(每年6万元).对于大多数人来说这绝对是个好消息,但人们更愿意参加培训班实现高薪.近 ...

  5. python大数据零基础_零基础学习大数据人工智能,学习路线篇!

    大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后. Python:Python 的排名从去年开始就借助人工智能持续上升,现在它 ...

  6. 03.三月风雨愁断肠,学习大数据特别忧伤——谈谈AKS创建SQL Server大数据群集创建愁断肠

    03.三月风雨愁断肠,学习大数据特别忧伤--谈谈AKS创建SQL Server大数据群集创建愁断肠 [TOC] 前言 使用AKS创建SQL Server大数据群集有几种方法,由于产品不断的更新,SQL ...

  7. 零基础怎么系统学习大数据?

    大数据技术是指从各种各样类型的巨量数据中,快速获得有价值信息的技术.解决大数据问题的核心是大数据技术.零基础怎么系统学习大数据?首先我们先了解一下什么是大数据. 推荐下小编的大数据学习群:251956 ...

  8. 大数据学习方法,学习大数据需要的基础和路线

    大数据基础学习 大数据基础入门 为什么要学习大数据 1.目的:要份很好工作(钱) 2.对比:Java开发和大数据开发 什么是大数据? 举例: 1.商品推荐:问题: (1)大量的订单如何存储? (2)大 ...

  9. 如何学习大数据?这才是完整的大数据学习体系!!

    整理的大数据学习思路 第一阶段:linux系统 本阶段为大数据学习入门基础课程,帮大家进入大数据领取打好Linux基础,以便更好的学习Hadoop.habse.NoSQL.saprk.storm等众多 ...

最新文章

  1. Numpy入门教程:07. 随机抽样
  2. 【网工必备】网络端口号大全......
  3. 中国二氧化碳激光器行业现状研究与可行性分析报告2022-2028年版
  4. php 打印变量内存地址_Python合集之Python变量
  5. redis 安装错误 jemalloc.h: No such file or directory
  6. 正确的python变量名_在Python,如何将变量名作为字符串?_others_酷徒编程知识库...
  7. 大乐透python预测程序_Python生成随机验证码,大乐透号码
  8. TypeScript 中的 SOLID 原则
  9. 页表长度和页表大小_linux内核页表映射机制:线性地址如何转为物理地址?
  10. TGS.Avizo.v5.0 1CD
  11. 数字图像处理期末复习题
  12. catia 桥接曲面圆角_CATIA建模教程_二_圆角及桥接在空间曲线中的应用
  13. Linux Mint 20.3更改源及软件安装
  14. 谈谈蛋疼的问题:里式替换原则:正方形是长方形吗?
  15. 七个习惯之四:双赢思维
  16. iOS RN学习随笔
  17. html5画布画出折线图,canvas 画出动态折线图
  18. Omi官方插件系列 - omi-transform介绍
  19. 在黑暗中哭泣的众筹,黎明的曙光还未到来
  20. DPDK flow_classify 源码阅读

热门文章

  1. 九、Android近场通信(NFC)
  2. 定时锁定计算机代码bat,用bat实现的自动关机的代码
  3. hdu 1845(最大匹配)
  4. 论文写作:MathType公式居中编号居右设置
  5. 原神ios android,原神苹果版如何用电脑玩 原神ios电脑版玩法教程
  6. 可乐瓶游戏c语言,大班活动玩可乐瓶教案
  7. 福成股份很忙:实控人李福成被罚8万,新董事长李良则要打官司
  8. 汽车金融风控企业如何开展风控体系建设
  9. 设计 | 最新免费无版权可商用字体下载
  10. 《那些年啊,那些事——一个程序员的奋斗史》五