aws parallelcluster 理解 parallelcluster 集群的配置和使用

news2024/11/27 6:32:07

参考资料

  • Setup AWS ParallelCluster 3.0 with AWS Cloud9 200

  • HPC For Public Sector Customers 200

  • HPC pcluster workshop 200

  • Running CFD on AWS ParallelCluster at scale 400

  • Tutorial on how to run CFD on AWS ParallelCluster 400

  • Running CFD on AWS ParallelCluster at scale 400

  • Running WRF on AWS ParallelCluster 300

  • Slurm REST API, Accounting and Federation on AWS ParallelCluster 400

  • Running Fire Dynamics CFD Simulation on AWS ParallelCluster at scale 200

  • Spack Tutorial on AWS ParallelCluster

AWS ParallelCluster 是 AWS 支持的开源集群管理工具。它允许客户轻松入门,并在几分钟内更新和扩展 AWS Cloud 中的 HPC 集群环境。支持各种作业调度程序,如 AWS 批处理、 SGE、Torque和 Slurm(Amazon ParallelCluster 3. x 不支持 SGE 和 Torque 调度器),以方便作业提交

pcluster集群配置和创建

安装pcluster工具,需要依赖cdk生成cloudformation模板,因此需要预装node环境

virtualenv pvenv
source pvenv/bin/active
pip3 install --upgrade "aws-parallelcluster"
pcluster version
# pip install aws-parallelcluster --upgrade --user

生成集群配置

$ pcluster configure --config cluster-config.yaml --region cn-north-1

配置文件示例,网络配置参照后文的pcluster集群的网络配置部分

pclusterv3支持的调度器有slurm和awsbatch,这里只涉及到slurm

Region: cn-north-1
Image:
  Os: ubuntu1804
HeadNode:
  InstanceType: m5.large
  Networking:
    SubnetId: subnet-027025e9d9760acdd
  Ssh:
    KeyName: cluster-key
  CustomActions: #自定义行为
    OnNodeConfigured:
      Script: s3://parallelcluster-2e9f54dea72c8134-v1-do-not-delete/script/hello.sh
  Iam:
    S3Access: #访问s3权限
      - BucketName: parallelcluster-2e9f54dea72c8134-v1-do-not-delete
        EnableWriteAccess: false #只读
    AdditionalIamPolicies: # 访问ecr权限
      - Policy: arn:aws-cn:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess
Scheduling:
  Scheduler: slurm
  SlurmSettings:
    Dns:
      DisableManagedDns: false #默认为false,使用r53的dns解析
    ScaledownIdletime: 3 #队列中无任务时3分钟缩容
  SlurmQueues:
    - Name: queue1
      ComputeResources:
        - Name: c5large
          DisableSimultaneousMultithreading: false
          Efa:
            Enabled: false
            GdrSupport: false
          InstanceType: c5.large
          MinCount: 1 #静态实例的数量
          MaxCount: 10
      Iam:
        AdditionalIamPolicies: # 访问ecr权限
          - Policy: arn:aws-cn:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess
      Networking:
        SubnetIds:
          - subnet-027025e9d9760acdd
SharedStorage:
  - FsxLustreSettings: #配置fsx共享存储
      StorageCapacity: 1200
    MountDir: /fsx
    Name: fsx
    StorageType: FsxLustre

创建集群

默认情况下创建的 ParallelCluster 不启用 VPC 流日志

$ pcluster create-cluster --cluster-name mycluster --cluster-configuration cluster-config.yaml

查看集群

