分布式集群——jdk配置与zookeeper环境搭建

系列文章目录

分布式集群——jdk配置与zookeeper环境搭建

分布式集群——搭建Hadoop环境以及相关的Hadoop介绍

文章目录

系列文章目录

前言

一 zookeeper介绍与环境配置

1.1 zookeeper的学习

1.2 Zookeeper的主要功能

1.2.1 znode的节点类型

1.2.2 zookeeper的实现

1.3 Zookeeper的特征

zookeeper的几种角色?

1.4 关于zookeeper的文件系统

1.5 zookeeper的角色

1.6 zookeeper的选举机制

1.7 配置免密登录

1.8 安装jdk

1.9 安装配置zookeeper1环境

(1)下载Zookeeper的压缩包

(2)解压缩

(3)修改配置文件

(4)添加myid配置

(5)安装包分发并修改myid的值。

(6)三台机器启动zookeeper服务

二 实战zookeeper

2.1事务型请求与非事务型请求

2.查看当前节点详细数据

2. zookeeper的监听器Watcher

三 Zookeeper的JavaAPI操作

3.1 创建IDEA项目

3.1.1 创建Maven项目

3.1.2 添加项目名称以及项目存放位置

3.2 在pom.xml文件里面添加依赖

3.3 创建APP类

3.4 对监听进行测试

四 补充内容

4.1 sleep()和wait()的区别

总结


前言

本文主要介绍分布式集群搭建,jdk配置以及zookeeper环境配置,以及相关的zookeeper客户端常见的命令介绍,与zookeeper的JavaAPI操作。以下的案例仅供参考。

一 zookeeper介绍与环境配置

1.1 zookeeper的学习

一个开源的分布式协调服务框架,它是集群的管理者。 常用用途:它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。

通供了新增、删除、修改、监听等等功能

ZooKeeper具有高可用性的原因:因为Zookeeper集群中所有的机器都有相同的副本,ZooKeeper本质上是一个分布式文件系统,本身也是一个集群,适合存放小文件(单个文件最好不要超过IM)

1.2 Zookeeper的主要功能

  1. 配置管理(Zookeeper作为配置中心来进行管理)

  2. 分布式锁(Zookeeper提供分布式锁)

  3. 集群管理(Zookeeper作为注册中心来使用)

  4. 统一命名

1.2.1 znode的节点类型

Znode有两种,分为临时节点( 生命周期和会话一样,不能有子节点 )永久节点。Znode还有一个序列化【有顺序】的特性分为四类:

  • 永久节点

  • 临时节点

  • 永久序列化节点【序列化是指有顺序的序列化】

  • 临时序列化节点【序列化是指有顺序的序列化】

  • 顺序的临时节点【会话级别】

  • 临时的非顺序节点

  • 永久的非顺序节点

  • 永久的顺序节点

序列化【Java里面的list,hadoop里面的序列化】

1.2.2 zookeeper的实现

主要通过zookeeper文件系统特性,监听机制,订阅/服务

1.3 Zookeeper的特征

  • 他的核心是一个精简的文件系统,提供了一些简单的操作。

  • 文件系统中的文件及文件夹都是znode。是文件也是文件夹。

  • znode不能大,集群中都是该文件系统的完全副本。

一个领导者,多个学习者(跟随者 + 观察者)组成的集群。 集群中只有半数以上的节点存活,Zookeeper集群才可以正常服务。集群都是单数,3台,5台。

全局数据一致性:每个Server保存一份相同的数据副本,Client无论连接到哪一个Server,数据都是一致的。

更新请求是顺序进行的。 数据更新原子性,一次数据更新要么成功,要么失败。 实时性,在一定时间范围内,Client能读到最新数据。(因为数据量小,所以,会非常的快)。

Client的可以进行读请求(非事务性请求)和写请求(事务性请求)。读请求在非Leader机器上是可以进行处理的,但是写请求,非Leader机器是无权处理,他需要将这个请求再提交给Leader机器处理。

zookeeper的几种角色?

领导者:

  • 1.集群管理者

  • 2.处理事务型操作

  • 3.参与投票,选举

跟随者

  • 1.处理客户端非事务请求

  • 2.转发事务型请求给leader

  • 3.参与投票权限

