当前位置: 首页 > news >正文

Spark Core基础与源码剖析全景手册


Spark Core基础与源码剖析全景手册

Spark作为大数据领域的明星计算引擎,其核心原理、源码实现与调优方法一直是面试和实战中的高频考点。本文将系统梳理Spark Core与Hadoop生态的关系、经典案例、聚合与分区优化、算子底层原理、集群架构和源码剖析,结合流程图、源码片段和速记口诀,帮助你快速掌握Spark核心知识。


1. Spark Core与Hadoop生态复习

1.1 Spark Core概述

Spark Core作用
Spark Core是Spark的内核,负责RDD(弹性分布式数据集)管理、任务调度、内存管理和容错机制等,是所有Spark组件的基础。

核心特性

  • RDD(弹性分布式数据集):核心数据抽象,支持分布式、不可变、容错。
  • 懒加载(Lazy Evaluation):转换操作不会立即执行,触发Action时才真正计算。
  • 容错机制:DAG血缘追踪,自动重算丢失分区。
  • 内存计算:极大提升大数据处理速度。

口诀:RDD弹性,懒加载,血缘容错,快如闪电。


1.2 Hadoop生态系统梳理

  • HDFS:分布式文件存储
  • MapReduce:分布式计算模型
  • YARN:资源调度框架
  • 生态组件:Hive(数据仓库)、HBase(NoSQL)、Zookeeper、Sqoop、Flume、Oozie等

口诀:三驾马车(HDFS、MR、YARN),生态百花齐放。


1.3 Spark核心术语

  • RDD:不可变、分区、弹性容错的数据集
  • Partition:RDD的基本分片单位
  • Stage:DAG中的阶段,窄依赖划分
  • Task:作用于Partition的计算单元
  • Job:用户提交的完整计算逻辑

口诀:Job拆Stage,Stage分Task,Task跑分区,RDD串血缘。


1.4 HadoopRDD源码剖析

Spark通过HadoopRDD与Hadoop生态(如HDFS、HBase)对接,底层读取数据采用Hadoop InputFormat。

getPartitions源码
override def getPartitions: Array[Partition] = {val jobContext = new JobContextImpl(conf, jobId)val inputFormat = inputFormatClass.newInstance()val rawSplits = inputFormat.getSplits(jobContext)val result = new Array[Partition](rawSplits.size)for (i <- 0 until rawSplits.size) {result(i) = new HadoopPartition(id, i, rawSplits(i))}result
}
  • 流程:Hadoop切分→Spark封装分区→数据对接
compute源码
override def compute(split: Partition, context: TaskContext): Iterator[(K, V)] = {val hadoopPartition = split.asInstanceOf[HadoopPartition]val attemptId = newTaskAttemptID()val hadoopAttemptContext = new TaskAttemptContextImpl(conf, attemptId)val inputFormat = inputFormatClass.newInstance()val reader = inputFormat.createRecordReader(hadoopPartition.inputSplit.value, hadoopAttemptContext)reader.initialize(hadoopPartition.inputSplit.value, hadoopAttemptContext)new Iterator[(K, V)] {private var havePair = falseprivate var finished = falseprivate def getNext(): Boolean = {if (!finished && reader.nextKeyValue()) { havePair = true; true }else { finished = true; false }}override def hasNext: Boolean = if (!havePair) getNext() else trueoverride def next(): (K, V) = {if (!hasNext) throw new NoSuchElementException("End of stream")havePair = false(reader.getCurrentKey, reader.getCurrentValue)}}
}
  • 流程图
InputFormat.getSplits → InputSplit[] → HadoopPartition[]
HadoopPartition → RecordReader → (K,V) Iterator

口诀:分片分区,读器遍历,KV产出,迭代输出。


2. Spark常用案例与算子剖析

2.1 WordCount源码分析与图解

val lines = sc.textFile("file.txt")
val words = lines.flatMap(_.split(" "))
val pairs = words.map((_, 1))
val counts = pairs.reduceByKey(_ + _)
counts.collect().foreach(println)
  • 流程图
