【Hadoop大数据技术】——ZooKeeper分布式协调服务(学习笔记(1)

cd /opt/zookeeper/data/zk1
echo 1 > myid
cd /opt/zookeeper/data/zk2
echo 2 > myid
cd /opt/zookeeper/data/zk3
echo 3 > myid

🕘 5.3 启动Zookeeper

cd /opt/zookeeper/
sudo chmod -R 777 data/

./bin/zkServer.sh start conf/zoo1.cfg
./bin/zkServer.sh start conf/zoo2.cfg
./bin/zkServer.sh start conf/zoo3.cfg

查看启动状态:

./bin/zkServer.sh status conf/zoo1.cfg
./bin/zkServer.sh status conf/zoo2.cfg
./bin/zkServer.sh status conf/zoo3.cfg

运行截图:
在这里插入图片描述在这里插入图片描述

验证zookeeper安装的正确性:

./bin/zkCli.sh -server 127.0.0.1:2182

在这里插入图片描述

如果连接成功,会有Welcome to zookeeper!和state状态等信息。证明已经成功连接到zookeeper服务。

停止server的命令:

./bin/zkServer.sh stop conf/zoo1.cfg
./bin/zkServer.sh stop conf/zoo2.cfg
./bin/zkServer.sh stop conf/zoo3.cfg

🕒 6. ZooKeeper的Shell操作

🕘 6.1 帮助手册

[zk: 127.0.0.1:2182(CONNECTED) 0] help
ZooKeeper -server host:port -client-configuration properties-file cmd args
	addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT\_RECURSIVE] - default is PERSISTENT\_RECURSIVE
	addauth scheme auth
	close 
	config [-c] [-w] [-s]
	connect host:port
	create [-s] [-e] [-c] [-t ttl] path [data] [acl]
	delete [-v version] path
	deleteall path [-b batch size]
	delquota [-n|-b|-N|-B] path
	get [-s] [-w] path
	getAcl [-s] path
	getAllChildrenNumber path
	getEphemerals path
	history 
	listquota path
	ls [-s] [-w] [-R] path
	printwatches on|off
	quit 
	reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
	redo cmdno
	removewatches path [-c|-d|-a] [-l]
	set [-s] [-v version] path data
	setAcl [-s] [-v version] [-R] path acl
	setquota -n|-b|-N|-B val path
	stat [-w] path
	sync path
	version 
	whoami 
Command not found: Command not found help
[zk: 127.0.0.1:2182(CONNECTED) 1] 

🕘 6.2 查看当前节点数据

在这里插入图片描述

🕘 6.3 查看当前Zookeeper中所包含的内容

在这里插入图片描述

🕘 6.4 创建节点

创建节点命令格式:create [-s] [-e] [-c] [-t ttl] path [data] [acl]

  • -s:指定ZNode的类型为顺序节点。
  • -e:指定ZNode的类型为临时节点,若不指定,则表示永久节点。
  • path:表示创建的路径
  • data:表示创建节点的数据,这是因为Znode可以像目录一样存在也可以像文件一样保存数据。
  • Acl:进行权限控制。一般不需要了解。

示例:创建临时节点
在这里插入图片描述

🕘 6.5 获取节点

获取节点命令格式:get [-s] [-w] path

  • -s:查看指定ZNode的属性。
  • -w:向指定ZNode注册Watcher。

获取Zookeeper指定节点的数据内容以及属性信息:

在这里插入图片描述

🕘 6.6 修改节点

修改节点命令格式:set [-s] [-v version] path data

  • data:表示要修改的内容,该数据内容不允许出现空格。
  • version:表示数据版本

对前面创建的临时节点testnode-temp进行修改,使得节点内容变成“123”的操作:

在这里插入图片描述

🕘 6.7 监听节点

监听节点就是监听节点变化,概括为三个过程。客户端向服务端注册Watch、服务端事件发生触发Watch、客户端回调Watch得到触发事件的情况。

在这里插入图片描述

🕘 6.8 删除节点

删除节点命令格式:delete [-v version] path

使用delete命令删除节点时,若要删除的节点存在子节点,就无法删除该节点,必须先删除子节点,才可删除父节点。使用rmr命令递归删除节点,不论该节点下是否存在子节点,可以直接删除。

在这里插入图片描述

🕒 7. ZooKeeper的Java API操作

Zookeeper API包含五个包:

org.apache.zookeeper
org.apache.zookeeper.data
org.apache.zookeeper.server
org.apache.zookeeper.server.quorum
org.apache.zookeeper.server.upgrade

