基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(下)

文章目录

  • k8s安装部署Pulsar集群
  • 前期准备
    • 版本要求
  • 安装 Pulsar Helm chart
  • 管理pulsar
    • Clusters
    • Brokers
    • Topic

k8s安装部署Pulsar集群

前期准备

版本要求

  • Kubernetes 集群,版本 1.14 或更高版本
  • Helm v3(3.0.2 或更高版本)
  • 数据持久化(本文使用NFS CSI动态供给)

K8s集群信息

[root@master ~]# kubectl get node
NAME      STATUS   ROLES           AGE     VERSION
master    Ready    control-plane   77d     v1.24.2
worker1   Ready    <none>          77d     v1.24.2
worker2   Ready    <none>          77d     v1.24.2
worker3   Ready    <none>          4d18h   v1.24.2

Helm安装

wget https://get.helm.sh/helm-v3.17.2-linux-amd64.tar.gz
tar xf helm-v3.17.2-linux-amd64.tar.gz
chown root:root helm
mv linux-amd64/helm /usr/local/sbin/
helm version

NFS server部署
本文使用yum 包部署nfs server

nfs server主机安装nfs相关软件包

yum install nfs-utils -y

启动nfs server 相关服务

sudo systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server

配置nfs共享目录导出
(/nfsdata目录为主机单独一块磁盘的挂载点,需提前配置完成。)

vim /etc/exports
/nfsdata 192.168.61.0/24(rw,sync,no_subtree_check,no_root_squash)

导出共享目录
exportfs -ra

为数据持久化部署csi storageclass
本文使用nfs csi storageclass,但nfs不具有高可用性,生产环境建议使用ceph,glusterfs分布式的存储解决方案。
在 Kubernetes 中,NFS CSI(Container Storage Interface)StorageClass 提供了一种标准化的方式来动态供应基于 NFS(Network File System)的持久化存储卷。通过使用 NFS CSI 驱动程序和相应的 StorageClass,用户可以更方便地请求、分配和管理持久化存储资源,而无需手动创建 PersistentVolume(PV)。

nfs csi storageclass安装部署步骤参考:
https://github.com/kubernetes-csi/csi-driver-nfs

安装 Pulsar Helm chart

添加 Pulsar repo

helm repo add apache https://pulsar.apache.org/charts
helm repo update

列出可部署的版本,可以看出chart和pulsar的版本并非一一对应。

本文要安装的pulsar版本为2.10.2,因此选择pulsar heml对应版本为3.0.0

[root@master pulsar-helm-chart]# helm search repo apache/pulsar --versions
NAME            CHART VERSION   APP VERSION     DESCRIPTION                            
apache/pulsar   4.0.0           4.0.3           Apache Pulsar Helm chart for Kubernetes
apache/pulsar   3.9.0           4.0.2           Apache Pulsar Helm chart for Kubernetes
apache/pulsar   3.8.0           4.0.1           Apache Pulsar Helm chart for Kubernetes
apache/pulsar   3.7.0           4.0.0           Apache Pulsar Helm chart for Kubernetes
apache/pulsar   3.6.0           3.0.7           Apache Pulsar Helm chart for Kubernetes
apache/pulsar   3.5.0           3.0.6           Apache Pulsar Helm chart for Kubernetes
apache/pulsar   3.4.1           3.0.5           Apache Pulsar Helm chart for Kubernetes
apache/pulsar   3.4.0           3.0.4           Apache Pulsar Helm chart for Kubernetes
apache/pulsar   3.3.1           3.0.3           Apache Pulsar Helm chart for Kubernetes
apache/pulsar   3.3.0           3.0.2           Apache Pulsar Helm chart for Kubernetes
apache/pulsar   3.2.0           3.0.2           Apache Pulsar Helm chart for Kubernetes
apache/pulsar   3.1.0           3.0.2           Apache Pulsar Helm chart for Kubernetes
apache/pulsar   3.0.0           2.10.2          Apache Pulsar Helm chart for Kubernetes
apache/pulsar   2.9.4           2.9.3           Apache Pulsar Helm chart for Kubernetes

从helm仓库中下载指定版本的pulsar helm chart 安装包