文本 → flatMap → map → reduceByKey
行    拆词     (词,1)  词频聚合

口诀:读拆映聚,词频统计。

关键算子源码
  • textFile(HadoopRDD + map(_._2))
  • flatMap/map(MapPartitionsRDD)
  • reduceByKey(combineByKey底层实现)

2.2 常用集合操作API

  • map:逐元素映射
  • flatMap:映射并扁平化
  • filter:条件过滤
  • groupByKey:按key分组
  • reduceByKey:按key聚合

口诀:映射分组,过滤聚合,操作灵活。


2.3 PV/UV分析案例

val pv = logs.count()
val uv = logs.map(_.userId).distinct().count()
  • PV:count计数
  • UV:distinct去重后计数

口诀:PV计数,UV去重。


2.4 RDD源码结构与血缘

  • 核心属性:partitions, dependencies, compute, iterator
  • 依赖类型:NarrowDependency(窄依赖)、ShuffleDependency(宽依赖)

口诀:分区依赖,懒计算,血缘追溯,容错重算。


3. 聚合与分区优化源码剖析

3.1 聚合API与底层实现

  • reduceByKey:底层调用combineByKey
  • aggregateByKey:可设初值,分区内/间聚合
  • combineByKey:三步(初始、分区内、分区间)

口诀:简聚reduce,初值aggregate,灵活combine。

combineByKey源码
def combineByKey[C](createCombiner: V => C,mergeValue: (C, V) => C,mergeCombiners: (C, C) => C,numPartitions: Int
): RDD[(K, C)] = {new ShuffledRDD[K, V, C](self, part, serializer).setAggregator(new Aggregator[K, V, C](createCombiner, mergeValue, mergeCombiners))
}

口诀:首遇建桶,内聚合并,跨分区合。


3.2 分区调优

  • 参数spark.default.parallelism, numPartitions
  • 方法repartition(全shuffle),coalesce(减少分区,少shuffle)

口诀:分区合理,快慢有度,合并coalesce,重分repartition。


4. Shuffle底层实现与优化

4.1 Shuffle写入(map端)

  • 流程:分桶(partitioner)、排序(可选)、序列化与溢写(ExternalSorter)、输出(data file + index file)
  • 文件结构
    • shuffle_0_0.data:所有桶数据合一
    • shuffle_0_0.index:记录每个桶起止偏移

口诀:分桶排序,内存溢写,索引分隔,文件合一。

4.2 Shuffle读取(reduce端)

  • 流程:获取元数据(MapOutputTracker)、远程拉取(ShuffleBlockFetcherIterator)、聚合排序、容错重试

口诀:元数据定位,远程拉取,聚合排序,自动容错。

4.3 ShuffleManager对比

  • SortShuffleManager(默认):合桶存储,节省空间,支持排序
  • HashShuffleManager:每桶一文件,文件爆炸,不支持排序
  • Tungsten/UnsafeShuffleManager:堆外内存,性能优先

口诀:排序合桶,节省空间;哈希分桶,文件爆炸;Tungsten堆外,性能优先。


5. 聚合算子物理执行与优化

5.1 reduceByKey底层流程

  1. 分区内聚合(mergeValue)
  2. shuffle分桶写文件
  3. reduce端拉取分桶数据并聚合(mergeCombiners)

流程简图

分区1: (A,1),(A,2),(B,1)
分区2: (A,3),(B,2)
→ 分区内聚合 → (A,3),(B,1); (A,3),(B,2)
→ shuffle分桶
→ reduce端聚合 → (A,6),(B,3)

口诀:分区先合,桶间再聚。

5.2 combineByKey三步

  • createCombiner:首次遇key建立桶
  • mergeValue:分区内聚合
  • mergeCombiners:跨分区聚合

口诀:首次建桶,分区内合,跨区再聚,减少传输。


6. 调度系统深度剖析

6.1 DAGScheduler与TaskScheduler

  • DAGScheduler:将RDD操作DAG划分为Stage,管理Stage依赖
  • TaskScheduler:负责将Stage中的分区转为Task,分发到Executor

