1-​​Zookeeper 基本API使用

Zookeeper针对ip网段的ACL 最近想在生产环境中给zookeeper加ip网段的权限控制,试了下发现一直报错:Acl is not valid 。官网和网上博客都说可以针对ip网段加ACL,但是没人实验成功过。最后在StackOverflow 上找到答案,因为生产环境的zookeeper版本是3.4.12,而版本为3.4.*的zookeeper虽然支持单个ip的白名单设置,可同时设置多个ip,但是不支持ip网段... 阅读详情

连接ZK集群

使用 ./zkCli.sh  -server ip:port

root@ubuntu-130:/opt/apache-zookeeper-3.5.8-bin/bin# ./zkCli.sh -server 192.168.13.130

如果是本主机部署了ZK,则直接使用 /zkCli.sh 就可以连接ZK客户端

root@ubuntu-130:/opt/apache-zookeeper-3.5.8-bin/bin# ./zkCli.sh
Connecting to localhost:2181
2021-04-04 17:05:55,629 [myid:] - INFO  [main:Environment@109] - Client environment:zookeeper.version=3.5.8-f439ca583e70862c3068a1f2a7d4d068eec33315, built on 05/04/2020 15:07 GMT
2021-04-04 17:05:55,637 [myid:] - INFO  [main:Environment@109] - Client environment:host.name=ubuntu-130
2021-04-04 17:05:55,638 [myid:] - INFO  [main:Environment@109] - Client environment:java.version=1.8.0_181
2021-04-04 17:05:55,644 [myid:] - INFO  [main:Environment@109] - Client environment:java.vendor=Oracle Corporation
2021-04-04 17:05:55,645 [myid:] - INFO  [main:Environment@109] - Client environment:java.home=/opt/jdk/jdk1.8.0_181/jre
2021-04-04 17:05:55,646 [myid:] - INFO  [main:Environment@109] - Client environment:java.class.path=/opt/apache-zookeeper-3.5.8-bin/bin/../zookeeper-server/target/classes:/opt/apache-zookeeper-3.5.8-bin/bin/../build/classes:/opt/apache-zookeeper-3.5.8-bin/bin/../zookeeper-server/target/lib/*.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../build/lib/*.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/zookeeper-jute-3.5.8.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/zookeeper-3.5.8.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/slf4j-log4j12-1.7.25.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/slf4j-api-1.7.25.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/netty-transport-native-unix-common-4.1.48.Final.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/netty-transport-native-epoll-4.1.48.Final.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/netty-transport-4.1.48.Final.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/netty-resolver-4.1.48.Final.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/netty-handler-4.1.48.Final.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/netty-common-4.1.48.Final.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/netty-codec-4.1.48.Final.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/netty-buffer-4.1.48.Final.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/log4j-1.2.17.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/json-simple-1.1.1.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/jline-2.11.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/jetty-util-9.4.24.v20191120.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/jetty-servlet-9.4.24.v20191120.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/jetty-server-9.4.24.v20191120.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/jetty-security-9.4.24.v20191120.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/jetty-io-9.4.24.v20191120.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/jetty-http-9.4.24.v20191120.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/javax.servlet-api-3.1.0.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/jackson-databind-2.10.3.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/jackson-core-2.10.3.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/jackson-annotations-2.10.3.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/commons-cli-1.2.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../lib/audience-annotations-0.5.0.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../zookeeper-*.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../zookeeper-server/src/main/resources/lib/*.jar:/opt/apache-zookeeper-3.5.8-bin/bin/../conf:.:/opt/jdk/jdk1.8.0_181/lib:/opt/jdk/jdk1.8.0_181/jre/lib
2021-04-04 17:05:55,647 [myid:] - INFO  [main:Environment@109] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2021-04-04 17:05:55,648 [myid:] - INFO  [main:Environment@109] - Client environment:java.io.tmpdir=/tmp
2021-04-04 17:05:55,648 [myid:] - INFO  [main:Environment@109] - Client environment:java.compiler=<NA>
2021-04-04 17:05:55,649 [myid:] - INFO  [main:Environment@109] - Client environment:os.name=Linux
2021-04-04 17:05:55,650 [myid:] - INFO  [main:Environment@109] - Client environment:os.arch=amd64
2021-04-04 17:05:55,650 [myid:] - INFO  [main:Environment@109] - Client environment:os.version=4.13.0-36-generic
2021-04-04 17:05:55,651 [myid:] - INFO  [main:Environment@109] - Client environment:user.name=root
2021-04-04 17:05:55,652 [myid:] - INFO  [main:Environment@109] - Client environment:user.home=/root
2021-04-04 17:05:55,653 [myid:] - INFO  [main:Environment@109] - Client environment:user.dir=/opt/apache-zookeeper-3.5.8-bin/bin
2021-04-04 17:05:55,654 [myid:] - INFO  [main:Environment@109] - Client environment:os.memory.free=25MB
2021-04-04 17:05:55,661 [myid:] - INFO  [main:Environment@109] - Client environment:os.memory.max=247MB
2021-04-04 17:05:55,663 [myid:] - INFO  [main:Environment@109] - Client environment:os.memory.total=30MB
2021-04-04 17:05:55,677 [myid:] - INFO  [main:ZooKeeper@868] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@15615099
2021-04-04 17:05:55,705 [myid:] - INFO  [main:X509Util@79] - Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation
2021-04-04 17:05:55,732 [myid:] - INFO  [main:ClientCnxnSocket@237] - jute.maxbuffer value is 4194304 Bytes
2021-04-04 17:05:55,752 [myid:] - INFO  [main:ClientCnxn@1653] - zookeeper.request.timeout value is 0. feature enabled=
Welcome to ZooKeeper!
2021-04-04 17:05:55,782 [myid:localhost:2181] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1112] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2021-04-04 17:05:56,152 [myid:localhost:2181] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@959] - Socket connection established, initiating session, client: /127.0.0.1:47930, server: localhost/127.0.0.1:2181
2021-04-04 17:05:56,251 [myid:localhost:2181] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1394] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x100003dd68a0000, negotiated timeout = 30000
[zk: localhost:2181(CONNECTING) 0]
WATCHER::

WatchedEvent state:SyncConnected type:None path:null

[zk: localhost:2181(CONNECTED) 0]

输入命令 help 查看zookeeper所支持的所有命令:

[zk: localhost:2181(CONNECTED) 80] help ZooKeeper -server host:port cmd args 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 delquota [-n|-b] path get [-s] [-w] path getAcl [-s] path history listquota path ls [-s] [-w] [-R] path ls2 path [watch] 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] rmr path set [-s] [-v version] path data setAcl [-s] [-v version] [-R] path acl setquota -n|-b val path stat [-w] path sync path

1. 创建zookeeper 节点命令

create [-s] [-e] [-c] [-t ttl] path [data] [acl]

中括号为可选项,没有则默认创建持久化节点

-s: 顺序节点

-e: 临时节点

-c: 容器节点

-t: 可以给节点添加过期时间,默认禁用,需要通过系统参数启用

(-Dzookeeper.extendedTypesEnabled=true, znode.container.checkIntervalMs : (Java system property only) New in 3.5.1: The time interval in milliseconds for each check of candidate container and ttl nodes. Default is "60000".)

创建节点:

create /test-node some-data

如上,没有加任何可选参数,创建的就是持久化节点

0

查看节点:

get /test-node

0

修改节点数据:

set /test-node some-data-changed

0

查看节点状态信息:

stat /test-node

0

Stat

  • cZxid:创建znode的事务ID(Zxid的值)。
  • mZxid:最后修改znode的事务ID。
  • pZxid:最后添加或删除子节点的事务ID(子节点列表发生变化才会发生改变)。
  • ctime:znode创建时间。
  • mtime:znode最近修改时间。
  • dataVersion:znode的当前数据版本。
  • cversion:znode的子节点结果集版本(一个节点的子节点增加、删除都会影响这个版本)。
  • aclVersion:表示对此znode的acl版本。
  • ephemeralOwner:znode是临时znode时,表示znode所有者的 session ID。 如果znode不是临时znode,则该字段设置为零。
  • dataLength:znode数据字段的长度。
  • numChildren:znode的子znode的数量。

查看节点状态信息同时查看数据

0

根据状态数据中的版本号有并发修改数据实现乐观锁的功能

比如: 客户端首先获取版本信息, get -s /node-test

0

/test-node 当前的数据版本是 1 , 这时客户端 用 set 命令修改数据的时候可以把版本号带上

0

如果在执行上面 set命令前, 有人修改了数据,zookeeper 会递增版本号, 这个时候,如果再用以前的版本号去修改,将会导致修改失败,报如下错误

0

创建子节点, 这里要注意,zookeeper是以节点组织数据的,没有相对路径这么一说,所以,所有的节点一定是以 / 开头。

create /test-node/test-sub-node

0

查看子节点信息,比如根节点下面的所有子节点, 加一个大写 R 可以查看递归子节点列表

ls /

0

查看 /test-node 下面所有的子节点

0

创建临时节点

create -e /ephemeral data

create 后跟一个 -e 创建临时节点 , 临时节点不能创建子节点

0

创建序号节点,加参数 -s

create /seq-parent data // 创建父目录,单纯为了分类,非必须 create -s /seq-parent/ data // 创建顺序节点。顺序节点将再seq-parent 目录下面,顺序递增

为了容纳子节点,先创建个父目录 /seq-parent

0

也可以再序号节点前面带一个前缀

0

创建临时顺序节点,其它增删查改和其他节点无异,不再贴图

create -s -e /ephemeral-node/前缀-

创建容器节点

create -c /container

容器节点主要用来容纳字节点,如果没有给其创建子节点,容器节点表现和持久化节点一样,如果给容器节点创建了子节点,后续又把子节点清空,容器节点也会被zookeeper删除。

2. 事件监听机制:

针对节点的监听

一定事件触发,对应的注册立刻被移除,所以事件监听是一次性的

get -w /path // 注册监听的同时获取数据 stat -w /path // 对节点进行监听,且获取元数据信息

0

针对目录的监听

如下图,目录的变化,会触发事件,且一旦触发,对应的监听也会被移除,后续对节点的创建没有触发监听事件

ls -w /path

0

针对递归子目录的监听

ls -R -w /path : -R 区分大小写,一定用大写

如下对/test 节点进行递归监听,但是每个目录下的目录监听也是一次性的,如第一次在/test 目录下创建节点时,触发监听事件,第二次则没有,同样,因为时递归的目录监听,所以在/test/sub0下进行节点创建时,触发事件,但是再次创建/test/sub0/subsub1节点时,没有触发事件。

0

Zookeeper事件类型:

None: 连接建立事件

NodeCreated: 节点创建

NodeDeleted: 节点删除

NodeDataChanged:节点数据变化

NodeChildrenChanged:子节点列表变化

DataWatchRemoved:节点监听被移除

ChildWatchRemoved:子节点监听被移除

4. Zookeeper 的 ACL 权限控制( Access Control List )

Zookeeper 的ACL 权限控制,可以控制节点的读写操作,保证数据的安全性,Zookeeper ACL 权限设置分为 3 部分组成,分别是:权限模式(Scheme)、授权对象(ID)、权限信息(Permission)。最终组成一条例如“scheme:id:permission”格式的 ACL 请求信息。下面我们具体看一下这 3 部分代表什么意思:

Scheme(权限模式):

用来设置 ZooKeeper 服务器进行权限验证的方式。ZooKeeper 的权限验证方式大体分为两种类型:

一种是范围验证。所谓的范围验证就是说 ZooKeeper 可以针对一个 IP 或者一段 IP 地址授予某种权限。比如我们可以让一个 IP 地址为“ip:192.168.0.110”的机器对服务器上的某个数据节点具有写入的权限。或者也可以通过“ip:192.168.0.1/24”给一段 IP 地址的机器赋权。

另一种权限模式就是口令验证,也可以理解为用户名密码的方式。在 ZooKeeper 中这种验证方式是 Digest 认证,而 Digest 这种认证方式首先在客户端传送“username:password”这种形式的权限表示符后,ZooKeeper 服务端会对密码 部分使用 SHA-1 和 BASE64 算法进行加密,以保证安全性。

还有一种Super权限模式, Super可以认为是一种特殊的 Digest 认证。具有 Super 权限的客户端可以对 ZooKeeper 上的任意数据节点进行任意操作。

授权对象(ID)

授权对象就是说我们要把权限赋予谁,而对应于 4 种不同的权限模式来说,如果我们选择采用 IP 方式,使用的授权对象可以是一个 IP 地址或 IP 地址段;而如果使用 Digest 或 Super 方式,则对应于一个用户名。如果是 World 模式,是授权系统中所有的用户。

权限信息(Permission)

权限就是指我们可以在数据节点上执行的操作种类,如下所示:在 ZooKeeper 中已经定义好的权限有 5 种:

数据节点(c: create)创建权限,授予权限的对象可以在数据节点下创建子节点;

数据节点(w: wirte)更新权限,授予权限的对象可以更新该数据节点;

数据节点(r: read)读取权限,授予权限的对象可以读取该节点的内容以及子节点的列表信息;

数据节点(d: delete)删除权限,授予权限的对象可以删除该数据节点的子节点;

数据节点(a: admin)管理者权限,授予权限的对象可以对该数据节点体进行 ACL 权限设置。

命令:

getAcl:获取某个节点的acl权限信息

setAcl:设置某个节点的acl权限信息

addauth: 输入认证授权信息,相当于注册用户信息,注册时输入明文密码,zk将以密文的形式存储

可以通过系统参数zookeeper.skipACL=yes进行配置,默认是no,可以配置为true, 则配置过的ACL将不再进行权限检测

生成授权ID的两种方式:

a.代码生成ID:

@Test public void generateSuperDigest() throws NoSuchAlgorithmException { String sId = DigestAuthenticationProvider.generateDigest("gj:test"); System.out.println(sId);// gj:X/NSthOB0fD/OT6iilJ55WJVado= }

b.在xshell 中生成

echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64

设置ACL有两种方式

节点创建的同时设置ACL

create [-s] [-e] [-c] path [data] [acl]

create /zk-node datatest digest:gj:X/NSthOB0fD/OT6iilJ55WJVado=:cdrwa

或者用setAcl 设置

setAcl /zk-node digest:gj:X/NSthOB0fD/OT6iilJ55WJVado=:cdrwa

添加授权信息后,不能直接访问,直接访问将报如下异常

get /zk-node 异常信息: org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /zk-node

访问前需要添加授权信息

addauth digest gj:test get /zk-node datatest

另一种授权模式: auth 明文授权

使用之前需要先

addauth digest username:password 注册用户信息,后续可以直接用明文授权

如:

addauth digest u100:p100 create /node-1 node1data auth:u100:p100:cdwra 这是u100用户授权信息会被zk保存,可以认为当前的授权用户为u100 get /node-1 node1data

IP授权模式:

setAcl /node-ip ip:192.168.109.128:cdwra create /node-ip data ip:192.168.109.128:cdwra

多个指定IP可以通过逗号分隔, 如 setAcl /node-ip ip:IP1:rw,ip:IP2:a

Super 超级管理员模式

这是一种特殊的Digest模式, 在Super模式下超级管理员用户可以对Zookeeper上的节点进行任何的操作。

需要在启动了上通过JVM 系统参数开启:

DigestAuthenticationProvider中定义 -Dzookeeper.DigestAuthenticationProvider.superDigest=super:<base64encoded(SHA1(password))

5. ZooKeeper 内存数据和持久化

Zookeeper数据的组织形式为一个类似文件系统的数据结构,而这些数据都是存储在内存中的,所以我们可以认为,Zookeeper是一个基于内存的小型数据库

内存中的数据:

public class DataTree { private final ConcurrentHashMap<String, DataNode> nodes = new ConcurrentHashMap<String, DataNode>(); private final WatchManager dataWatches = new WatchManager(); private final WatchManager childWatches = new WatchManager();

DataNode 是Zookeeper存储节点数据的最小单位

public class DataNode implements Record { byte data[]; Long acl; public StatPersisted stat; private Set<String> children = null;

事务日志

针对每一次客户端的事务操作,Zookeeper都会将他们记录到事务日志中,当然,Zookeeper也会将数据变更应用到内存数据库中。我们可以在zookeeper的主配置文件zoo.cfg 中配置内存中的数据持久化目录,也就是事务日志的存储路径 dataLogDir. 如果没有配置dataLogDir(非必填), 事务日志将存储到dataDir (必填项)目录,

zookeeper提供了格式化工具可以进行数据查看事务日志数据

org.apache.zookeeper.server.LogFormatter

java -classpath .:slf4j-api-1.7.25.jar:zookeeper-3.5.8.jar:zookeeper-jute-3.5.8.jar org.apache.zookeeper.server.LogFormatter /usr/local/zookeeper/apache-zookeeper-3.5.8-bin/data/version-2/log.1

如下是我本地的日志文件格式化效果

0

从左到右分别记录了操作时间,客户端会话ID,CXID,ZXID,操作类型,节点路径,节点数据(用#+ascii 码表示),节点版本。

Zookeeper进行事务日志文件操作的时候会频繁进行磁盘IO操作,事务日志的不断追加写操作会触发底层磁盘IO为文件开辟新的磁盘块,即磁盘Seek。因此,为了提升磁盘IO的效率,Zookeeper在创建事务日志文件的时候就进行文件空间的预分配- 即在创建文件的时候,就向操作系统申请一块大一点的磁盘块。这个预分配的磁盘大小可以通过系统参数 zookeeper.preAllocSize 进行配置。

事务日志文件名为: log.,应为日志文件时顺序写入的,所以这个最大事务ID也将是整个事务日志文件中,最小的事务ID,日志满了即进行下一次事务日志文件的创建

数据快照

数据快照用于记录Zookeeper服务器上某一时刻的全量数据,并将其写入到指定的磁盘文件中。

可以通过配置snapCount配置每间隔事务请求个数,生成快照,数据存储在dataDir 指定的目录中,

可以通过如下方式进行查看快照数据( 为了避免集群中所有机器在同一时间进行快照,实际的快照生成时机为事务数达到 [snapCount/2 + 随机数(随机数范围为1 ~ snapCount/2 )] 个数时开始快照)

java -classpath .:slf4j-api-1.7.25.jar:zookeeper-3.5.8.jar:zookeeper-jute-3.5.8.jar org.apache.zookeeper.server.SnapshotFormatter /usr/local/zookeeper/apache-zookeeper-3.5.8-bin/data-dir/version-2/snapshot.0

0

快照事务日志文件名为: snapshot.,日志满了即进行下一次事务日志文件的创建

有了事务日志,为啥还要快照数据。

快照数据主要时为了快速恢复, 事务日志文件是每次事务请求都会进行追加的操作,而快照是达到某种设定条件下的内存全量数据。所以通常快照数据是反应当时内存数据的状态。事务日志是更全面的数据,所以恢复数据的时候,可以先恢复快照数据,再通过增量恢复事务日志中的数据即可。

文档:VIP-01 Zookeeper特性与节点数据类型详...

链接:http://note.youdao.com/noteshare?id=16ab5da92ee89d93f948dc57762b7ae6&sub=D37AC1F910A04A2EAEC83881AB0F32A1

Zookeeper 节点权限控制ACL详解 Zookeeper可以使用ACL(access control list)访问控制列表来对节点的权限进行控制 阅读详情

相关推荐

zookeeper之znode节点与acl权限设置

ZooKeeper是Apache软件基金会的一个软件项目,是一个分布式的,开放源码的分布式应用程序协调服务。它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。ZooKeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式 锁和分布式队列等功能官网:http://ZooKeeper.apache.org/

m0_71777195的博客 1149

zookeeper--ACL详解

zookeeper ACL权限详解 addauth 详解

qq_41768644的博客 3851

zookeeper使用篇-Zookeeper Api实践(1)

zookeeper中对节点的操作全部提供了同步和异步两种操作方式,并且有多种不同情况下的方法重载1.原生Api的创建节点,必须按照层级创建,因此建议创建之前我们也要检查该节点是否存在2.Zookeeper中节点的删除操作也必须按照层级进行删除,即当前节点下存在子节点,必须优先删除子节点,再去删除当前节点,建议删除之前优先检查一下是否存在子节点除此之外,如果我们对某个节点进行监听,如果细心的话也会发现,原生的Api实现中,监听触发一次以后就不会再触发了。

2401_84874201的博客 935

ZooKeeper ACL权限控制

ZK 类似文件系统,Client 可以在上面创建节点、更新节点、删除节点等如何做到权限的控制?查阅文档,zk的ack(Access Control List)能够保证权限,但是调研完后发现它不是很好用。 ACL 权限控制,使用:schema:id:permission 来标识,主要涵盖 3 个方面: 权限模式(Schema):鉴权的策略授权对象(ID)权限(Permission) 其

赶路人儿 1万+

zookeeper入门到精通07——zookeeper客户端API节点操作与原理_zookeeper api的访问方式原理(1)

/ 参数true表示开启子节点的监听。// 延时阻塞,防止程序退出。

2401_84182578的博客 483

Hi3516CV610 YOLOv8模型转换与部署实战:从源码到板端推理全流程解析

本文详细解析了将YOLOv8模型部署到Hi3516CV610开发板的全流程。内容涵盖从Ubuntu环境搭建、模型获取与验证,到关键的PyTorch模型转换为ONNX格式,并利用海思工具链量化生成板端可执行的.wk文件。最后,指导开发者编写板端C程序,完成视频流处理、NNIE推理及结果后处理,并提供了部署调试与性能优化的实用技巧。

weixin_29215815的博客 268

Zookeeper入门——Zookeeper的Java客户端API(1)

搜了一些Zookeeper的相关书籍和博客,但好多基本都是讲Zookeeper的架构、用途,尤其分布式中的应用讲的真的是天花乱坠,但看完还是不会写代码,搞得自己理论丰富的一批,实践完全懵逼。对于Zookeeper的Java客户端API使用,基本没有涉及或者讲清楚,要么就是讲的很模糊。果然还是得自己来,通过Zookeeper的API来学习一下Zookeeper的功能,然后依据这些功能去思考怎么用?...

江左煤郎的博客 4691

如何运用好DeepSeek为自己服务:智能增强的范式革命 || 目录

1.1 认知增强的三次浪潮1.2 DeepSeek认知增强模型1.3 人机认知耦合协议1.4 认知增强的数学基础。

𝓓𝓸𝓶𝓲𝓷𝓪𝓽𝓲𝓷𝓰 𝓐𝓵𝓵 𝓣𝓱𝓲𝓷𝓰𝓼 1220

1.3 Zookeeper的Java API操作

1.新建Maven项目 2.导入依赖 <dependencies> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.9</version> </

棒棒的邦邦 171

从零开始:用君正T23ZN打造智能门锁双摄系统(含代码示例与调试技巧)

本文详细介绍了基于君正T23ZN视频处理芯片构建智能门锁双摄系统的完整实战方案。内容涵盖硬件选型与核心电路设计、软件开发环境搭建、双摄驱动框架、图像信号处理(ISP)调优、人脸识别算法集成与性能优化,以及系统调试与稳定性保障。文章提供了丰富的代码示例和调试技巧,旨在帮助嵌入式开发者高效实现具备人脸识别与监控功能的低功耗智能门锁视觉系统。

opencv7vision的博客 716

关于影响力最大化问题中贪心算法的一些理解

在影响力最大化问题中(Influence Maximization,以下简称IM),贪心算法是最早提出的一种解决方法,并且一直沿用至今。它基于IM问题所具有的单调性(Monotonicity)和子模性(Submodularity)使用一种Hill Climbing策略,不断使用Monte Carlo模拟来寻找在当前情况下的具有最大传播范围的节点,添加至种子集合,得到最终结果,算法伪代码如下所示: 这里算法1其实并没有使用MonteCarlo模拟,而只是使用了贪心的策略...

nianjuan1990的专栏 2852

Zookeeper API 相关操作(1)

Zookeeper API操作,使用的是zookeeper原生自带的一套API。

qq_42026600的博客 429

基于MATLAB的BOC调制信号捕获算法仿真

然而,在实际的使用过程中,由于室内信号衰减以及遮挡等因素的影响,接收机在GPS信号弱化时会很容易丢失导航信息。与其他的调制方式相比,BOC具有较好的抗多径性能和更高的频带效率。通过本文的介绍,我们可以更加深入地了解BOC调制信号的捕获算法,并且掌握了如何使用MATLAB软件对其进行仿真实现。通过实验数据的分析,我们可以看出该算法对于BOC调制信号的捕获具有较高的准确率和稳定性,因此具有一定的工程应用价值。在BOC调制完成后,我们需要进行信号的捕获,这一步涵盖了信号检测、码偏差估计、载波频率估计等过程。

2301_79326559的博客 567

(原) 2.1 Zookeeper原生API使用

本文为原创文章,转载请注明出处,谢谢 Zookeeper原生API使用 1、jar包引入,演示版本为3.4.6,非maven项目,可以下载jar包导入到项目中    <dependency> <groupId>org.apache.zookeeper</groupId> <artif...

diechuishuo9838的博客 210

R语言dplyr包recode函数、recode_factor函数数值或因子替换实战

R语言dplyr包recode函数、recode_factor函数数值或因子替换实战 目录 R语言dplyr包recode函数、recode_factor函数数值或因子替换实战 #导入dplyr包 #recode函数进行数值替换 #recode_factor函数对因子变量进行替换 #导入dplyr包 install.packages("dplyr") # Install & load dplyr library("dpl.

data+scenario+science+insight 1590

【5】GD32H7xx CAN发送及FIFO接收

GD32H7xx CAN收发调试记录,包含源码

madao1234的博客 1813
上一篇: ZooKeeper简介
下一篇: ZK watcher 实现节点的监听
liuhehe321
博客等级 码龄10年 105粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值