$ pcluster describe-cluster --cluster-name mycluster
{
  "creationTime": "2023-01-1xT01:33:01.470Z",
  "version": "3.4.1",
  "clusterConfiguration": {
    "url": "https://parallelcluster-2e9f54dea72c8134-v1-do-not-delete.s3.cn-north-1.amazonaws.com.cn/parallelcluster/3.4.1/clusters/mycluster-69tt2sf5bgsldktx/configs/cluster-config.yaml?versionId=Q7XO1MF.LE4sh3d.K06n49CmQIirsb3k&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAQRIBWRJKH4DPNLIN%2F20230116%2Fcn-north-1%2Fs3%2Faws4_request&..."
  },
  "tags": [...],
  "cloudFormationStackStatus": "CREATE_IN_PROGRESS",
  "clusterName": "mycluster",
  "computeFleetStatus": "UNKNOWN",
  "cloudformationStackArn": "arn:aws-cn:cloudformation:cn-north-1:xxxxxxxxxxx:stack/mycluster/b6ea1050-953d-11ed-ad17-0e468cb97d98",
  "region": "cn-north-1",
  "clusterStatus": "CREATE_IN_PROGRESS",
  "scheduler": {
    "type": "slurm"
  }
}

访问配置链接没有权限,目测是一个presign url,由于中国区账号未备案无法访问

在这里插入图片描述

该对象存储在专用的s3桶中

在这里插入图片描述

查看集群实例

$ pcluster describe-cluster-instances --cluster-name mycluster
{
  "instances": [
    {
      "launchTime": "2023-01-xxT01:35:50.000Z",
      "instanceId": "i-0c3xxxxxxxd164",
      "publicIpAddress": "xx.xx.xx.xx",
      "instanceType": "m5.large",
      "state": "running",
      "nodeType": "HeadNode",
      "privateIpAddress": "172.31.20.150"
    }
  ]
}

更新集群

$ pcluster update-cluster -n mycluster -c cluster-config.yaml

删除集群

$ pcluster delete-cluster --cluster-name mycluster

连接集群

$ pcluster ssh --cluster-name mycluster -i /home/ec2-user/.ssh/cluster-key.pem

获取日志,不需要导入到s3桶之后再下载了

$ pcluster export-cluster-logs --cluster-name mycluster --region cn-north-1 \
  --bucket zhaojiew-test --bucket-prefix logs --output-file /tmp/archive.tar.gz
$ tar -xzvf /tmp/archive.tar.gz
mycluster-logs-202301160516/cloudwatch-logs/ip-172-31-17-51.i-0b3f352aa1a503b5a.cloud-init
mycluster-logs-202301160516/cloudwatch-logs/ip-172-31-17-51.i-0b3f352aa1a503b5a.cloud-init-output
mycluster-logs-202301160516/cloudwatch-logs/ip-172-31-17-51.i-0b3f352aa1a503b5a.computemgtd
mycluster-logs-202301160516/cloudwatch-logs/ip-172-31-17-51.i-0b3f352aa1a503b5a.slurmd
mycluster-logs-202301160516/cloudwatch-logs/ip-172-31-17-51.i-0b3f352aa1a503b5a.supervisord
...
mycluster-logs-202301160516/mycluster-cfn-events

slurm

slurm部分配置

  • slurm配置

(1)JobRequeue

控制要重新排队的批作业的默认值。manager可能重新启动作业,例如,在计划停机之后、从节点故障恢复或者在被更高优先级的作业抢占时

This option controls the default ability for batch jobs to be requeued. Jobs may be requeued explicitly by a system administrator, after node failure, or upon preemption by a higher priority job

作业抢占的报错

slurmstepd: error: *** JOB 63830645 ON p08r06n17 CANCELLED AT 2020-08-18T21:40:52 DUE TO PREEMPTION ***

对于pcluster来说,任务失败会自动重新排队

(2)backfill

https://hpc.nmsu.edu/discovery/slurm/backfill-and-checkpoints/

当作业在回填分区中暂停时,当具有较高优先级的作业完成执行时,它将立即重新启动并从头开始计算

IBM的LSF对backfill解释的还比较清楚,但是不知道和slurm有什么区别

https://www.ibm.com/docs/en/spectrum-lsf/10.1.0?topic=jobs-backfill-scheduling