源码流程

// DAGScheduler.submitJob
val finalStage = newStage(...)
submitStage(finalStage)def submitStage(stage: Stage): Unit = {if (stage.parents.isEmpty) {taskScheduler.submitTasks(taskSet)} else {stage.parents.foreach(submitStage)}
}

口诀:DAG划分,Stage递进,Task分发,本地优先。


7. 容错、推测执行与参数调优

7.1 容错与推测执行

  • 血缘(Lineage)容错:RDD依赖链可重算丢失分区
  • Shuffle文件丢失:Driver可重算map task
  • 推测执行:检测慢task,允许冗余执行,避免慢节点拖后腿

口诀:血缘追溯,丢失重算,推测执行,容错加速。

7.2 重点参数

  • spark.shuffle.compress:是否压缩
  • spark.shuffle.file.buffer:文件缓冲区
  • spark.reducer.maxSizeInFlight:reduce端拉取并发量
  • spark.shuffle.sort.bypassMergeThreshold:bypass优化
  • spark.speculation:推测执行开关

口诀:压缩节流,缓冲调优,推测补位,参数先行。


8. 集群架构与部署运维

8.1 角色与架构

  • Driver:任务提交与调度
  • Executor:执行Task与缓存
  • Cluster Manager:YARN/Standalone/K8s
  • Worker:Standalone模式下运行Executor

口诀:Driver调度,Executor计算,Manager分配。

8.2 资源调度与高可用

  • 参数spark.executor.memoryspark.executor.coresspark.driver.memory
  • HA:Standalone支持Zookeeper主备
  • History Server:历史作业追踪与调优

口诀:内存CPU,合理分配。主备高可用,ZK做协调。历史追踪,日志可查。

8.3 YARN集群搭建与JAR包管理

  • YARN模式:client/cluster
  • 调优参数yarn.nodemanager.resource.memory-mb
  • JAR包管理--jars--packages、推荐HDFS分发

口诀:YARN调度,参数适配。依赖合规,HDFS分发。


9. 经典面试与实战答题模板

  • reduceByKey底层流程?
    分区内本地聚合,shuffle分桶写文件,reduce端拉取分桶数据再聚合,采用索引+数据文件结构,丢失可血缘重算,慢任务可推测执行。

  • SortShuffle与HashShuffle区别?
    SortShuffle合桶存储、索引分隔、文件少、支持排序;HashShuffle每桶一文件,文件数多,不支持排序。

  • Shuffle读写的网络协议和容错?
    基于Netty RPC,reduce端并发拉取数据,失败自动重试或重算map task。


10. 速记口诀大合集

口诀适用场景详细解释
RDD弹性,懒加载,血缘容错,快如闪电Spark Core本质RDD灵活、延迟、容错、快
分片分区,读器遍历,KV产出,迭代输出HadoopRDD源码分片分区、RecordReader迭代KV
读拆映聚,词频统计WordCount读文件、拆词、映射、聚合
分区依赖,懒计算,血缘追溯,容错重算RDD血缘与依赖窄依赖、懒执行、血缘追溯、自动容错
分区先聚,跨区再合reduceByKey等聚合算子先本地聚合,后跨节点聚合
三步合并,聚合核心,shuffle分发combineByKey底层初始、分区内、分区间三步合并
分桶排序,内存溢写,索引分隔,文件合一shuffle写端分桶排序、溢写磁盘、索引分隔、合一文件
元数据定位,远程拉取,聚合排序,自动容错shuffle读端查元数据、拉取聚合、自动重试
路径规范,偏移定位,RPC拉取,容错重算shuffle文件与拉取路径规范、index偏移、RPC拉取、重算
首次建桶,分区内合,跨区再聚,减少传输combineByKey聚合流程本地聚合减少数据量,跨区再聚合
血缘追溯,丢失重算,推测执行,容错加速容错与推测执行血缘可重算,慢任务推测执行
DAGScheduler划分,Task分发,本地优先调度原理DAG分Stage,Task分发本地优先