观察者

  • 1.处理客户端非事务请求

  • 2.转发事务型请求给leader

  • 3.无参与投票权限

关于Zookeeper集群的一些特点:

  • 一个领导者,多个学习者(跟随者+观察者)组成的集群。

  • 集群中只有半数以上的节点存活,Zookeeper集群才可以正常服务。

  • 全局数据一致性:每个Server保存一份相同的数据副本,Client无论连接到哪一个Scrver,数据都是一致的。

写是顺序原则【串行操作】

读是就近原则【并行操作】

1.4 关于zookeeper的文件系统

ZooKeeper本质上是一个分布式文件系统,本身也是一个集群,适合存放小文件(单个文件最好不要超过1M,[主要是做数据一致性的]这是因为一般这些文件都是配置文件,所以不会太大)。也可以把它理解成文件类型的数据库。它本身也是一个集群。我们的Zookeeper可以分布在集群中(多台机器,我们可以称为Zookeeper集群)

结构上有层次,每一个节点都叫做Znode,具备文件(携带数据)和文件夹(可以有子节点)的特性。

  • Znode存储数据大小有限制,最大不能超过1M

  • Znode通过路径引用,绝对路径

每个Znode由三个部分组成:

  • stat:状态信息,描述该Znode的版本,权限等信息。它由版本号,操作控制列表(ACL),时间戳和数据长度组成。

  • data:与该Znode关联的数据。

  • children:该Znode下的子节点。

1.5 zookeeper的角色

1.6 zookeeper的选举机制

若进行Leader选举,至少需要两台机器,我们以选取3台机器组成的服务器集群为例。在集群化初始阶段,当有一台服务器Serverl启动时,其单独无法进行和完成Leader选举。当第二台服务器Server2启动时,此时两台机器相互通信,每台机器都试图找到Leader,于是进入Leader选举过程,选举过程如下:

(1)每台Server '发出一个投票。

由于是初始情况,Serverl和 Scrver2都会将自己作为Lcader 服务器来进行投票,每次投票会包含推举的服务器的myid和ZXID,使用(myid,ZXID)来表示。此时,Serverl的投票为(1,0) ,Server2的投票为(2,0),然后各自将这个投票发给集群中的其他机器。myid表示服务器的一个编号(一个权值),这个值越大越好,越大就越有优势。ZXID被称为事务ID,这个数字越大代表你的数据就越新,这个值越大也越占优势。 投完票后,他们的每台机器的数据都是数组的形式:[(1,0)]和[(2,0)]

(2)接收来自各个服务器的投票

集群中每个服务器收到投票后,首先判断该投票的有效性。如:检查是否是本轮投票,是否来自LOOKING状态的服务器。投票的服务器数要过半,有一个过半机制。注意:是每个服务器都会收到投票,然后追加到数组中。就形成了如下结果:[(1,0),(2,0)]和【(2,0),(1,0)]

(3)处理投票

针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK规则如下:A.优先检查ZXID,该值比较大的服务器优先作为Leader。针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK规则如下:A.优先检查ZXID,该值比较大的服务器优先作为领袖。

B.如果ZXID值是一样的,那么比较myid,myid 比较大的服务器优先作为Leader。对于Server1而言,它的投票是(1,0),接收到了Server2的投票(2,0)。然后Serverl会重新投票,对于Scrverl而言,他需要更新自己的投票为(2,0)。同理,对于Server2而B.如果ZXID值是一样的,那么比较myid,myid比较大的服务器优先作为领导人。对于Server 1而言,它的投票是(1,0),接收到了Server 2的投票(2,0)。然后Server l会重新投票,对于Scrverl而言,他需要更新自己的投票为(2,0)同理,对于Server 2而

(第几次启动,事务编号【代表数据新旧】)

1.7 配置免密登录

生成密钥,此处为三台虚拟机,需要在三台虚拟机上面同时操作。

拷贝密钥到node01

查看一下生成的密钥: 

拷贝密钥到其他两台主机上面 

完成之后测试一下是否可以免密登录。

1.8 安装jdk

安装JAVA的JDK
安装之前需要先输入上述的命令进行检查,卸载本地的openjdk

  • 查找命令:rpm -qa | grep java , 查看所有的rpm包并且是含有java字样的rpm包。
  • 卸载命令:rpm -e openjdk版本1 openjdk版本2 [....] --nodeps