helm pull apache/pulsar --version 3.0.0
pulsar-3.0.0.tgztar xf pulsar-3.0.0.tgz
cd pulsarls -l

总用量 68K

-rw-r--r-- 1 root root  253 10月 21  2022 Chart.lock
drwxr-xr-x 3 root root 4.0K  4月 23 22:01 charts
-rw-r--r-- 1 root root  529 10月 21  2022 Chart.yaml
-rw-r--r-- 1 root root  13K 10月 21  2022 LICENSE
-rw-r--r-- 1 root root  167 10月 21  2022 NOTICE
drwxr-xr-x 2 root root 4.0K  4月 23 22:01 templates
-rw-r--r-- 1 root root  32K  4月 24 10:48 values.yaml

通过修改配置文件指定pulsar版本

vim scripts/pulsar/common_auth.sh
…
PULSAR_VERSION="2.10.2"
…

参考以下内容修改values.yaml文件

namespace: "pulsar"
initialize: true
volumes:persistence: truelocal_storage: false
…
components:# zookeeperzookeeper: true
…# pulsar managerpulsar_manager: true
…
images:zookeeper:repository: apachepulsar/pulsar-all# uses defaultPulsarImageTag when unspecifiedtag: 2.10.2pullPolicy: IfNotPresentbookie:repository: apachepulsar/pulsar-all# uses defaultPulsarImageTag when unspecifiedtag: 2.10.2pullPolicy: IfNotPresent
…pulsar_manager:repository: apachepulsar/pulsar-managertag: v0.3.0pullPolicy: IfNotPresent
hasCommand: false
…
zookeeper:
volumes:persistence: truedata:storageClassName: nfs-csi
…
bookkeeper:
volumes:
persistence: true
journal:name: journalsize: 10Gilocal_storage: falsestorageClassName: nfs-csiledgers:name: ledgerssize: 50Gilocal_storage: falsestorageClassName: nfs-csi
…
kube-prometheus-stack:enabled: false
…

使用 Pulsar Helm将 Pulsar 集群安装到 Kubernetes。

helm install \--values values.yaml \--set initialize=true \--version 3.0.0 \pulsar01 apache/pulsar

查看pod的状态

[root@master pulsar]# kubectl get pod -n pulsar 
NAME                                      READY   STATUS      RESTARTS      AGE
pulsar01-bookie-0                         1/1     Running     0             13h
pulsar01-bookie-1                         1/1     Running     0             13h
pulsar01-bookie-2                         1/1     Running     0             13h
pulsar01-bookie-init-zb9gt                0/1     Completed   0             13h
pulsar01-broker-0                         1/1     Running     3 (12h ago)   13h
pulsar01-broker-1                         1/1     Running     3 (12h ago)   13h
pulsar01-broker-2                         1/1     Running     1 (13h ago)   13h
pulsar01-proxy-0                          1/1     Running     0             13h
pulsar01-pulsar-init-6zcx5                0/1     Completed   0             13h
pulsar01-pulsar-manager-f856cd9c6-fzj72   1/1     Running     0             33m
pulsar01-recovery-0                       1/1     Running     0             13h
pulsar01-toolset-0                        1/1     Running     0             13h
pulsar01-zookeeper-0                      1/1     Running     0             13h
pulsar01-zookeeper-1                      1/1     Running     0             13h
pulsar01-zookeeper-2                      1/1     Running     0             13h

查看svc

[root@master pulsar]# kubectl get svc -n pulsar 
NAME                      TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                               AGE
pulsar01-bookie           ClusterIP      None            <none>        3181/TCP,8000/TCP                     13h
pulsar01-broker           ClusterIP      None            <none>        8080/TCP,6650/TCP                     13h
pulsar01-proxy            LoadBalancer   10.96.97.171    <pending>     80:31682/TCP,6650:30689/TCP           13h
pulsar01-pulsar-manager   LoadBalancer   10.100.16.216   <pending>     9527:31991/TCP                        33m
pulsar01-recovery         ClusterIP      None            <none>        8000/TCP                              13h
pulsar01-toolset          ClusterIP      None            <none>        <none>                                13h
pulsar01-zookeeper        ClusterIP      None            <none>        8000/TCP,2888/TCP,3888/TCP,2181/TCP   13h