Introducing new backfill-based scheduler for SLURM resource manager

slurm常用命令

  • Slurm作业调度系统使用指南-USTC超算中心
  • Slurm资源管理与作业调度系统安装配置
  • 北京大学国际数学中心微型工作站slurm使用参考

查看节点

$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
queue1*      up   infinite      9  idle~ queue1-dy-c5large-[1-9]
queue1*      up   infinite      1  down~ queue1-st-c5large-1

提交任务

$ sbatch hellojob.sh

查看任务队列

$ squeue
JOBID PARTITION     NAME     USER    ST       TIME      NODES NODELIST(REASON)
1     queue1        hellojob ubuntu  R        0:01      1     queue1-st-c5large-1
$ squeue --format="%.3i %.9P %.40j %.8T %.10M %.6D %.30R %E"
JOB PARTITION                                     NAME    STATE       TIME  NODES            NODELIST(REASON)    DEPENDENCY
  2    queue1                              hellojob.sh  RUNNING       0:02      1            queue1-st-c5large-1 (null)
$ squeue --states=RUNNING -o "%i" --noheader
2

取消作业

$ scancel $(squeue --states=RUNNING -o "%i" --noheader)

查看计算结果

$ cat slurm-1.out
Hello World from queue1-st-c5large-1

可以使用ssh直接登录节点

$ ssh queue1-st-c5large-1

集群诊断和配置

$ sdiag
$ scontrol show config | grep -i time
BatchStartTimeout       = 10 sec
BOOT_TIME               = 2023-01-16T03:19:54
EioTimeout              = 60
EpilogMsgTime           = 2000 usec
GetEnvTimeout           = 2 sec
GroupUpdateTime         = 600 sec
LogTimeFormat           = iso8601_ms
MessageTimeout          = 60 sec
OverTimeLimit           = 0 min
PreemptExemptTime       = 00:00:00
PrologEpilogTimeout     = 65534
ResumeTimeout           = 1800 sec
SchedulerTimeSlice      = 30 sec
SlurmctldTimeout        = 300 sec
SlurmdTimeout           = 180 sec
SuspendTime             = 180 sec
SuspendTimeout          = 120 sec
TCPTimeout              = 2 sec
UnkillableStepTimeout   = 180 sec
WaitTime                = 0 sec
PMIxTimeout             = 300

提交示例负载程序

mpi示例程序

cat > hello.c << EOF
#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv) {
    // Initialize the MPI environment
    MPI_Init(NULL, NULL);

    // Get the number of processes
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    // Get the rank of the process
    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    // Get the name of the processor
    char processor_name[MPI_MAX_PROCESSOR_NAME];
    int name_len;
    MPI_Get_processor_name(processor_name, &name_len);

    // Print off a hello world message
    printf("Hello world from processor %s, rank %d out of %d processors\n",
           processor_name, world_rank, world_size);

    // Finalize the MPI environment.
    MPI_Finalize();
}
EOF

运行结果

$ mpicc -o hello hello.c
$ mpirun -n 4 hello 
Hello world from processor ip-172-31-23-84, rank 0 out of 4 processors
Hello world from processor ip-172-31-23-84, rank 1 out of 4 processors
Hello world from processor ip-172-31-23-84, rank 2 out of 4 processors
Hello world from processor ip-172-31-23-84, rank 3 out of 4 processors

提交任务

cat > hello.sbatch << EOF 
#!/bin/bash
#SBATCH --job-name=hello-world
#SBATCH --ntasks-per-node=2
#SBATCH --output=/fsx/logs/%x_%j.out

set -x
module load openmpi
mpirun /home/ubuntu/hello
sleep 10
EOF
mkdir -p /fsx/logs
sbatch -N2 /home/ubuntu/hello.sbatch

查看计算结果和过程

