第二节 zookeeper基础应用与实战

目录

1. Zookeeper命令操作

1.1 Zookeeper 数据模型

1.2 Zookeeper服务端常用命令

1.3 Zookeeper客户端常用命令

1.3.1 基本CRUD

1.3.2 创建临时&顺序节点

2. Zookeeper JavaAPI操作

2.1 Curator介绍

2.2 引入Curator

2.3 建立连接

2.4 添加节点

2.5 修改节点

2.6 删除节点

2.7 Watch事件监听

2.7.1 zkCli客户端使用watch

2.7.2 curator客户端使用watch


1. Zookeeper命令操作

1.1 Zookeeper 数据模型

ZooKeeper 是一个树形目录服务,其数据模型和Unix的文件系统目录树很类似,拥有一个层次化结构。

image.png

Zookeeper这里面的每一个节点都被称为: ZNode,每个节点上都会保存自己的数据和节点信息。

image.png

节点可以拥有子节点,同时也允许少量(1MB)数据存储在该节点之下。

节点可以分为四大类:

  • PERSISTENT 持久化节点

  • EPHEMERAL 临时节点 :-e

  • PERSISTENT_SEQUENTIAL 持久化顺序节点 :-s

  • EPHEMERAL_SEQUENTIAL 临时顺序节点 :-es

1.2 Zookeeper服务端常用命令

image.png

•启动 ZooKeeper 服务

./zkServer.sh start

•查看 ZooKeeper 服务状态

./zkServer.sh status

•停止 ZooKeeper 服务

./zkServer.sh stop 

•重启 ZooKeeper 服务

./zkServer.sh restart 

1.3 Zookeeper客户端常用命令

1.3.1 基本CRUD

  • 连接Zookeeper客户端

# 本地连接
zkCli.sh
​
# 远程连接
zkCli.sh -server ip:2181
  • 断开连接

quit
  • 查看命令帮助

help
  • 显示制定目录下节点

# ls 目录
ls /
  • 创建节点

# create /节点path value
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] create /app1 msb123
Created /app1
[zk: localhost:2181(CONNECTED) 2] ls /
[app1, zookeeper]
[zk: localhost:2181(CONNECTED) 3] create /app2
Created /app2
[zk: localhost:2181(CONNECTED) 4] ls /
[app1, app2, zookeeper]
  • 获取节点值

# get /节点path
[zk: localhost:2181(CONNECTED) 15] get /app1
msb123
[zk: localhost:2181(CONNECTED) 16] get /app2
null
  • 设置节点值

# set /节点path value
[zk: localhost:2181(CONNECTED) 17] set /app2 msb456
[zk: localhost:2181(CONNECTED) 18] get /app2
msb456
  • 删除单个节点

# delete /节点path
[zk: localhost:2181(CONNECTED) 19] delete /app2
[zk: localhost:2181(CONNECTED) 20] get /app2
Node does not exist: /app2
[zk: localhost:2181(CONNECTED) 21] ls /
[app1, zookeeper]
  • 删除带有子节点的节点

# deleteall /节点path
[zk: localhost:2181(CONNECTED) 22] create /app1
Node already exists: /app1
[zk: localhost:2181(CONNECTED) 23] create /app1/p1
Created /app1/p1
[zk: localhost:2181(CONNECTED) 24] create /app1/p2
Created /app1/p2
[zk: localhost:2181(CONNECTED) 25] delete /app1
Node not empty: /app1
[zk: localhost:2181(CONNECTED) 26] deleteall /app1
[zk: localhost:2181(CONNECTED) 27] ls /
[zookeeper]

1.3.2 创建临时&顺序节点

  • 创建临时节点 (-e)

    • 临时节点是在会话结束后,自动被删除的

# create -e /节点path value
[zk: localhost:2181(CONNECTED) 29] create -e /app1 msb123
Created /app1
[zk: localhost:2181(CONNECTED) 30] get /app1
msb123
[zk: localhost:2181(CONNECTED) 31] quit# 退出后再次连接,临时节点已经删除
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
  • 创建顺序节点 (-s)

    • 创建出的节点,根据先后顺序,会在节点之后带上一个数值,越后执行数值越大,适用于分布式锁的应用场景- 单调递增.