查看pvc

[root@master pulsar]# kubectl get pvc -n pulsar 
NAME                                           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pulsar01-bookie-journal-pulsar01-bookie-0      Bound    pvc-c86bb6dd-d98e-4b0f-b9f0-c67c169a5255   10Gi       RWO            nfs-csi        13h
pulsar01-bookie-journal-pulsar01-bookie-1      Bound    pvc-e7c2935d-d4cf-4cad-8d63-5dc87dbcae5a   10Gi       RWO            nfs-csi        13h
pulsar01-bookie-journal-pulsar01-bookie-2      Bound    pvc-9dfa73ec-8512-495a-ad6d-d3141a97128d   10Gi       RWO            nfs-csi        13h
pulsar01-bookie-journal-pulsar01-bookie-3      Bound    pvc-1f038b9a-4d0d-46c8-89ca-dc8f630ade76   10Gi       RWO            nfs-csi        13h
pulsar01-bookie-ledgers-pulsar01-bookie-0      Bound    pvc-8fcb5205-eef2-4903-90e4-68499746c8d8   50Gi       RWO            nfs-csi        13h
pulsar01-bookie-ledgers-pulsar01-bookie-1      Bound    pvc-4412bca2-4314-4fd6-9fb0-85bf1472fd53   50Gi       RWO            nfs-csi        13h
pulsar01-bookie-ledgers-pulsar01-bookie-2      Bound    pvc-a0fae489-99f9-4f39-ba7d-a543d2691502   50Gi       RWO            nfs-csi        13h
pulsar01-bookie-ledgers-pulsar01-bookie-3      Bound    pvc-0124e56b-0c28-4b24-92be-019acb8331a8   50Gi       RWO            nfs-csi        13h
pulsar01-zookeeper-data-pulsar01-zookeeper-0   Bound    pvc-81219d17-27f6-4ee0-864c-9f1a296f85cd   20Gi       RWO            nfs-csi        13h
pulsar01-zookeeper-data-pulsar01-zookeeper-1   Bound    pvc-8571b0c0-9ad9-4a5c-9582-0a81fda4c6ff   20Gi       RWO            nfs-csi        13h
pulsar01-zookeeper-data-pulsar01-zookeeper-2   Bound    pvc-ab41f541-c9a1-475b-ab07-cb1b90b47c87   20Gi       RWO            nfs-csi        13h

在修改values.yaml后可以使用upgrade更新部署

[root@master pulsar]# helm upgrade --values values.yaml --set initialize=true --version 3.0.0 pulsar01 apache/pulsar
Release "pulsar01" has been upgraded. Happy Helming!
NAME: pulsar01
LAST DEPLOYED: Thu Apr 24 10:48:19 2025
NAMESPACE: default
STATUS: deployed
REVISION: 4
TEST SUITE: None

c如何删除集群

[root@master pulsar]# helm list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
pulsar01        default         4               2025-04-24 10:48:19.873604446 +0800 CST deployed        pulsar-3.0.0    2.10.2    [root@master pulsar]# helm uninstall pulsar01 --namespace pulsar
release "pulsar01 " uninstalled[root@master pulsar]# helm list --namespace pulsar
NAME    NAMESPACE       REVISION        UPDATED STATUS  CHART   APP VERSION

管理pulsar

Clusters

获取现有集群的配置

I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin clusters get pulsar01
{"serviceUrl" : "http://pulsar01-broker.pulsar.svc.cluster.local:8080/","serviceUrlTls" : "https://pulsar01-broker.pulsar.svc.cluster.local:8443/","brokerServiceUrl" : "pulsar://pulsar01-broker.pulsar.svc.cluster.local:6650/","brokerServiceUrlTls" : "pulsar+ssl://pulsar01-broker.pulsar.svc.cluster.local:6651/","brokerClientTlsEnabled" : false,"tlsAllowInsecureConnection" : false,"brokerClientTlsEnabledWithKeyStore" : false,"brokerClientTlsTrustStoreType" : "JKS"
}

获取 Pulsar实例中所有集群的列表