$ cat hello-world_4.out
+ module load openmpi
+ mpirun /home/ubuntu/hello
Hello world from processor queue1-dy-c5large-1, rank 0 out of 4 processors
Hello world from processor queue1-dy-c5large-1, rank 1 out of 4 processors
Hello world from processor queue1-st-c5large-1, rank 3 out of 4 processors
Hello world from processor queue1-st-c5large-1, rank 2 out of 4 processors
+ sleep 10

非排他作业

#!/bin/bash
#SBATCH --output=/dev/null
#SBATCH --error=/dev/null
#SBATCH --job-name=sleep-inf
sleep inf
EOF

排他作业

cat > ~/slurm/sleep-exclusive.sbatch << EOF 
#!/bin/bash
#SBATCH --exclusive
#SBATCH --output=/dev/null
#SBATCH --error=/dev/null
#SBATCH --job-name=sleep-inf-exclusive
sleep inf
EOF

pcluster集群的网络配置

pcluster对集群的网络要求比较严格

  • vpc必须开启DNS ResolutionDNS Hostnames

可能的网络配置如下

(1)单个公有子网

  • 子网启用自动分配公有ip
  • 如果实例为多网卡,则需要开启EIP,因为公有 IP 只能分配给使用单个网络接口启动的实例

(2)头节点在公有子网,计算节点在nat私有子网

  • nat需要正确配置,代理计算节点流量
  • 头节点配置同(1)

(3)使用dx连接http proxy

(4)私有子网

  • 必须配置以下终端节点

    ServiceService nameType
    Amazon CloudWatchcom.amazonaws.region-id.logsInterface
    Amazon CloudFormationccom.amazonaws.region-id.cloudformationInterface
    Amazon EC2com.amazonaws.region-id.ec2Interface
    Amazon S3com.amazonaws.region-id.s3Gateway
    Amazon DynamoDBcom.amazonaws.region-id.dynamodbGateway
    Amazon Secrets Manager(AD功能需要)com.amazonaws.region-id.secretsmanagerInterface
  • 禁用route53(默认pcluster会创建,但是r53不支持vpc endpoint)并启动ec2的dns解析(使用ec2的dns主机名称)

    Scheduling:
      ...
      SlurmSettings:
        Dns:
          DisableManagedDns: true
          UseEc2Hostnames: true
    

    在这里插入图片描述

  • 只支持slurm调度器

pcluster自定义ami

https://docs.aws.amazon.com/zh_cn/parallelcluster/latest/ug/building-custom-ami-v3.html

尽量使用节点自定义引导实现节点的自定义,而不是构建ami。因为ami需要在每次集群升级的时候重复构建新的ami

从3.0.0开始pcluster支持构建ami,pcluster依赖 EC2 Image Builder 服务来构建自定义 AMI

创建build配置,其中InstanceTypeParentImage是必须的,使用默认vpc启动构建实例(需要访问互联网),此处明确配置公有子网

https://docs.amazonaws.cn/zh_cn/parallelcluster/latest/ug/Build-v3.html

$ cat > image-config.yaml << EOF
Build:
  InstanceType: c5.4xlarge
  ParentImage: ami-07356f2da3fd22521
  SubnetId: subnet-xxxxxxxxx
  SecurityGroupIds:
    - sg-xxxxxxxxx
  UpdateOsPackages:
    Enabled: true

EOF

image builder构建可能会花费1小时以上的时间,具体步骤如下

  • 通过cloudformation创建基础设施

  • 添加pcluster自定义组件

    https://catalog.us-east-1.prod.workshops.aws/workshops/e2f40d13-8082-4718-909b-6cdc3155ae41/en-US/examples/custom-ami

  • 构建完毕后启动新实例测试新的ami

  • 构建成功删除堆栈

开始构建