# create -s /节点path value
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] create -s /app2
Created /app20000000003
[zk: localhost:2181(CONNECTED) 2] ls /
[app20000000003, zookeeper]
[zk: localhost:2181(CONNECTED) 3] create -s /app2 
Created /app20000000004
[zk: localhost:2181(CONNECTED) 4] ls /
[app20000000003, app20000000004, zookeeper]
[zk: localhost:2181(CONNECTED) 5] create -s /app2 
Created /app20000000005
[zk: localhost:2181(CONNECTED) 6] ls /
[app20000000003, app20000000004, app20000000005, zookeeper]# 创建临时顺序节点
[zk: localhost:2181(CONNECTED) 7] create -es /app3
Created /app30000000006
[zk: localhost:2181(CONNECTED) 8] ls /
[app20000000003, app20000000004, app20000000005, app30000000006, zookeeper]
# 退出
[zk: localhost:2181(CONNECTED) 9] quit# 重新链接,临时顺序节点已经被删除
[zk: localhost:2181(CONNECTED) 0] ls /
[app20000000003, app20000000004, app20000000005, zookeeper]

image.png

  • 查询节点详细信息

# ls –s /节点path 
[zk: localhost:2181(CONNECTED) 5] ls / -s
[app20000000003, app20000000004, app20000000005, zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x14
cversion = 10
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 4
  • czxid:节点被创建的事务ID

  • ctime: 创建时间

  • mzxid: 最后一次被更新的事务ID

  • mtime: 修改时间

  • pzxid:子节点列表最后一次被更新的事务ID

  • cversion:子节点的版本号

  • dataversion:数据版本号

  • aclversion:权限版本号

  • ephemeralOwner:用于临时节点,代表临时节点的事务ID,如果为持久节点则为0

  • dataLength:节点存储的数据的长度

  • numChildren:当前节点的子节点个数

2. Zookeeper JavaAPI操作

2.1 Curator介绍

Curator是Netflix公司开源的一套zookeeper客户端框架,Curator是对Zookeeper支持最好的客户端框架。Curator封装了大部分Zookeeper的功能,比如Leader选举、分布式锁等,减少了技术人员在使用Zookeeper时的底层细节开发工作。

Curator框架主要解决了三类问题:

  • 封装ZooKeeper Client与ZooKeeper Server之间的连接处理(提供连接重试机制等)。

  • 提供了一套Fluent风格的API,并且在Java客户端原生API的基础上进行了增强(创捷多层节点、删除多层节点等)。

  • 提供ZooKeeper各种应用场景(分布式锁、leader选举、共享计数器、分布式队列等)的抽象封装。

2.2 引入Curator

  • 创建maven项目,引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.mashibing</groupId><artifactId>zk-client1</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency><!--curator--><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.0.0</version></dependency><!--日志--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
</project>

2.3 建立连接

方式1

public class CuratorTest {/*** 建立连接*/@Testpublic void testConnect(){/*** String connectString     连接字符串。 zk地址和端口: "192.168.58.100:2181,192.168.58.101:2181"* int sessionTimeoutMs     会话超时时间 单位ms* int connectionTimeoutMs  连接超时时间 单位ms* RetryPolicy retryPolicy  重试策略*///1. 第一种方式//重试策略 baseSleepTimeMs 重试之间等待的初始时间,maxRetries 重试的最大次数RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,10);CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.58.100:2181", 60 * 1000,15 * 1000, retryPolicy);//开启连接client.start();}
}

重试策略

  • RetryNTimes: 重试没有次数限制

  • RetryOneTime:只重试没有次数限制,一般也不常用

  • ExponentialBackoffRetry: 只重试一次的重试策略

方式2

public class CuratorTest {private CuratorFramework client;/*** 建立连接*/@Testpublic void testConnect(){/*** String connectString     连接字符串。 zk地址和端口: "192.168.58.100:2181,192.168.58.101:2181"* int sessionTimeoutMs     会话超时时间 单位ms* int connectionTimeoutMs  连接超时时间 单位ms* RetryPolicy retryPolicy  重试策略*///1. 第一种方式//重试策略 baseSleepTimeMs 重试之间等待的初始时间,maxRetries 重试的最大次数RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,10);//      client   = CuratorFrameworkFactory.newClient("192.168.58.100:2181", 60 * 1000,
//                15 * 1000, retryPolicy);//2. 第二种方式,建造者方式创建client = CuratorFrameworkFactory.builder().connectString("192.168.58.100:2181").sessionTimeoutMs(60*1000).connectionTimeoutMs(15 * 1000).retryPolicy(retryPolicy).namespace("mashibing")  //根节点名称设置.build();//开启连接client.start();}
}

2.4 添加节点

修改testConnect注解,@Before

   /*** 建立连接*/@Beforepublic void testConnect()

创建节点:create 持久 临时 顺序 数据

public class CuratorTest {/*** 创建节点 create 持久 临时 顺序 数据*///1.创建节点@Testpublic void testCreate1() throws Exception {// 如果没有创建节点,没有指定数据,则默认将当前客户端的IP 作为数据存储String path = client.create().forPath("/app1");System.out.println(path);}@Afterpublic void close(){client.close();}
}

image.png

    //2.创建节点 带有数据@Testpublic void testCreate2() throws Exception {String path = client.create().forPath("/app2","hehe".getBytes());System.out.println(path);}

image.png

    //3.设置节点类型 默认持久化@Testpublic void testCreate3() throws Exception {//设置临时节点String path = client.create().withMode(CreateMode.EPHEMERAL).forPath("/app3");System.out.println(path);}

由于是临时节点,需要打断点才能看到节点信息

image.png

//1.查询数据 getData
@Test
public void testGet1() throws Exception {byte[] data = client.getData().forPath("/app1");System.out.println(new String(data));
}//2.查询子节点 getChildren()
@Test
public void testGet2() throws Exception {List<String> path = client.getChildren().forPath("/");System.out.println(path);
}//3.查询节点状态信息
@Test
public void testGet3() throws Exception {Stat status = new Stat();System.out.println(status);//查询节点状态信息: ls -sclient.getData().storingStatIn(status).forPath("/app1");System.out.println(status);
}

2.5 修改节点

    //1. 基本数据修改@Testpublic void testSet() throws Exception {client.setData().forPath("/app1","hahaha".getBytes());}//根据版本修改(乐观锁)@Testpublic void testSetVersion() throws Exception {//查询版本Stat status = new Stat();//查询节点状态信息: ls -sclient.getData().storingStatIn(status).forPath("/app1");int version = status.getVersion();System.out.println(version);  //2client.setData().withVersion(version).forPath("/app1","hehe".getBytes());}

image.png

2.6 删除节点

    //1.删除单个节点@Testpublic void testDelete1() throws Exception {client.delete().forPath("/app4");}//删除带有子节点的节点@Testpublic void testDelete2() throws Exception {client.delete().deletingChildrenIfNeeded().forPath("/app4");}//必须删除成功(超时情况下,重试删除)@Testpublic void testDelete3() throws Exception {client.delete().guaranteed().forPath("/app2");}//回调 删除完成后执行@Testpublic void testDelete4() throws Exception {client.delete().guaranteed().inBackground((curatorFramework, curatorEvent) -> {System.out.println("我被删除了");System.out.println(curatorEvent);}).forPath("/app1");}

2.7 Watch事件监听

ZooKeeper 允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。

ZooKeeper 中引入了Watcher机制来实现了发布/订阅功能能,能够让多个订阅者同时监听某一个对象,当一个对象自身状态变化时,会通知所有订阅者。

image.png

2.7.1 zkCli客户端使用watch

添加 -w 参数可实时监听节点与子节点的变化,并且实时收到通知。非常适用保障分布式情况下的数据一至性。

其使用方式如下

命令描述
ls -w path监听子节点的变化(增,删) [监听目录]
get -w path监听节点数据的变化
stat -w path监听节点属性的变化

Zookeeper事件类型

  • NodeCreated: 节点创建

  • NodeDeleted: 节点删除

  • NodeDataChanged:节点数据变化

  • NodeChildrenChanged:子节点列表变化

  • DataWatchRemoved:节点监听被移除

  • ChildWatchRemoved:子节点监听被移除

1)get -w path 监听节点数据变化

  • 会话1

    image.png

  • 会话2

    image.png

  • 再回到会话一

    image.png

2) ls -w /path 监听子节点的变化(增,删) [监听目录]

  • 会话1

    image.png

  • 会话2

    image.png

  • 切到【会话一】 观察输出的监听日志

    image.png

当然了 delete 目录,也会发生变化

如果对节点数据内容,ls -w 是收不到通知的,只能通过 get -w来实现 。

这里,监听一点触发,就失效了,切记。

3) ls -R -w /path 例子二 循环递归的监听