I have no name!@pulsar01-toolset-0:/pulsar/bin$./pulsar-admin clusters list
pulsar01I have no name!@pulsar01-toolset-0:/pulsar/bin$ curl -X GET "http://pulsar01-proxy.pulsar.svc.cluster.local/admin/v2/clusters"v2/clusters"
["pulsar01"]
Tenants

列出所有租户

I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin tenants list
public
pulsarI have no name!@pulsar01-toolset-0:/pulsar/bin$ curl -X GET "http://pulsar01-proxy.pulsar.svc.cluster.local/admin/v2/tenants"
["public","pulsar"]

新创建1个名为my-tenant的租户

I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin tenants create my-tenant

创建租户时,您可以选择使用-r/–admin-roles 标志分配管理员角色,并使用-c/–

allowed-clusters标志分配集群。您可以以逗号分隔的列表形式指定多个值。
I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin tenants create my-tenant2 -r role1 -c pulsar01curl -X PUT "http://pulsar01-proxy/admin/v2/tenants/my-tenant3" \
> -H "Content-Type: application/json" \
> -d '{
>   "allowedClusters": ["pulsar01"],
>   "adminRoles": ["role1"]
> }'

获取现有租户的配置。

I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin tenants get my-tenant2                                                
{"adminRoles" : [ "role1" ],"allowedClusters" : [ "pulsar01" ]
}I have no name!@pulsar01-toolset-0:/pulsar$ curl -X GET "http://pulsar01-proxy/admin/v2/tenants/my-tenant3"
{"adminRoles":["role1"],"allowedClusters":["pulsar01"]}

删除指定租户

I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin tenants delete my-tenantI have no name!@pulsar01-toolset-0:/pulsar$ curl -X DELETE "http://pulsar01-proxy/admin/v2/tenants/my-tenant"

Brokers

可以通过以下方式管理broker:

  • 工具brokers的命令pulsar-admin
  • /admin/v2/brokers管理REST API的端点

列出所有活跃的broker

I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin brokers list use 
pulsar01-broker-2.pulsar01-broker.pulsar.svc.cluster.local:8080
pulsar01-broker-1.pulsar01-broker.pulsar.svc.cluster.local:8080
pulsar01-broker-0.pulsar01-broker.pulsar.svc.cluster.local:8080curl -s -X GET "http://pulsar01-proxy.pulsar/admin/v2/brokers/pulsar01"    
["pulsar01-broker-2.pulsar01-broker.pulsar.svc.cluster.local:8080","pulsar01-broker-1.pulsar01-broker.pulsar.svc.cluster.local:8080","pulsar01-broker-0.pulsar01-broker.pulsar.svc.cluster.local:8080"]

列出指定broker拥有和服务的所有命名空间。

I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin brokers namespaces use --url pulsar01-broker-2.pulsar01-broker.pulsar.svc.cluster.local:8080
pulsar/pulsar01/pulsar01-broker-2.pulsar01-broker.pulsar.svc.cluster.local:8080/0x00000000_0xffffffff    [broker_assignment=shared is_controlled=false is_active=true]
pulsar/pulsar01-broker-2.pulsar01-broker.pulsar.svc.cluster.local:8080/0x00000000_0xffffffff    [broker_assignment=shared is_controlled=false is_active=true]
public/functions/0x40000000_0x80000000    [broker_assignment=shared is_controlled=false is_active=true]
public/default/0x20000000_0x30000000    [broker_assignment=shared is_controlled=false is_active=true]

获取broker的监控指标数据

I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin broker-stats monitoring-metrics

此命令输出的内容较多,为json格式,建议使用jq格式化,更易阅读。
涵盖了 Pulsar Broker 的多个关键方面,包括:

  • Managed Ledger 缓存性能。
  • Topic 加载时间。
  • ZooKeeper 交互延迟。
  • JVM 性能和资源使用。
  • Broker 客户端连接状态。
  • 负载均衡资源使用。
    查看broker的健康状态
I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin brokers healthcheck
Ok

查看broker的版本:

I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin brokers version    
2.10.2

Topic

创建topic

I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin topics create persistent://public/default/my-topic-1

创建3分区的topic

I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin topics create-partitioned-topic persistent://public/default/my-partitioned-topic --partitions 3

查看topic状态

I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin topics stats persistent://public/default/my-topic-1I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin topics  partitioned-stats persistent://public/default/my-partitioned-topic --per-partition