$ pcluster build-image --image-configuration image-config.yaml --image-id myubuntu1804
{
  "image": {
    "imageId": "myubuntu1804",
    "imageBuildStatus": "BUILD_IN_PROGRESS",
    "cloudformationStackStatus": "CREATE_IN_PROGRESS",
    "cloudformationStackArn": "arn:aws-cn:cloudformation:cn-north-1:xxxxxxxxxxx:stack/myubuntu1804/f5c1b530-9592-11ed-ad5b-06bf38020c5c",
    "region": "cn-north-1",
    "version": "3.4.1"
  }
}

查看控制台imagebuilder,一共创建了3个components

在这里插入图片描述

启动新的ec2实例进行构建工作

在这里插入图片描述

查看构建日志

$ watch -n 1 'pcluster get-image-log-events -i myubuntu1804 \
        --log-stream-name 3.4.1/1 \
        --query "events[*].message" | tail -n 50'

查看镜像

$ pcluster describe-image --image-id myubuntu1804

删除镜像

$ pcluster delete-image --image-id myubuntu1804

列出官方镜像

$ pcluster list-official-images | grep -B 2 ubuntu1804

最佳实践

(1)实例类型

  • 头节点协调集群的扩展逻辑,并负责将新节点连接到调度器,如果性能不足会导致集群崩溃

  • 头节点通过nfs将任务与计算节点共享,需要确保足够和网络和存储带宽

    以下目录在节点间共享

    • /home,默认的用户 home 文件夹
    • /opt/intel
    • /opt/slurm,Slurm Workload Manager 和相关文件
    $ cat /etc/exports
    /home 172.31.0.0/16(rw,sync,no_root_squash)
    /opt/parallelcluster/shared 172.31.0.0/16(rw,sync,no_root_squash)
    /opt/intel 172.31.0.0/16(rw,sync,no_root_squash)
    /opt/slurm 172.31.0.0/16(rw,sync,no_root_squash)
    $ sudo showmount -e 127.0.0.1
    Export list for 127.0.0.1:
    /opt/slurm                  172.31.0.0/16
    /opt/intel                  172.31.0.0/16
    /opt/parallelcluster/shared 172.31.0.0/16
    /home                       172.31.0.0/16
    

(2)网络性能

  • 使用置放群组,使用cluster策略实现最低的延迟和最高的每秒数据包网络性能
  • 选择支持增强联网,使用EFA类型实例
  • 保证实例具备足够的网络带宽

(3)共享存储

  • 使用fsx或efs等外部存储,避免数据损失,便于集群迁移
  • 使用 custom bootstrap actions 来定制节点,而非使用自定义ami

(4)集群监控

  • 使用sar收集日志
  • 使用node exporter收集指标

相关错误

集群自定义配置脚本出错,bash脚本格式问题,在windows下编辑的换行符问题

[ERROR] Command runpostinstall (/opt/parallelcluster/scripts/fetch_and_run -postinstall) failed
2023-01-16 03:01:40,474 [DEBUG] Command runpostinstall output: /opt/parallelcluster/scripts/fetch_and_run: /tmp/tmp.wI9VD7fhQs: /bin/bash^M: bad interpreter: No such file or directory
parallelcluster: fetch_and_run - Failed to run postinstall, s3://parallelcluster-2e9f54dea72c8134-v1-do-not-delete/script/hello.sh failed with non 0 return code: 126

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

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

相关文章

CSS 伪元素也可以被用于反爬案例?来学习一下。26

先说一下什么是 CSS 中的伪元素&#xff0c;CSS 伪元素的概念是指在 CSS 中使用的一些特殊的元素&#xff0c;它们不存在于 HTML 文档中&#xff0c;而是由浏览器生成的元素&#xff0c;用于提供额外的样式控制。这些伪元素在 HTML 代码中不存在&#xff0c;但可以在 CSS 中通过…

[idekCTF 2023] Malbolge I Gluttony,Typop,Cleithrophobia,Megalophobia