1. rz -E 将 jdk-8u281-linux-x64.tar.gz 上传到node01节点

2. 解压缩,重命名:jdk1.8.0_281

  • tar -zxvf jdk-8u281-linux-x64.tar.gz -C ./
  • mv jdk-8u281-linux-x64 jdk1.8.0_281

3. 配置环境变量 /etc/profile

  • export JAVA_HOME=/opt/software/jdk1.8.0_281
  • export PATH=:$JAVA_HOME/bin:$PATH

4. 使 环境变量立刻生效

source /etc/profile

之后验证node01的jdk安装是否正确

java

javac

java -version

5. 将 JDK安装目录和环境变量的文件 同步到 node02和node03

  • scp -r jdk目录/ node02:目录
  • scp -r jdk目录/ node03:目录

也可以用$PWD
别忘记 node02和node03环境变量同步并且立刻生效。

6. 测试node02和node03的jdk的安装

1.9 安装配置zookeeper1环境

(1)下载Zookeeper的压缩包

下载网址如下:http://archive.apache.org/dist/zookeeper/选择3.4.9版本进行下载,如下图:


下载完毕后,上传到我们的linux的/opt/zookeeper目录下

(2)解压缩

解压zookeeper的压缩包到/opt路径下,然后进行准备安装

tar -zxvfzookeeper-3.4.9.tar.gz -C /opt

备注:如果已经切换好目录,则命令为tar -zxvf zookeeper-3.4.9.tar.gz -C ./

(3)修改配置文件

第一台机器修改配置文件:
cd /opt/ zookeeper-3.4.9/conf
我们需要找到zoo_sample.cfg
我们拷贝zoo_sample.cfg,并命名为zoo.cfg

利用vim命令编辑zoo.cfg
保留快照数,其实就是保留多少个文件数。(其实,就是日志数)
其中,2888是心跳端口,3888是数据端口。

(4)添加myid配置

在第一台机器的/opt/zookeeper-3.4.9/zkdatas/ 这个路径下创建一个文件,文件名为myid,文件内
容为1。
echo 1 > /opt/ zookeeper-3.4.9/zkdatas/myid 当然也可以通过vim myid进行创建和编辑。

(5)安装包分发并修改myid的值。

在第一台机器上面执行以下命令:

scp -r /opt/zookeeper-3.4.9/ node02:/opt/

scp -r /opt/zookeeper-3.4.9/ node03:/opt/

在第二台机器上修改myid的内容为2
在第三台 机器上修改myid的内容为3

(6)三台机器启动zookeeper服务

三台机器启动zookeeper服务,下面的 命令三台机器都要执行:
/opt/zookeeper-3.4.9/bin/zkServer.sh start
查看启动状态
/opt/zookeeper-3.4.9/bin/zkServer.sh status

二 实战zookeeper

2.1事务型请求与非事务型请求

首先要启动zookeeper集群

从客户端发起 事务型或者非事务型的操作请求

执行命令:

 zkCli.sh -server node01:2181

连接其他节点上的服务器,并设置超时时长

 zkCli.sh -timeout 5000 -server node03:2181

具体操作请求如下:

具体的相关操作

创建角色

创建的内容是有序的

临时节点与永久节点

删除操作

quit是直接关闭连接了

close只是退出客户端

2.查看当前节点详细数据

  • (1) czxid: 创建节点的事务 zxid

    每次修改ZooKeeper状态都会 产生一个 ZooKeeper事务 ID。事务 ID是 ZooKeeper中所有修改总的次序。每 次 修改都有唯一的 zxid,如果 zxid1小于 zxid2,那么 zxid1在 zxid2之前发生。

  • (2) ctime:znode被创建的毫秒数(从 1970年开始)

  • (3) mzxid:znode最后更新的事务 zxid

  • (4) mtime: znode最后修改的毫秒数(从 1970年开始)

  • (5)pZxid:znode最后更新的子节点 zxid

  • (6)cversion:znode 子节点变化号,znode 子节点修改次数

  • (7)dataversion:znode 数据变化号

  • (8)aclVersion:znode 访问控制列表的变化号

  • (9)ephemeralOwner:如果是临时节点,这个是znode 拥有者的session id。如果不是临时节点则是0。

  • (10)dataLength:znode 的数据长度

  • (11)numChildren:znode 子节点数量