结语

本手册结合源码、流程、架构、调度、底层实现与调优要点,辅以口诀助记,既适合Spark初学者体系化学习,也为有经验者面试、查漏补缺与实战调优提供一站式参考。

如需**某一环节(如DAGScheduler状态流转、推测执行源码、具体shuffle二进制结构、Executor资源分配源码等)**进一步源码剖析,欢迎留言或私信交流!


关注我,获取更多大数据实战与源码剖析干货!

相关文章:

Spark Core基础与源码剖析全景手册

Spark Core基础与源码剖析全景手册 Spark作为大数据领域的明星计算引擎&#xff0c;其核心原理、源码实现与调优方法一直是面试和实战中的高频考点。本文将系统梳理Spark Core与Hadoop生态的关系、经典案例、聚合与分区优化、算子底层原理、集群架构和源码剖析&#xff0c;结合…...

抖音视频如何下载保存?高清无水印一键保存到手机!

你是不是经常在抖音上刷到超有趣的短视频&#xff0c;想保存下来却不知道怎么做&#xff1f;或者下载后发现带有烦人的水印&#xff1f;别担心&#xff01;今天教你最简单、最快速的抖音视频下载方法&#xff0c;无水印、高清画质&#xff0c;轻松搞定&#xff01; 为什么要下…...

SCAU--平衡树

3 平衡树 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: G;GCC;VC;JAVA;PYTHON 描述 平衡树并不是平衡二叉排序树。 这里的平衡指的是左右子树的权值和差距尽可能的小。 给出n个结点二叉树的中序序列w[1],w[2],…,w[n]&#xff0c;请构造平衡树&#xff0c…...

图的几种存储方法比较:二维矩阵、邻接表与链式前向星

图是一种非常重要的非线性数据结构&#xff0c;广泛应用于社交网络、路径规划、网络拓扑等领域。在计算机中表示和存储图结构有多种方法&#xff0c;本文将详细分析三种常见的存储方式&#xff1a;二维矩阵&#xff08;邻接矩阵&#xff09;、邻接表和链式前向星&#xff0c;比…...

【AS32X601驱动系列教程】MCU启动详解

在嵌入式开发领域&#xff0c;掌握MCU&#xff08;微控制单元&#xff09;的启动流程是工程师们迈向深入开发的关键一步。本文将带您深入了解MCU启动的奥秘&#xff0c;从编译过程到启动文件&#xff0c;再到链接脚本和系统时钟配置&#xff0c;全方位解析MCU启动流程。 在实际…...

计算机视觉与深度学习 | Matlab实现EMD-GWO-SVR、EMD-SVR、GWO-SVR、SVR时间序列预测(完整源码和数据)

以下是一个完整的Matlab时间序列预测实现方案,包含EMD-GWO-SVR、EMD-SVR、GWO-SVR和SVR四种方法的对比。代码包含数据生成、信号分解、优化算法和预测模型实现。 %% 主程序:时间序列预测对比实验 clc; clear; clearvars; close all;% 生成模拟时间序列数据 rng(1); % 固定随…...

Visual Studio 2022 插件推荐

Visual Studio 2022 插件推荐 Visual Studio 2022 (简称 VS2022) 是一款强大的 IDE&#xff0c;适合各类系统组件、框架和应用的开发。插件是接入 VS2022 最重要的扩展方式之一&#xff0c;它们可以大幅提升开发效率、优化代码质量&#xff0c;并提供强大的调试和分析功能。 …...

[luogu12541] [APIO2025] Hack! - 交互 - 构造 - 数论 - BSGS

传送门&#xff1a;https://www.luogu.com.cn/problem/P12541 题目大意&#xff1a;有一个数 n n n&#xff0c;你不知道是多少&#xff1b;你每次可以向交互库询问一个正整数集合 A A A&#xff08;其中元素互不相同&#xff09;&#xff0c;交互库返回&#xff1a;将集合中…...