image.png

image.png

2.7.2 curator客户端使用watch

ZooKeeper 原生支持通过注册Watcher来进行事件监听,但是其使用并不是特别方便需要开发人员自己反复注册Watcher,比较繁琐。

Curator引入了 Cache 来实现对 ZooKeeper 服务端事件的监听。

ZooKeeper提供了三种Watcher:

  • NodeCache : 只是监听某一个特定的节点

  • PathChildrenCache : 监控一个ZNode的子节点.

  • TreeCache : 可以监控整个树上的所有节点,类似于PathChildrenCache和NodeCache的组合

1)watch监听 NodeCache

public class CuratorWatchTest {/*** 演示 NodeCache : 给指定一个节点注册监听*/@Testpublic void testNodeCache() throws Exception {//1. 创建NodeCache对象NodeCache nodeCache = new NodeCache(client, "/app1");  //监听的是 /mashibing和其子目录app1//2. 注册监听nodeCache.getListenable().addListener(new NodeCacheListener() {@Overridepublic void nodeChanged() throws Exception {System.out.println("节点变化了。。。。。。");//获取修改节点后的数据byte[] data = nodeCache.getCurrentData().getData();System.out.println(new String(data));}});//3. 设置为true,开启监听nodeCache.start(true);while(true){}} 
}

image.png

2)watch监听 PathChildrenCache

    /*** 演示 PathChildrenCache: 监听某个节点的所有子节点*/@Testpublic void testPathChildrenCache() throws Exception {//1.创建监听器对象 (第三个参数表示缓存每次节点更新后的数据)PathChildrenCache pathChildrenCache = new PathChildrenCache(client, "/app2", true);//2.绑定监听器pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {@Overridepublic void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {System.out.println("子节点发生变化了。。。。。。");System.out.println(pathChildrenCacheEvent);if(PathChildrenCacheEvent.Type.CHILD_UPDATED == pathChildrenCacheEvent.getType()){//更新子节点System.out.println("子节点更新了!");//在一个getData中有很多数据,我们只拿data部分byte[] data = pathChildrenCacheEvent.getData().getData();System.out.println("更新后的值为:" + new String(data));}else if(PathChildrenCacheEvent.Type.CHILD_ADDED == pathChildrenCacheEvent.getType()){//添加子节点System.out.println("添加子节点!");String path = pathChildrenCacheEvent.getData().getPath();System.out.println("子节点路径为: " + path);}else if(PathChildrenCacheEvent.Type.CHILD_REMOVED == pathChildrenCacheEvent.getType()){//删除子节点System.out.println("删除了子节点");String path = pathChildrenCacheEvent.getData().getPath();System.out.println("子节点路径为: " + path);}}});//3. 开启pathChildrenCache.start();while(true){}}

image.png

事件对象信息分析

PathChildrenCacheEvent{type=CHILD_UPDATED, data=ChildData{path='/app2/m1', stat=164,166,1670114647087,1670114698259,1,0,0,0,3,0,164, data=[49, 50, 51]}
}

image.png

3)watch监听 TreeCache