org.apache.zookeeper包含Zookeeper类,这也是编程时最常用的类文件,Zookeeper类提供的常用Java API方法。

方法名称方法描述
create创建节点
delete删除节点
exists判断节点是否存在
get/setData获取/修改节点数据
getChildren获取指定节点下的所有子节点列表

🕘 7.1 在Eclipse中搭建ZooKeeper环境

新建Java项目,取名ZooKeeperDemo,之后Next,添加依赖

在这里插入图片描述

导入全部依赖,之后新建类ZKTest,开始写代码

🕘 7.2 创建会话

import org.apache.zookeeper.\*;
import org.apache.zookeeper.data.Stat;

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

public class ZKTest {
	public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        getConnect();
        
	}
	
	// 连接ZooKeeper服务
	public static ZooKeeper getConnect()
            throws IOException,InterruptedException {
        String zkServer = "Ubuntu:2181";		// 此处Ubuntu改成自己的主机名
        CountDownLatch countDownLatch = new CountDownLatch(1);
        ZooKeeper zooKeeper = new ZooKeeper(zkServer, 3000, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                System.out.println("通知状态:"+watchedEvent.getState() + "\t"
                        + "事件类型:" + watchedEvent.getType() + "\t"
                        + "节点路径:" + watchedEvent.getPath());
                if (Event.KeeperState.SyncConnected == watchedEvent.getState()){
                    countDownLatch.countDown();
                }
            }
        });
        countDownLatch.await();
        return zooKeeper;
    }
}

在这里插入图片描述
如图所示即成功连接。

🕘 7.3 创建ZNode

创建持久节点zkapi,并且在持久节点zkapi中挂载子节点zkChild,该子节点的ZNode类型为持久节点,createNode()方法的代码如下。

public class ZKTest {
	public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        createNode();
	}
	
	// 使用create方法创建ZNode
    public static void createNode()
            throws IOException, InterruptedException, KeeperException {
        ZooKeeper connect = getConnect();
        connect.create(
                "/zkapi",
                "fruit".getBytes(),
                ZooDefs.Ids.OPEN\_ACL\_UNSAFE,
                CreateMode.PERSISTENT);
        connect.create(
                "/zkapi/zkChild",
                "apple".getBytes(),
                ZooDefs.Ids.OPEN\_ACL\_UNSAFE,
                CreateMode.PERSISTENT);
    }
}

在这里插入图片描述

🕘 7.4 判断ZNode是否存在

判断永久节点zkapi是否存在,existsNode()方法的代码如下所示。

public class ZKTest {
	public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
	    Stat stat = existsNode();
        if (stat != null){
            System.out.println("已存在");
        }else {
            System.out.println("不存在");
        }
	}
	
	// 使用exists方法判断ZNode是否存在
	public static Stat existsNode()	 
			throws IOException, InterruptedException, KeeperException {
		ZooKeeper connect = getConnect();
		Stat exists = connect.exists("/zkapi", true);
		return exists;
	}
}

在这里插入图片描述

🕘 7.5 获取ZNode的数据内容

获取永久节点zkapi的数据内容,getNode()方法的代码如下所示。

public class ZKTest {
	public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
	    byte[] nodeData = getNode();
        System.out.println("持久节点zkapi的数据内容为:"+new String(nodeData));
	}
	
	// 使用getData方法获取ZNode的数据内容
	public static byte[] getNode() 
			 throws IOException, InterruptedException, KeeperException {
		 ZooKeeper connect = getConnect();
		 byte[] data = connect.getData("/zkapi", true, null);
		 return data;
	}
}

在这里插入图片描述

🕘 7.6 修改ZNode的数据内容

将持久节点zkapi的数据内容修改为fruit_new,updateNode()方法的代码如下。

public class ZKTest {
	public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        Stat beforeStat = existsNode();
        System.out.println("持久节点zkapi修改数据内容前的数据版本号:"
                +beforeStat.getVersion());
        System.out.println("持久节点zkapi修改数据内容前的数据内容长度:"
                +beforeStat.getDataLength());
        byte[] beforeNode = getNode();
        System.out.println("持久节点zkapi修改数据内容前的数据内容:"
                +new String(beforeNode));
        Stat afterStat = updateNode();
        System.out.println("持久节点zkapi修改数据内容后的数据版本号:"
                +afterStat.getVersion());
        System.out.println("持久节点zkapi修改数据内容后的数据内容长度:"
                +afterStat.getDataLength());
        byte[] afterNode = getNode();
        System.out.println("持久节点zkapi修改数据内容后的数据内容:"
                +new String(afterNode));
	
	}
	
	// 使用setData方法修改ZNode的数据内容
	public static Stat updateNode()
			throws IOException, InterruptedException, KeeperException {
		ZooKeeper connect = getConnect();
		Stat stat = connect.setData(
		      "/zkapi",
		      "fruit\_new".getBytes(),
		      -1);
		return stat;
	}
}