openjdk底层(hotspot)汇编指令调用(五)——内存访问

根据前面关于aarch64架构下的编码解释可知&#xff0c;在src\hotspot\cpu\架构文件夹下&#xff0c; assembler_xx.hpp assembler_xx.cpp register_xx.hpp register_xx.cpp register_definitions_xx.cpp这些文件是有关寄存器定义以及汇编编码函数实现的文件。 对于前述的ope…...

几款常用的虚拟串口模拟器

几款常用的虚拟串口模拟器&#xff08;Virtual Serial Port Emulator&#xff09;&#xff0c;适用于 Windows 系统&#xff0c;可用于开发和调试串口通信应用&#xff1a; 1. com0com (开源免费) 特点&#xff1a; 完全开源免费&#xff0c;无功能限制。 可创建多个虚拟串口…...

ChimeraX介绍

UCSF ChimeraX 是一款由美国加州大学旧金山分校(UCSF)开发的下一代分子可视化软件,是经典的 UCSF Chimera 的继任者。它集成了强大的分子结构可视化、分析、建模和动画功能,广泛应用于结构生物学、药物设计、分子建模等领域。 1. 下载安装: Download UCSF ChimeraX 2. …...

【Linux】初见,基础指令

前言 本文将讲解Linux中最基础的东西-----指令&#xff0c;带大家了解一下Linux中有哪些基础指令&#xff0c;分别有什么作用。 本文中的指令和选项并不全&#xff0c;只介绍较为常用的 pwd指令 语法&#xff1a;pwd 功能&#xff1a;显示当前所在位置&#xff08;路径&#xf…...

链表的面试题8之环形链表

许久不见&#xff0c;那么这是最后倒数第三题了&#xff0c;这道题我们来看一下环形链表。 老规矩贴链接&#xff1a;141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 目录 倒数第k个元素 获取中间元素的问题。 双指针 来&#xff0c;大致看一下题目&#xff0c;这…...

OBS Studio:windows免费开源的直播与录屏软件

OBS Studio是一款免费、开源且跨平台的直播与录屏软件。其支持 Windows、macOS 和 Linux。OBS适用于&#xff0c;有直播需求的人群或录屏需求的人群。 Stars 数64,323Forks 数8413 主要特点 推流&#xff1a;OBS Studio 支持将视频实时推流至多个平台&#xff0c;如 YouTube、…...

邂逅Node.js

首先先要来学习一下nodejs的基础&#xff08;和后端开发有联系的&#xff09; 再然后的学习路线是学习npm&#xff0c;yarn&#xff0c;cnpm&#xff0c;npx&#xff0c;pnpm等包管理工具 然后进行模块化的使用&#xff0c;再去学习webpack和git&#xff08;版本控制工具&…...

React 常见的陷阱之(如异步访问事件对象)

文章目录 前言1. 异步访问事件对象问题解决方案 2. 事件传播的误解**问题**解决方案 **3. 事件监听器未正确卸载****问题****解决方案** **4. 动态列表中的事件绑定****问题****解决方案** **5. 第三方库与 React 事件冲突****问题****解决方案** **6. 表单输入与受控组件****问…...

【LinkedList demo 内部类讲说】