2. zookeeper的监听器Watcher

一次性触发一个watcher,只会触发一次,如果需要继续监听,则需要再次添加watcher。通知的实现步骤如下:

  • 客户端注册Watcher到服务端;

  • 服务端发生数据变更;

  • 服务端通知客户端数据变更;

  • 客户端回调Watcher处理变更应对逻辑;

一个最简单的小示例:为创建一个hello节点,并且为hello节点添加wacth机制。然后修改hello节点的携带数据,观察一下时候可以监控到。

修改监听

PS:监听器只生效一次,第二次就不能生效了。

watcher机制常用场景:

  • 发布/订阅

  • 监控集群中主机的存活状态

三 Zookeeper的JavaAPI操作

3.1 创建IDEA项目

3.1.1 创建Maven项目

3.1.2 添加项目名称以及项目存放位置

选择默认的即可

3.2 在pom.xml文件里面添加依赖

 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>2.12.0</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>2.12.0</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.25</version><scope>compile</scope></dependency></dependencies>

3.3 创建APP类

 package org.example;​import org.apache.curator.RetryPolicy;import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.retry.ExponentialBackoffRetry;import org.apache.zookeeper.CreateMode;​/*** Hello world!**/public class App {public static void main( String[] args ) throws Exception {//制定策略RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,1);// 获取客户端对象//此处的IP地址为客户端CuratorFramework client;client = CuratorFrameworkFactory.newClient("192.168.1.131:2181,192.168.1.132:2181,192.168.1.133:2181",100 , 100 ,retryPolicy);//开启客户端client.start();//创建节点client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/hello2" , "world2".getBytes());//关闭客户端client.close();}}

3.4 对监听进行测试

 package org.example;​import org.apache.curator.RetryPolicy;import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.framework.recipes.cache.ChildData;import org.apache.curator.framework.recipes.cache.TreeCache;import org.apache.curator.framework.recipes.cache.TreeCacheEvent;import org.apache.curator.framework.recipes.cache.TreeCacheListener;import org.apache.curator.retry.ExponentialBackoffRetry;​//节点监听public class To1 {public static void main(String[] args) throws Exception {//制定策略RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,1);// 获取客户端对象//此处的IP地址为客户端CuratorFramework client;client = CuratorFrameworkFactory.newClient("192.168.1.131:2181,192.168.1.132:2181,192.168.1.133:2181",100 , 100 ,retryPolicy);//开启客户端client.start();// 设置我们要监听的对象//  将我们的缓存与我们的节点创建了一种映射关系,自动监听,提供缓存树TreeCache treeCache = new TreeCache(client, "/hello2");//确定监听器//添加监听器,并且传入一个匿名对象(自己定义一个监听器)//监听treeCache.getListenable().addListener(new myTreeCacheListener() );//启动监听treeCache.start();//程序挂起,为了不让它结束[需要一直监听]Thread.sleep(300000);//关闭客户端client.close();​}}​class myTreeCacheListener implements TreeCacheListener{​@Overridepublic void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {// 如果数据不为空,则代表监听被触发了ChildData data = event.getData();//如果event的getData方法得到的数据对象为null,说明没有触发if (data != null){//监听到了之后,根据类型进行处理switch (event.getType()){case NODE_ADDED://节点被添加的处理System.out.println("NODE_ADDED:" +data.getPath() + ":" +new String(data.getData()));break;case NODE_REMOVED://节点被更新的处理System.out.println("NODE_REMOVED:" +data.getPath() + ":" +new String(data.getData()));break;case NODE_UPDATED://节点被移除的处理System.out.println("NODE_UPDATED:" +data.getPath() + ":" +new String(data.getData()));break;}}}}

四 补充内容

4.1 sleep()和wait()的区别

在Java中,sleep()和wait()都是用于线程控制的方法,它们有以下区别:

  1. 调用方式:sleep()是Thread类的静态方法,可以直接通过Thread.sleep()调用。而wait()是Object类的实例方法,只能在同步的代码块或方法中使用。

  2. 所属类别:sleep()是Thread类的方法,用于控制当前线程的休眠时间。wait()是Object类的方法,用于控制线程的等待和唤醒。

  3. 锁的释放:sleep()方法不会释放锁,线程仍然持有锁。而wait()方法会释放锁,使得其他线程可以获取该对象的锁。

  4. 被唤醒:sleep()方法在指定的时间过去后会自动唤醒,线程会重新进入就绪状态。而wait()方法需要通过notify()或notifyAll()方法来唤醒,其他线程调用了对象的notify()或notifyAll()方法后,等待的线程才会被唤醒。

  5. 使用场景:sleep()方法通常用于暂停线程的执行,可以用于模拟耗时操作或定时任务。wait()方法通常用于线程间的协作,一个线程等待某个条件满足后再继续执行。

需要注意的是,wait()方法必须在同步的代码块或方法中使用,否则会抛出IllegalMonitorStateException异常。而sleep()方法可以在任何地方使用。另外,wait()方法还可以指定等待的时间,而sleep()方法只能指定休眠的时间。

sleep是占用资源

wait是等待资源

总结

以上就是今天的内容~

欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。

最后:转载请注明出处!!!

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

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

相关文章

【实战】十一、看板页面及任务组页面开发(六) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十八)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…

电商平台api接口拼多多根据关键词获取商品列表示例

拼多多根据关键词获取商品接口的意义&#xff1b; 实现商品搜索&#xff1a;通过关键词搜索商品API接口&#xff0c;电商平台可以为消费者提供一个简单、快捷的商品搜索功能。用户只需输入关键词&#xff0c;就可以得到与该关键词相关的商品列表。 提供便捷的商品搜索服务&…

关于IT学习随感

随感 之前一阵子的学习&#xff0c;感觉轻飘飘的 一直是被灌输的学习一些相关技术 不知到原因不会用 仅限于看得懂&#xff0c;现在回想确实 不仅如此 以前也是如此 一直都没有思索过&#xff0c;最近机缘巧合了解到学习it的三部what how why 自己且不讲why层 how层都没怎么主…

ATF(TF-A)安全通告 TFV-10 (CVE-2022-47630)

安全之安全(security)博客目录导读 ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-10 (CVE-2022-47630) 二、CVE-2022-47630 2.1 Bug 1&#xff1a;证书校验不足 2.2 Bug 2&#xff1a;auth_nvctr()中缺少边界检查 2.3 可利用性分析 2.3.1 上游TF-A代码 2.3.…

IIS搭建本地电脑服务器:通过内网穿透技术实现公网访问的步骤指南

1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xff0c;比如网页运行的Apache和Nginx、数据库软件MySQL和MSSQL之类&#xff0c;为方便用户使用&#xff0c;还出现了XAMPP、PHPStudy、宝塔面板等等一系列集成服务&#xff0c;都是为了方便我们…

应用程序管理工具

应用程序管理是 DevOps 的重要组成部分。它可以定义为在所有阶段监控和管理软件应用程序的可用性、运行状况、性能和功能的过程&#xff0c;包括规划、设计、构建、测试、部署、维护和更新。这意味着应用程序从概念到停止都受到监控。 应用程序管理的重要性 管理应用程序可确…

uni-app中使用iconfont彩色图标

uni-app中使用iconfont彩色图标 大家好&#xff0c;今天我们来学习一下uni-app中使用iconfont彩色图标&#xff0c;好好看&#xff0c;好好学&#xff0c;超详细的 第一步 首先&#xff0c;从iconfont官网&#xff08;iconfont-阿里巴巴矢量图标库&#xff09;选择自己需要的图…

vue3中的pinia

pinia官网 main.ts中引入 import { createApp } from vue import { createPinia } from pinia import ./style.css const store createPinia() import App from ./App.vuecreateApp(App).use(store).mount(#app)创建store文件夹&#xff0c;创建index.ts import {defineSto…

ChatGPT⼊门到精通(6):ChatGPT 提问设计

前⾔ 学会提问就是为了让AI给出⾼质量的答案。 你所学到的技能⼀切为了⽣成⾼质量的答案。 本教程适合&#xff1a;普通ChatGPT的⽤户、专业prompt⼯程师 你将收获&#xff1a;prompt 技巧的全⾯指导 、prompt⼯程师必备技能、prompt技术⼯程⾼质量答 案完全指南 提⽰词 Prom…

数据库导出工具

之前根据数据库升级需求&#xff0c;需要导出旧版本数据&#xff08;sqlserver 6.5&#xff09;&#xff0c;利用c# winfrom写了一个小工具&#xff0c;导出数据。 →→→→→多了不说&#xff0c;少了不唠。进入正题→→→→ 连接数据库&#xff1a;输入数据库信息 连接成功…

合并对象在 Typescript 中的实现与应用

合并对象在 Typescript 中的实现与应用 文章目录 合并对象在 Typescript 中的实现与应用一、简介二、实现1、函数实现2、参数说明3、返回值 三、使用示例四、实际应用场景五、拓展&#xff1a;使用 lodash-es 的 assign 函数进行对象合并1、简介2、安装与导入3、基础用法4、注意…

K8S:K8S自动化运维容器Docker集群

文章目录 一.k8s概述1.k8s是什么2.为什么要用K8S3.作用及功能4.k8s容器集群管理系统 二.K8S的特性1.弹性伸缩2.自我修复3.服务发现和复制均衡4.自动发布和回滚5.集中化配置管理和秘钥管理6.存储编排7.任务批量处理运行 三.K8S的集群架构四、K8S的核心组件1、Master组件&#xf…

Linux ptrace系统调用

文章目录 一、ptrace 简介二、ptrace 参数request2.1 PTRACE_TRACEME2.2 PTRACE_PEEKTEXT, PTRACE_PEEKDATA2.3 PTRACE_PEEKUSER2.4 PTRACE_POKETEXT, PTRACE_POKEDATA2.5 PTRACE_POKEUSER2.6 PTRACE_GETREGS, PTRACE_GETFPREGS2.7 PTRACE_GETREGSET2.8 PTRACE_SETREGS, PTRACE…

前端文件、图片直传OOS、分片上传、el-upload上传(vue+elementUI)

前言&#xff1a;基于天翼云的面相对象存储(Object-Oriented Storage&#xff0c;OOS),实现小文件的直接上传&#xff0c;大文件的分片上传。 开发文档地址&#xff1a;网址 上传之前的相关操作&#xff1a;注册账户&#xff0c;创建 AccessKeyId 和 AccessSecretKey之后&…

mac环境使用pkgbuild命令打pkg包的几个小细节

mac环境使用pkgbuild命令打pkg包的几个小细节 最近&#xff0c;研发提出要使用jenkins来自动生成mac环境下的pkg包&#xff0c;研究了一下&#xff0c;可以使用pkgbuild来打包。但是有几个小细节需要注意一下&#xff1a; 1 如果有pre-install和post-install脚本&#xff0c;…

批量根据excel数据绘制饼状图

要使用Python批量根据Excel数据绘制饼状图&#xff0c;可以使用pandas和matplotlib库来实现。以下是一个基本的代码示例&#xff1a; import pandas as pd import matplotlib.pyplot as plt # 读取Excel文件 data pd.read_excel(data.xlsx) # 提取需要用于绘制饼状图的数据列…

问题:UITableViewCellContentView:height == 44 约束冲突

使用Masonry自动布局&#xff0c;高度自定义&#xff0c;出现如标题所示约束冲突 <NSLayoutConstraint:UITableViewCellContentView:.height 44> 解决方案: 在设置底部约束的时候设置 高优先级priorityHigh() 即可 [self.auditBtn mas_makeConstraints:^(MASConstra…

36种水果和蔬菜识别(pytorch框架,深度卷积网络模型,可以实现照片连续识别和视频识别)

1.效果视频&#xff1a;36种水果和蔬菜识别&#xff08;pytorch框架&#xff0c;深度卷积网络模型&#xff0c;可以实现照片连续识别和视频识别&#xff09;_哔哩哔哩_bilibili 2.项目文件夹 第一个文件夹&#xff08;data&#xff09;&#xff1a; 装载的是原始图像 第二个文…

移动端通讯录相关代码

vue3更新版本 附件地址 代码在附件里噜 太多了不好贴

【MYSQL】排序时 如何将0排到最后,并让其他值按正序展示?

背景&#xff1a;展示排名时需要1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;这样展示但是有些没有排名得数据字段默认值时0&#xff0c;这时直接用ASC就会出现问题 实现效果 实现方式&#xff1a;使用MySQL的ORDER BY语句来实现。以下是一个示例的SQL查…