TreeCache相当于NodeCache(只监听当前结点)+ PathChildrenCache(只监听子结点)的结合版,即监听当前和子结点。

  /*** 演示 TreeCache: 监听某个节点的所有子节点*/@Testpublic void testCache() throws Exception {//1.创建监听器对象TreeCache treeCache = new TreeCache(client, "/app2");//2.绑定监听器treeCache.getListenable().addListener(new TreeCacheListener() {@Overridepublic void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {System.out.println("节点变化了");System.out.println(treeCacheEvent);if(TreeCacheEvent.Type.NODE_UPDATED == treeCacheEvent.getType()){//更新节点System.out.println("节点更新了!");//在一个getData中有很多数据,我们只拿data部分byte[] data = treeCacheEvent.getData().getData();System.out.println("更新后的值为:" + new String(data));}else if(TreeCacheEvent.Type.NODE_ADDED == treeCacheEvent.getType()){//添加子节点System.out.println("添加节点!");String path = treeCacheEvent.getData().getPath();System.out.println("子节点路径为: " + path);}else if(TreeCacheEvent.Type.NODE_REMOVED == treeCacheEvent.getType()){//删除子节点System.out.println("删除节点");String path = treeCacheEvent.getData().getPath();System.out.println("删除节点路径为: " + path);}}});//3. 开启treeCache.start();while(true){}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/678139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之AlphabetIndexer组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之AlphabetIndexer组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、AlphabetIndexer组件 可以与容器组件联动用于按逻辑结构快速定位容器显…

vue核心技术(二)

◆ 指令补充 指令修饰符 通过 "." 指明一些指令 后缀&#xff0c;不同 后缀 封装了不同的处理操作 → 简化代码 v-bind 对于样式控制的增强 为了方便开发者进行样式控制&#xff0c; Vue 扩展了 v-bind 的语法&#xff0c;可以针对 class 类名 和 style 行内样式…

KAJIMA CORPORATION CONTEST 2024(AtCoder Beginner Contest 340)ABCDEF 视频讲解

这场比较郁闷&#xff0c;C题短路&#xff0c;连续4次WA&#xff0c;导致罚时太多 A - Arithmetic Progression Problem Statement Print an arithmetic sequence with first term A A A, last term B B B, and common difference D D D. You are only given inputs for w…

BootstrapBlazor 模板适配移动设备使用笔记

项目模板 Bootstrap Blazor App 模板 为了方便大家利用这套组件快速搭建项目&#xff0c;作者制作了 项目模板&#xff08;Project Templates&#xff09;&#xff0c;使用 dotnet new 命令行模式&#xff0c;使用步骤如下&#xff1a; 安装项目模板 dotnet new install Boo…

007集——数据存储的端序(大端序和小端序转换代码)——VB/VBA

VB/VBA存储的端序 1、要想制造高性能的VB/VBA代码&#xff0c;离了指针是很难办到的。 2、因为VB/VBA里&#xff0c;用Long来表示指针&#xff0c;而32位(包括64位兼容的)计算机里4字节整数的处理&#xff0c;是最快的方式&#xff01; 3、要想用指针来处理数据&#xff0c;…

fast.ai 深度学习笔记(六)

深度学习 2&#xff1a;第 2 部分第 12 课 原文&#xff1a;medium.com/hiromi_suenaga/deep-learning-2-part-2-lesson-12-215dfbf04a94 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;…

Vue-55、Vue技术vuex模块化

一、代码 1、store.js //改文件用于创建最为核心的store //引入vue import Vue from "vue"; //引入vuex import Vuex from vuex;//求和功能相关的配置 const countOptions{namespaced:true,actions:{jia:function (context,value) {console.log(action中的jia被调…

C语言什么是悬空指针?

一、问题 什么是悬空指针&#xff1f;为什么会出现&#xff1f;我们该如何避免悬空指针的出现&#xff1f; 二、解答 在C语言中&#xff0c;悬空指针指的是指向已删除&#xff08;或释放&#xff09;的内存位置的指针。如果一个指针指向的内存被释放&#xff0c;但指针本身并未…

如何实现视线(目光)的检测与实时跟踪

如何实现视线(目光)的检测与实时跟踪 核心步骤展示说明 找到人脸 检测人脸特征点 根据特征点找到人眼区域 高精度梯度算法检测瞳孔中心 根据眼睛周边特征点计算眼睛中心 瞳孔中心和眼睛中心基于视线模型计算视线方向 视线方向可视化 详细实现与说明&#xff1a; https://stud…

ubuntu20.04 安装mysql(8.x)

安装mysql命令 sudo apt-get install mysql-server安装完毕后&#xff0c;立即初始化密码 sudo mysql -u root # 初次进入终端无需密码ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY yourpasswd; # 设置本地root密码设置mysql远程登录 设置远程登录账…

Linux目录的 /usr/bin 和 /usr/local/bin 的区别

Linux目录的 /usr/bin 和 /usr/local/bin 的区别 usr 是指 Unix System Resource&#xff0c;而不是User usr 是 Unix System Resource&#xff0c;而不是User /usr/bin下面的都是系统预装的可执行程序&#xff0c;系统升级有可能会被覆盖. /usr/local/bin 目录是给用户放置…

【深度学习】:实验6布置,图像自然语言描述生成(让计算机“看图说话”)

清华大学驭风计划 因为篇幅原因实验答案分开上传&#xff0c;深度学习专栏持续更新中&#xff0c;期待的小伙伴敬请关注 实验答案链接http://t.csdnimg.cn/bA48U 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 案例 6 &#xff1a;图像自…

Hadoop运行环境搭建

模板虚拟机环境准备 1&#xff09;准备一台模板虚拟机hadoop100&#xff0c;虚拟机配置要求如下&#xff1a; 模板虚拟机&#xff1a;内存4G&#xff0c;硬盘50G&#xff0c;安装必要环境&#xff0c;为安装hadoop做准备 [roothadoop100 ~]# yum install -y epel-release [r…

命令行随笔

1、xargs xargs命令是将 前一个命令的标准输出作为后一个命令的命令行参数&#xff0c;xargs的默认命令是echo&#xff0c;默认定界符是空格和回车。 而管道是将 前一个命令的标准输出作为后一个命令的标准输入 echo例子 # echo "apple banana orange" | xargs e…

MySQL篇----第十八篇

系列文章目录 文章目录 系列文章目录前言一、SQL 语言包括哪几部分?每部分都有哪些操作关键二、完整性约束包括哪些?三、什么是锁?四、什么叫视图?游标是什么?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,…

梯度提升树系列8——GBDT与其他集成学习方法的比较

目录 写在开头1. 主要集成学习算法对比1.1 GBDT1.2 随机森林1.3 AdaBoost1.4 整体对比2. 算法性能的比较分析2.1 准确率与性能2.2 训练时间和模型复杂度2.3 应用实例和案例研究3. 选择合适算法的标准3.1 数据集的特性3.1.1 数据规模与维度3.1.2 数据质量3.2 性能需求3.2.1 准确…

Unity报错Currently selected scripting backend (IL2CPP) is not installed

目录 什么是il2cpp il2cpp换mono Unity打包报错Currently selected scripting backend (IL2CPP) is not installed 什么是il2cpp Unity 编辑器模式下是采用.net 虚拟机解释执行.net 代码,发布的时候有两种模式,一种是mono虚拟机模式,一种是il2cpp模式。由于iOS AppStore…

pandas dataframe写入excel的多个sheet页面

pandas根据dataframe生成一个excel文件&#xff1a; Dataframe保存新文件 直接把dataframe格式的数据保存到多个sheet页程序如下&#xff1a; excel_file "导出excel文件.xlsx" if os.path.exists(excel_file):os.remove(excel_file)# 生成一个新文件 with pd.Ex…

怎么对接快团团团长?如何对接快团团团长?

1、首先来说&#xff0c;你要需要&#xff0c;树立良好的心态&#xff0c;拓展快团团大团长合作和开发传统渠道是一样的&#xff0c;能有10%的回复率就不错了&#xff0c;反复几次沟通也是非常有必要的。要有“大团长思维”&#xff0c;就是换位思考&#xff0c;他们是处于什么…

Unity类银河恶魔城学习记录3-6 Finalize BattleState源代码 P52

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Enemy.cs using System.Collections; using System.Collections.Generic; …