LinkedList demo 内部类讲说 1. Node节点2.MyLinkedList3. LinkedListTest 测试类 1. Node节点 public class Node<T> {private Node<T> pre;private Node<T> next;private T data;public Node() {}public Node getPre() {return pre;}public void setPre(N…...

Sql刷题日志(day9)

一、笔试 1、limit offset&#xff1a;分页查询 SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET start_row; --跳过前 start_row 行&#xff0c;返回接下来的 number_of_rows 行。 2、lag、lead&#xff1a;查询前后行数据 --lag函数用于访问当…...

46 python pandas

Pandas是Python数据分析的利器,也是各种数据建模的标准工具 一、什么是pandas pandas 是 Python 中用于数据处理和分析的核心库,提供了高效的数据结构(如Series和DataFrame)和数据操作工具,广泛应用于数据清洗、分析、可视化等场景。 最常用的是用来处理excel数据。 二…...

告别延迟!Ethernetip转modbustcp网关在熔炼车间监控的极速时代

熔炼车间热火朝天&#xff0c;巨大的热风炉发出隆隆的轰鸣声&#xff0c;我作为一名技术操控工&#xff0c;正密切关注着监控系统上跳动的各项参数。这套基于EtherNET/ip的监控系统&#xff0c;是我们车间数字化改造的核心&#xff0c;它将原本分散的控制单元整合在一起&#x…...

Prompt Tuning:高效微调大模型的新利器

Prompt Tuning(提示调优)是什么 Prompt Tuning(提示调优) 是大模型参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)的重要技术之一,其核心思想是通过优化 连续的提示向量(而非整个模型参数)来适配特定任务。以下是关于 Prompt Tuning 的详细解析: 一、核心概念…...

⼆叉搜索树详解

1. ⼆叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: • 若它的左⼦树不为空&#xff0c;则左⼦树上所有结点的值都⼩于等于根结点的值 • 若它的右⼦树不为空&#xff0c;则右⼦树上所有结点的值都⼤于等于根结…...

CompleteableFuture的异步任务编排

为什么会有CompleteableFuture Java 的 1.5 版本引入了 Future&#xff0c;可以把它简单的理解为运算结果的占位符&#xff0c; 它提供了两个方法来获取运算结果。 get()&#xff1a;调用该方法线程将会无限期等待运算结果。get(longmeout, TimeUnit unit)&#xff1a;调用该…...

珈和科技贺李德仁院士荣膺国际数字地球学会会士:以时空智能赋能可持续发展目标 绘就数字地球未来蓝图

4月22日&#xff0c;第十四届国际数字地球会议在重庆盛大启幕。在这场在全球范围内数字地球领域具有国际影响力的学术盛会上&#xff0c;国际数字地球学会向珈和科技的企业顾问&#xff0c;2023年度国家最高科学技术奖得主李德仁院士授予了“国际数字地球学会会士”最高荣誉称号…...

【CodeBuddy 】从0到1,打造一个“牛马打鸡血仪”

【CodeBuddy 】从0到1&#xff0c;打造一个“牛马打鸡血仪” 我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 &#x1f31f;嗨&#xff0c;我是LucianaiB&#…...

BI是什么意思?一文讲清BI的概念与应用!

目录 一、BI 是什么意思 1. BI 的定义 2. BI 的发展历程 3. BI 的核心组件 二、BI 的应用场景 1. 销售与市场营销 2. 财务管理 ​编辑3. 人力资源管理 4. 生产与运营管理 ​编辑三、选择合适的 BI 工具 1. 考虑企业的需求和规模 2. 评估工具的功能和性能 3. 关注工…...

可编辑PPT | 华为安全架构设计方法指南华为数字化转型架构解决方案

这份文档是华为的安全架构设计方法指南&#xff0c;它详细介绍了安全架构设计的重要性、方法和流程。文档强调安全架构是软件研发技术体系中的关键DFX能力&#xff0c;与可靠性、性能等并列&#xff0c;尤其在云计算和复杂网络环境下&#xff0c;安全性设计显得尤为重要。华为的…...

1.6 提示词工程(二)

目录 3.2 提供参考文本 3.2.1 使用参考文本来构建答案​ 3.2.2 指导模型用引用的文本回答问题​ 3.3 把复杂的任务拆分成简单的子任务​ 3.3.1 利用意图分类确定与用户查询最相关的指令​ 3.3.2 针对需要长时间对话的应用程序&#xff0c;应概括或过滤之前的对话内容​ …...

WIFI信号状态信息 CSI 深度学习之数据集

Building occupant activity sensing dataset based on WIFI CSI&#xff08;WiSA&#xff09; 所有的数据以及实验参数都上传到了figshare中并配备详细说明&#xff0c;供参考。 论文链接&#xff1a;WiSA: Privacy-enhanced WiFi-based activity intensity recognition in …...

基于服务器的 DPI 深度分析解决方案

一、传统网络流量分析的瓶颈与挑战 在企业网络管理体系中&#xff0c;传统流量分析模式高度依赖网络设备作为数据采集核心节点&#xff0c;无论是基于 NetFlow/IPFIX 等流协议的流量分析&#xff0c;还是通过端口镜像技术实现的流量监控&#xff0c;均以交换机、路由器等网络设…...

动态规划(5):线性动态规划

引言 所谓线性动态规划,通常指状态定义和转移具有线性结构的动态规划问题,其状态通常可以用一维数组表示,状态转移主要依赖于相邻或前面有限个状态。这类问题的特点是状态空间呈线性排列,每个状态只与有限个前置状态相关,使得问题结构相对简单,更容易理解和掌握。 一维…...

c语言- 如何构建CMake项目(Linux/VSCode)

目录 linux&#xff08;vscode&#xff09;构建C语言CMake项目 1. 检查linux是否下载cmake&#xff0c;否则执行下列代码 2. 在vscode下载cmake的插件CMake Tools 3. 构建项目&#xff08;项目结构&#xff09; 4. 进行cmake配置 1. 在VS Code中按下ctrl shift p键&…...

HJ17 坐标移动【牛客网】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 HJ17 坐标移动 一、题目描述 二、测试用例 三、解题思路 基本思路&#xff1a;   这题的难点在于理解题目和如何处理各种情况。题目是给定一串指令&#xff0c;首先要判断指令是否合法…...

HGHAC集群滚动扩展或更换硬盘设备

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;N/A 版本&#xff1a;4.5.8 文档用途 集群版本&#xff1a;hghac4.2.1 数据库版本&#xff1a;hgdb-see-4.5.8 此步骤适用于所有hac架构的hgdb集群。 主要用途&#xff1a;HAC集群服务器滚动扩展或更换硬盘 本文…...

虚拟环境中VSCode运行jupyter文件

用VS Code打开jupyter文件&#xff0c;点击右上角 Select Kernel 在正上方会出现这个选择框&#xff0c;选择 Python Environment 会出来所有的虚拟环境&#xff0c;选择要用的环境行...

【蓝桥杯嵌入式】【模块】六、PWM相关配置及代码模板

1. 前言 最近在准备16届的蓝桥杯嵌入式赛道的国赛&#xff0c;打算出一个系列的博客&#xff0c;记录STM32G431RBT6这块比赛用板上所有模块可能涉及到的所有考点&#xff0c;如果有错误或者遗漏欢迎各位大佬斧正。 本系列博客会分为以下两大类&#xff1a; 1.1. 单独模块的讲…...

力扣-盛最多水的容器

1.题目描述 2.题目链接 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 3.题目解析 题目中的储水量两边差*短边高度。也就是说&#xff0c;两条边中&#xff0c;决定储水量的是短边的高度。 我们可以定义两个指针&#xff0c;一个在最左边&#xff0c;一个在…...

数据实时同步:inotify + rsync 实现数据实时同步

1 数据实时同步 在生产环境中&#xff0c;某些场景下&#xff0c;要将数据或文件进行实时同步&#xff0c;保证数据更新后其它节点能立即获得最新的数据。 数据同步的两种方式 PULL&#xff1a;拉&#xff0c;使用定时任务的方式配合同步命令或脚本等&#xff0c;从指定服务…...

C#学习第24天:程序集和部署

程序集知识点 1.程序集的基本概念 程序集是部署和版本控制的最小单位。它可以是可执行文件&#xff08;.exe&#xff09;或动态链接库&#xff08;.dll&#xff09;。包含元数据和清单&#xff08;Manifest&#xff09;&#xff0c;描述程序集的内容和依赖关系。 2.程序集清单…...

mac .zshrc:1: command not found: 0 解决方案

nano ~/.zshrc 使用自带的nano命令打开文件&#xff0c;修改后 Ctrl X 然后输入y 然后回车即可保存成功 一般情况下&#xff0c;不是常用这个命令&#xff0c;除非是遇到有问题的文件&#xff0c;才用&#xff0c; 例如 遇到下面的问题 /Users/xxli/.zshrc:1: command no…...

学习设计模式《十》——代理模式

一、基础概念 代理模式的本质【控制对象访问】&#xff1b; 代理模式的定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问&#xff1b; 代理模式的功能&#xff1a;代理模式是通过创建一个代理对象&#xff0c;用这个代理对象去代表真实的对象&#xff1b;客户端得…...

RestFul操作ElasticSearch:索引与文档全攻略

RestFul方式操作ES 索引库操作 创建索引库 PUT /索引库名称 {"mappings":{"properties":{"字段名":{"type":"字段类型","analyzer":"分词器","index":"是否参与搜索(布尔值)"},…...

OpenCV 图像读取与显示

一、知识点: 1、读取图像 (1)、Mat imread( const String & filename, int flags IMREAD_COLOR_BGR ); (2)、返回值: Mat&#xff0c;返回读取的图像。 若读取图像失败&#xff0c;则返回一个空的对象&#xff0c;对象.empty()为true。 (3)、参数filename: String是…...

Django快速入门篇

Django官网 https://docs.djangoproject.com/zh-hans/4.2/ 官方介绍 官方版本 推荐LTS版本&#xff0c;python3.9/3.10 djongo 每两年会出一个LTS版本 关于环节djongo&#xff0c;conda直接安装即可 conda create -n myenv python3.9 conda activate myenv pip install dj…...

C++23 新增扁平化关联容器详解

文章目录 一、引言已有关联容器回顾新容器的引入原因 二、std::flat_set定义与特性代码示例适用场景 三、std::flat_multiset定义与特性代码示例适用场景 四、std::flat_map定义与特性代码示例适用场景 五、std::flat_multimap定义与特性代码示例适用场景 六、与其他容器的比较…...

当PLC遇上电焊机器人:EtherCAT转CANopen上演工业级“语言翻译官”

在汽车自动化产线中&#xff0c;PLC与电焊机器人的高效协同是提升生产效率的关键。但PLC常用的EtherCAT协议与电焊机器人采用的CANopen协议存在通信壁垒&#xff0c;JH-ECT009疆鸿智能EtherCAT转CANopen技术成为打破这一障碍的核心方案。 应用拓扑图 EtherCAT是高速工业以太网协…...

LeetCode 1345. 跳跃游戏 IV(困难)

题目描述 给你一个整数数组 arr &#xff0c;你一开始在数组的第一个元素处&#xff08;下标为 0&#xff09;。 每一步&#xff0c;你可以从下标 i 跳到下标 i 1 、i - 1 或者 j &#xff1a; i 1 需满足&#xff1a;i 1 < arr.lengthi - 1 需满足&#xff1a;i - 1 …...

Linux bash shell的循环命令for、while和until

1、for命令 for命令&#xff0c;允许你创建一个遍历一系列值的循环&#xff0c;每次迭代都使用其中一个 值来执行已定义好的一组命令。 for var in list do commands done # 在list参数中&#xff0c;你需要提供迭代中要用到的一系列值。 # 可以通过几种不同的方法指定列表中的…...

三、【数据建模篇】:用 Django Models 构建测试平台核心数据

【数据建模篇】&#xff1a;用 Django Models 构建测试平台核心数据 前言我们要设计哪些核心数据&#xff1f;准备工作&#xff1a;创建 Django App开始设计数据模型 (Models)1. 通用基础模型 (可选但推荐)2. 项目模型 (Project)3. 模块模型 (Module)4. 测试用例模型 (TestCase…...

Mac如何允许安装任何来源软件?

打开系统偏好设置-安全性与隐私&#xff0c;点击右下角的解锁按钮&#xff0c;选择允许从任何来源。 如果没有这一选项&#xff0c;请到打开终端&#xff0c;输入命令行&#xff1a;sudo spctl --master-disable, 输入命令后回车&#xff0c;输入电脑的开机密码后回车。 返回“…...