Topic增加分区

I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin topics update-partitioned-topic persistent://public/default/my-partitioned-topic --partitions 6

分区数量应与预期的吞吐量需求相匹配。例如:

  • 如果你预计每秒需要处理 100,000 条消息,并且单个分区的吞吐量为 10,000 条/秒,则至少需要 10 个分区。
  • 如果你的集群有 5 个 Broker,那么 10 个分区可以均匀分布在这些 Broker 上,每个 Broker 处理 2 个分区
    查看指定topic的ledgerId
I have no name!@pulsar01-toolset-0:/pulsar/bin$ ./pulsar-admin topics info-internal persistent://public/default/my-topic
{"version": 7,"creationDate": "2025-04-23T14:29:59.347Z","modificationDate": "2025-04-25T03:54:25.812Z","ledgers": [{"ledgerId": 11,"entries": 36,"size": 1870,"isOffloaded": false},{"ledgerId": 18,"entries": 1,"size": 48,"isOffloaded": false},{"ledgerId": 28,"isOffloaded": false}],

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

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

相关文章

C35-数组和函数开发初见

一 数组作为函数的参数 用于传递数组中的某一个元素→意义不大 数组名当做函数实际参数 示例 代码 #include <stdio.h>//封装函数PrintArr void PrintArr(int arr[3]){int i;for(i0;i<3;i){printf("%d ",arr[i]);}putchar(\n);}//主函数 int main() { …

【小沐学GIS】基于C++绘制二维瓦片地图2D Map(QT、OpenGL、GIS)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut、GIS&#xff09;第二期3【小沐学…

idea左侧项目资源管理器不见了处理

使用idea误触导致&#xff0c;侧边栏和功能栏没了&#xff0c;如何打开&#xff1f; 1.打开文件&#xff08;File&#xff09; 2. 打开设置&#xff08;Settings&#xff09; 3.选择Appearance&Behavior--->Appearance划到最下面&#xff0c;开启显示工具栏和左侧并排布…

[Java实战]Spring Boot 静态资源配置(十三)

[Java实战]Spring Boot 静态资源配置&#xff08;十三&#xff09; 引言 静态资源&#xff08;如 HTML、CSS、JavaScript、图片等&#xff09;是 Web 应用的基石。Spring Boot 通过自动化配置简化了静态资源管理&#xff0c;但面对复杂场景&#xff08;如多模块项目、CDN 集成…

多模态大语言模型arxiv论文略读(六十九)

Prompt-Aware Adapter: Towards Learning Adaptive Visual Tokens for Multimodal Large Language Models ➡️ 论文标题&#xff1a;Prompt-Aware Adapter: Towards Learning Adaptive Visual Tokens for Multimodal Large Language Models ➡️ 论文作者&#xff1a;Yue Zha…

Python 基础语法与数据类型(七) - 函数的定义与调用 (def, return)

文章目录 为什么要使用函数&#xff1f;函数的定义 (def)函数的调用函数参数 (Parameters vs Arguments)返回值 (return)变量作用域 (简要了解)总结练习题练习题答案 **创作不易&#xff0c;请大家点赞加收藏&#xff0c;关注我&#xff0c;持续更新教程&#xff01;** 到目前为…

华为配置篇-RSTP/MSTP实验

MSTP 一、简介二、常用命令总结三、实验 一、简介 RSTP&#xff08;快速生成树协议&#xff09;​ RSTP&#xff08;Rapid Spanning Tree Protocol&#xff09;是 STP 的改进版本&#xff0c;基于 ​​IEEE 802.1w 标准​​&#xff0c;核心目标是解决传统 STP 收敛速度慢的问…

Docker Compose 完全指南:从入门到生产实践

Docker Compose 完全指南&#xff1a;从入门到生产实践 1. Docker Compose 简介与核心价值 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用的服务&#xff0c;只需简单命令就能创建和启动所有服务。 核心优势&#xff1a;…

Linux 离线安装 Docker 和 Docker Compose 最新版 的完整指南

一、准备工作 1. 下载安装包​&#xff08;需在有网络的机器操作&#xff09;&#xff1a; Docker 引擎&#xff1a;从官方仓库下载最新二进制包 wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz​Docker Compose&#xff1a;下载最新二进制…

CSS: 选择器与三大特性

标签选择器 标签选择器就是选择一些HTML的不同标签&#xff0c;由于它们的标签需求不同&#xff0c;所以CSS需要设置标签去选择它们&#xff0c;为满足它们的需求给予对应的属性 基础选择器 标签选择器 <!DOCTYPE html> <head><title>HOME</title>…

鸿蒙跨平台开发教程之Uniapp布局基础

前两天的文章内容对uniapp开发鸿蒙应用做了一些详细的介绍&#xff0c;包括配置开发环境和项目结构目录解读&#xff0c;今天我们正式开始写代码。 入门新的开发语言往往从Hello World开始&#xff0c;Uniapp的初始化项目中已经写好了一个简单的demo&#xff0c;这里就不再赘述…

JavaSE核心知识点02面向对象编程02-08(异常处理)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点02面向对象编程02-08&#…

【JVM-GC调优】

一、预备知识 掌握GC相关的VM参数&#xff0c;会基本的空间调整掌握相关工具明白一点&#xff1a;调优跟应用、环境有关&#xff0c;没有放之四海而皆准的法则 二、调优领域 内存锁竞争cpu占用io 三、确定目标 【低延迟】&#xff1a;CMS、G1&#xff08;低延迟、高吞吐&a…

基于单片机的电子法频率计

一、电子计数法测频率原理 通过门控控制闸门开关&#xff0c;闸门时间T自己设定&#xff0c;计数器计数脉冲个数N&#xff08;也就是待测信号&#xff09;&#xff0c;N个脉冲的时间间隔为δt,倒数即为信号的频率f,由此 δtT/N fN/T——信号频率 根据公式&#xff0c;如果考虑…

【C/C++】跟我一起学_C++同步机制效率对比与优化策略

文章目录 C同步机制效率对比与优化策略1 效率对比2 核心同步机制详解与适用场景3 性能优化建议4 场景对比表5 总结 C同步机制效率对比与优化策略 多线程编程中&#xff0c;同步机制的选择直接影响程序性能与资源利用率。 主流同步方式: 互斥锁原子操作读写锁条件变量无锁数据…

判断两台设备是否在同一局域网内的具体方法

以下是判断两台设备是否在同一局域网内的具体方法&#xff1a; 1. 检查IP地址和子网掩码 操作步骤&#xff1a; Windows系统&#xff1a; 按 Win R 键&#xff0c;输入 cmd 并回车。输入 ipconfig&#xff0c;查看 IPv4 地址 和 子网掩码&#xff08;如 192.168.1.5/255.255.2…

在R语言中如何将列的名字改成别的

在 R 中&#xff0c;更改数据框&#xff08;data frame&#xff09;中列的名字可以通过多种方法实现。以下是几种常见的方法&#xff1a; 方法 1&#xff1a;使用 names() 函数 names() 函数可以获取或设置数据框的列名。 示例 假设我们有一个数据框 data&#xff1a; dat…

JUC并发编程(上)

一、JUC学习准备 核心知识点&#xff1a;进程、线程、并发&#xff08;共享模型、非共享模型&#xff09;、并行 预备知识&#xff1a; 基于JDK8,对函数式编程、lambda有一定了解 采用了slf4j打印日志 采用了lombok简化java bean编写 二、进程与线程 进程和线程概念 两者对比…

单地平面6层PCB设计实战:如何兼顾电源与信号完整性?

摘要&#xff1a;面对复杂系统&#xff08;SDRAM、WiFi、电机驱动等&#xff09;且仅有1层地平面的6层板设计挑战&#xff0c;本文从层叠规划、电源噪声抑制、高速信号处理等角度&#xff0c;总结可落地的设计技巧与避坑指南。 一、层叠设计&#xff1a;6层板如何“挤”出最优布…

spark:map 和 flatMap 的区别(Scala)

场景设定 假设有一个包含句子的 RDD&#xff1a; scala val rdd sc.parallelize(List("Hello World", "Hi Spark")) 目标是&#xff1a;将每个句子拆分成单词。 1. 用 map 的效果 代码示例 scala val resultMap rdd.map(sentence > sentence…