这些题名字我都不认识&#xff0c;这是什么语呀。这个比赛感觉太难了&#xff0c;加上春节将近比较忙&#xff0c;仅作了4个简单题。记录一下。Misc/Malbolge I Gluttony这是个虚拟机的题&#xff0c;放入misc感觉有点不可思忆&#xff0c;题目给了7个命令&#xff0c;有"…

【云原生进阶之容器】第五章容器运行时5.1节--容器运行时总述

1 Kubernetes引言 Kubernetes 已经成为容器编排调度领域的事实标准,其优良的架构不仅保证了丰富的容器编排调度功能,同时也提供了各个层次的扩展接口以满足用户的定制化需求。其中,容器运行时作为 Kubernetes 管理和运行容器的关键组件,当然也提供了简便易用的扩展…

图解二叉树的构造 | 中序 + 后序

中序后续构造二叉树 https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/ 递归思路 递归思路很简单, 因为无论是构造一棵大树还是一棵小树, 都是重复的子问题, 思路主要麻烦在边界上 如下图所示 上述是中序和后续序列 我们要递归, 需…

BetaFlight飞控AOCODARC-F7MINI固件编译

BetaFlight飞控AOCODARC-F7MINI固件编译1. 编译目标&#xff08;AOCODARC-F7MINI&#xff09;2. 编译步骤Step 1 软件配置环境准备Step 2 获取开源代码Step 3 构建命令介绍Step 4 构建命令准备Step 5 厂家目标板查询Step 6 目标固件编译Step 7 目标固件清理3. 参考资料BetaFlig…

MyBatis中TypeHandler的使用教程

一.TypeHandler作用及其使用场景在我们平常开发操作数据库时&#xff0c;查询、插入数据等操作行为&#xff0c;有时会报数据类型不匹配异常&#xff0c;就可以得知数据的类型是不唯一的必然是多种不同的数据类型。并且我们必须要明确的一点就是java作为一门编程语言有自己的数…

如何使用ElementUI的table组件来实现单元格的行合并

前言 最近在编写一个值班的排班表&#xff0c;然后中间涉及到了表格应用。并且还要做出类似这种效果的行合并效果: 然后就开始找组件了。Html的table是有rowsSpan和colsSpan的属性来实现行合并和列合并的。然后就在网上找资料&#xff0c;发现没有几篇能把这两个属性将好的&a…

LeetCode刷题模版:111 - 120

目录 简介111. 二叉树的最小深度112. 路径总和113. 路径总和 II114. 二叉树展开为链表115. 不同的子序列116. 填充每个节点的下一个右侧节点指针117. 填充每个节点的下一个右侧节点指针 II118. 杨辉三角119. 杨辉三角 II120. 三角形最小路径和结语简介 Hello! 非常感谢您阅读海…

SWPUCTF 2022新生赛 web部分wp

&#x1f60b;大家好&#xff0c;我是YAy_17&#xff0c;是一枚爱好网安的小白。 本人水平有限&#xff0c;欢迎各位大佬指点&#xff0c;一起学习&#x1f497;&#xff0c;一起进步⭐️。⭐️此后如竟没有炬火&#xff0c;我便是唯一的光。⭐️ 目录 [SWPUCTF 2022 新生赛]…

linux中使用KubeSphere和集群k8s 部署springboot项目

上期已经介绍了单体k8s部署springboot项目&#xff0c;这期讲解集群k8s部署springboot项目 因为部署方式已经在单体中讲过&#xff0c;现在大体粗略讲一下首先看下集群节点&#xff0c;如下所示&#xff1a; 第一步&#xff1a;创建项目----》按照做的项目名称建 创建后&…

MyCat实现单库分表+代理所有表

MyCAT支持水平分片与垂直分片&#xff1a; 水平分片&#xff1a;一个表格的数据分割到多个节点上&#xff0c;按照行分隔。 垂直分片&#xff1a;一个数据库中多个表格A&#xff0c;B&#xff0c;C&#xff0c;A存储到节点1上&#xff0c;B存储到节点2上&#xff0c;C存储到…