在这里插入图片描述

🕘 7.7 查看ZNode的子节点列表

查看持久节点zkapi的子节点列表,getChildNode()方法的代码如下。

public class ZKTest {
	public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        List<String> childNodes = getChildNode();
        for (String childNode : childNodes) {
            System.out.println("持久节点zkapi的子节点:"+childNode);
        }
	
	}
	
	// 使用getChildren方法查看ZNode的子节点列表
	public static List<String> getChildNode()
			  throws IOException, InterruptedException, KeeperException {
		  ZooKeeper connect = getConnect();
		  List<String> nodeList = connect.getChildren("/zkapi", false);
		  return nodeList;
	}
}

在这里插入图片描述

🕘 7.8 删除ZNode

该方法用于删除持久节点zkapi的子节点zkChild,deleteNode()方法的代码如下。

public class ZKTest {
	public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        deleteNode();
	    List<String> childNodes = getChildNode();
	    for (String childNode : childNodes) {
	        System.out.println("持久节点zkapi的子节点:"+childNode);
	    }
	
	}
	
	// 使用delete方法删除ZNode
	public static void deleteNode()
			 throws IOException, InterruptedException, KeeperException {
	      ZooKeeper connect = getConnect();
	      connect.delete("/zkapi/zkChild",-1);
	}
}

在这里插入图片描述

🕒 8. ZooKeeper典型应用场景

🕘 8.1 数据发布/订阅

数据发布/订阅,顾名思义就是发布者将数据发布到ZooKeeper的一个或一系列ZNode上,供订阅者进行数据订阅,达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新。
在数据发布/订阅中应用ZooKeeper时,订阅者会向ZooKeeper指定的ZNode注册一个Watcher进行监听,一旦该ZNode的数据发生变化,那么ZooKeeper就会向相应的订阅者发送事件通知,当订阅者接收到这个通知后,便会主动到ZooKeeper指定的Znode中获取最新的数据。

🕘 8.2 命名服务

命名服务也是分布式系统中比较常见的一类应用场景,它是分布式应用最基础的公共服务之一。在分布式应用中,被命名的实体通常可以是集群中的服务器、提供服务的地址或远程对象等,这些实体我们都可以统称为命名空间(NameSpace),其中较为常见的就是一些分布式服务框架(如RPC、RMI)中的服务地址列表,通过命名服务,客户端能够根据指定名字从ZooKeeper来获取资源的实体、服务地址和提供者等信息。

🕘 8.3 分布式锁

分布式锁是控制分布式应用之间同步访问共享资源的一种方式。如果不同的应用或是同一应用的不同主机之间共享资源,那么访问这些资源的时候,往往需要通过一些互斥手段来防止彼此之间的干扰,以保证一致性,在这种情况下,就需要使用分布式锁。分布式锁的类型主要分为排他锁和共享锁。

🕒 9. 课后习题

选择题
1、Zookeeper启动时会最多监听几个端口()
A、1
B、2
C、3
D、4

2、下列关于zookeeper描述正确的是:()
A、无论客户端连接的是哪个Zookeeper服务器,其看到的服务端数据模型都是一致的
B、从同一个客户端发起的事务请求,最终将会严格按照其发起顺序被应用到zookeeper中
C、在一个5个节点组成的Zookeeper集群中,如果同时有3台机器宕机,服务不受影响
D、如果客户端连接到Zookeeper集群中的那台机器突然宕机,客户端会自动切换连接到集群其他机器

答案:1.B(集群运行:一个是提供服务的端口,供客户端连接
一个是集群时leader选举的端口,在选举leader时,使用这个端口进行相互通讯) 2.A(B是不同客户端、C是服务失效、D是不会自动切换)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

…(img-7JxGlpuG-1712996952571)]
[外链图片转存中…(img-QfJK7ceR-1712996952571)]
[外链图片转存中…(img-EPzWN3VW-1712996952571)]
[外链图片转存中…(img-eaIbuikl-1712996952572)]
[外链图片转存中…(img-h24qbBPH-1712996952572)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-s3ThrkiR-1712996952572)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值