Unity 过场工具(Cutscene)设计(二)

Unity 过场工具(Cutscene)设计&#xff08;二&#xff09; 本章主要分析一下过场一般的必要组成元素&#xff0c;以及在Unity中的制作方案 镜头 通常来说一个表现要求比较高的过场&#xff0c;需要专业的导演进行运镜操作的。 在Unity中官方有一个很好的镜头插件 Cinemachine…

基于Leaflet的VideoOverlay视频图层叠加实战

前言在基于二维的场景中&#xff0c;也许会遇到以下的需求。在某交通路口或者重要的监控点&#xff0c;需要将实时或者录制的视频信息叠加在地图上。更有甚者&#xff0c;随着设备通讯方式的增强&#xff0c;无人机等设备可以采集实时数据&#xff0c;实时回传到控制终端&#…

纵有疾风起,Petterp与他的2022

引言 每逢年末&#xff0c;都要来聊一聊关于今年的各种事情&#xff0c;今昔也不例外:) 与往年不同的是&#xff0c;今天刚搬完家&#xff0c;现在是晚上 1:44 ,正是忙碌一天后比较头痛的时刻。 此刻写点东西&#xff0c;脑子也许会放松一下。&#x1f916; 坐在桌子前&…

RFID技术应用在服装门店管理

服装行业是一个高度一体化的行业&#xff0c;集设计研发、成衣生产、运输、销售于一体。在这些过程中&#xff0c;传统的服装供应链往往消耗巨大的人力、物力和资金成本&#xff0c;但效果一般。当今市场消费者的需求变幻莫测&#xff0c;时尚潮流日新月异。稍有延误&#xff0…

从零编写MDK的FLM烧录算法

文章目录前言一、将代码中的图片资源下载到外部flash1. 修改分散加载文件2. 添加外部flash算法二、制作FLM文件步骤三、使用STM32CubeMX新建工程前言 上文讲过&#xff0c;当我们要下载编译好的镜像到Flash时&#xff0c;首先要做的一步就是选择合适的Flash下载算法&#xff0…

WPS Office 2019 版本 excel透视图创建及删除

摘要&#xff1a;记录一下在做2022年总结数据时遇到的问题&#xff0c;主要问题有2个&#xff0c;①从飞书多维表格导下来数据后不能求和计算和下拉序号&#xff0c;②excel数据透视表创建及删除。 相关文章&#xff1a; 一、Excel WPS Office 2019 版本 excel透视图创建及删…

合作升级|Kyligence 跬智智能分析平台入选华为云联营商品

近日&#xff0c;Kyligence 跬智智能分析平台正式入选华为云联营商品&#xff0c;成为华为云在数据分析领域的联营合作伙伴。通过联营模式&#xff0c;双方将加深在产品、解决方案等多个领域的合作&#xff0c;携手打造“共生、共创、共营、共赢”的合作生态&#xff0c;为用户…

[激光原理与应用-65]:激光器-器件 - 多模光纤(宽频光纤)、单模光纤的原理与区别

第1章 光纤基础与概述1.1 概述光纤是光导纤维的简写&#xff0c;是一种由玻璃或塑料制成的纤维&#xff0c;可作为光传导工具。传输原理是“光的全反射”。微细的光纤封装在塑料护套中&#xff0c;使得它能够弯曲而不至于断裂。通常&#xff0c;光纤的一端的发射装置使用发光二…

Spring Boot(五十三):SpringBoot Actuator之简单实现

1 场景介绍 对于一个大型的几十个、几百个微服务构成的微服务架构系统&#xff0c;在线上时通常会遇到下面一些问题&#xff0c;比如&#xff1a; 1. 如何知道哪些服务除了问题&#xff0c;如何快速定位&#xff1f; (健康状况&#xff09; 2. 如何统一监控各个微服务的性能指标…