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

Spark 介绍

Spark 架构

Spark 是一个基于内存计算的大数据处理框架,相比 Hadoop 的 MapReduce,它能够提供 更高效的迭代计算流式计算能力。Spark 采用 主从架构(Master-Slave),主要包括 Driver、Cluster Manager、Worker、Executor 和 Task 等核心组件。

1. Spark 组件架构

1.1 核心组件

组件作用
Driver(驱动程序)负责任务调度,向 Cluster Manager 申请资源,管理 SparkContext。
Cluster Manager(集群管理器)负责资源调度,如 Standalone、YARN、Mesos、Kubernetes。
Worker(工作节点)运行在集群节点上,管理 Executor 进程,执行具体计算任务。
Executor(执行器)由 Worker 启动,执行 Spark 任务,并存储中间计算数据。
Task(任务)运行在 Executor 之上,每个 Stage 被划分为多个 Task 并行执行。

1.2 Spark 架构示意图

+------------------------------------------------------+
|                        Driver                        |
|  - 任务调度                                           |
|  - 运行 SparkContext                                |
|  - 将 Job 划分为多个 Stage                           |
+------------------------------------------------------+| 向集群管理器申请资源V
+------------------------------------------------------+
|                  Cluster Manager                     |
|  - 资源调度                                          |
|  - 可选:Standalone / YARN / Mesos / Kubernetes      |
+------------------------------------------------------+| 分配 Worker 节点V
+----------------+      +----------------+      +----------------+
|    Worker 1    |      |    Worker 2    |      |    Worker 3    |
|  - 启动 Executor  |      |  - 启动 Executor  |      |  - 启动 Executor  |
|  - 执行 Task    |      |  - 执行 Task    |      |  - 执行 Task    |
+----------------+      +----------------+      +----------------+

2. Spark 运行模式

Spark 可以运行在不同的集群管理器上:

  • Standalone:Spark 自带的资源管理器,简单易用,适合小规模集群。
  • YARN(Hadoop Yarn 集群):适合 Hadoop 生态环境。
  • Mesos(Apache Mesos 集群):适合多租户资源调度。
  • Kubernetes(K8s 集群):适用于云计算和容器化部署。

3. Spark 任务执行流程

Spark 任务的执行大致分为以下几个步骤:

3.1 任务提交

  1. Driver 进程启动 SparkContext,并向 Cluster Manager 申请资源
  2. Cluster Manager 分配 Worker 节点,并在 Worker 上 启动 Executor

3.2 Job 分解

  1. Driver 将 Job 拆分为多个 Stage(基于 DAG 计算)。
  2. 每个 Stage 由多个 Task 组成,并被分配到不同的 Executor 运行。

3.3 Task 执行

  1. Executor 执行 Task,计算数据并存储中间结果(RDD)。
  2. Executor 向 Driver 汇报任务执行状态,若失败则重新调度 Task。

3.4 结果返回

  1. 任务执行完成后,Driver 收集最终计算结果,存储到 HDFS、Kafka、MySQL 等。

4. Spark 计算模型

Spark 计算任务是基于 RDD(Resilient Distributed Dataset)DAG(有向无环图) 进行调度的。

4.1 RDD(弹性分布式数据集)

RDD 是 Spark 最核心的数据抽象,提供:

  • 分区(Partition):数据被分成多个分区,并行计算。
  • 容错性:基于 Lineage(血缘) 记录转换关系,支持自动恢复。
  • 惰性计算:只有在 Action 触发时,RDD 才会真正执行计算。

RDD 转换类型:

  • Transformation(转换):如 map()filter()flatMap()(不会立即执行)。
  • Action(行动):如 count()collect()saveAsTextFile()(触发计算)。

4.2 DAG(有向无环图)

  • Spark 任务会构建 DAG(DAGScheduler),将 RDD 之间的依赖关系转换为多个 Stage
  • 每个 Stage 由 多个 Task 组成,并行执行计算任务。

示例:

val data = sc.textFile("hdfs://input.txt")  // RDD1
val words = data.flatMap(_.split(" "))      // RDD2(Transformation)
val wordCount = words.map((_, 1))           // RDD3(Transformation)
val result = wordCount.reduceByKey(_ + _)   // RDD4(Transformation)
result.saveAsTextFile("hdfs://output.txt")  // Action 触发计算

Spark 内部执行过程:

  1. DAG 构建阶段
    • RDD1 -> RDD2 -> RDD3 -> RDD4
  2. Stage 划分阶段
    • flatMap()map() 形成 Stage 1
    • reduceByKey() 形成 Stage 2
  3. Task 并行执行
    • 每个 Stage 划分多个 Task,并分发到 Executor 执行。

5. Spark 生态组件

Spark 具备丰富的生态系统,适用于不同场景:

组件作用
Spark CoreRDD API,DAG 调度,任务执行。
Spark SQL运行 SQL 查询,支持 DataFrame、Dataset API。
Spark Streaming实时流处理,支持 Kafka、Flume 等数据源。
MLlib机器学习库,支持 K-Means、决策树等算法。
GraphX图计算引擎,支持 PageRank、社区检测等。

6. Spark 与 Hadoop 对比

对比项SparkHadoop(MapReduce)
计算模型RDD 内存计算磁盘读写
速度高速,适用于流计算慢,适用于批处理
容错机制RDD 通过 Lineage 恢复任务失败后重跑
适用场景实时计算、流处理批处理、大规模数据存储

7. 适用场景

  • 数据分析(数据挖掘、数据清洗)
  • 实时流计算(结合 Kafka 实现流式数据处理)
  • 机器学习(推荐系统、分类预测)
  • 图计算(社交网络分析、PageRank)

总结

Spark 采用 Driver + Executor 的分布式架构,基于 RDD 进行数据计算,通过 DAG 调度任务,并支持 SQL、流式计算、机器学习 等多种应用场景。相较于 Hadoop,Spark 计算更快,适合 大数据分析、实时计算和 AI 训练

Checkpoint

Spark 中的 Checkpoint 作用

Checkpoint(检查点) 主要用于 RDD 持久化和容错,可以将 RDD 的数据存储到**持久化存储(如 HDFS、S3)**中,以便在失败时快速恢复计算,避免从头计算整个 DAG。

1. 为什么需要 Checkpoint?

在 Spark 中,RDD 具有血缘关系(Lineage),Spark 通过血缘追踪来进行故障恢复。如果某个计算任务失败,Spark 会重新从原始数据集按照血缘关系重新计算
但是,在以下情况下,依赖血缘恢复可能导致 高额计算开销

  1. RDD 计算链路太长:如果 RDD 经过多次 Transformation,失败后重新计算的开销会很大。
  2. Driver 内存溢出:RDD 的血缘信息存储在 Driver 中,过长的 Lineage 可能会导致 Driver 负担过重,甚至 OOM。
  3. 需要数据持久化:某些情况下(如流式计算),需要持久化部分数据以便后续任务读取。

Checkpoint 可以 截断 RDD 血缘依赖,将计算结果持久化,避免重复计算,提高容错能力。

2. Checkpoint 的作用

(1) 提高容错能力

  • 在 RDD 发生丢失时,不再依赖 Lineage 重新计算,而是直接从持久化存储中加载数据,提高恢复速度。

(2) 减少 DAG 依赖

  • 通过 Checkpoint 截断 RDD 的血缘依赖,避免 DAG 过长,减少 Driver 负担。

(3) 持久化计算结果

  • 适用于需要在不同任务中复用的 RDD,如流式计算(Spark Streaming)中的状态数据。

3. Checkpoint vs Cache

CheckpointCache / Persist
存储位置持久化到HDFS / S3 / 本地磁盘存储在Executor 的内存 / 磁盘
数据存储方式持久化后会丢弃 RDD 血缘信息保留 RDD 血缘信息
恢复方式任务失败后直接从 Checkpoint 读取任务失败后需要从头重新计算
适用场景长计算链路 / 流式计算 / 容错短期数据复用 / 内存充足
  • Cache/Persist 适用于频繁访问数据,但不能容错,如果 Executor 挂掉,数据会丢失,需要重新计算。
  • Checkpoint 适用于长计算 DAG 或需要持久化数据的场景,但由于存储到 HDFS,速度较慢。

4. Checkpoint 使用方式

(1) 开启 Checkpoint

在使用 Checkpoint 之前,需要设置存储目录

import org.apache.spark.SparkContext
import org.apache.spark.SparkConfval conf = new SparkConf().setAppName("CheckpointExample").setMaster("local[*]")
val sc = new SparkContext(conf)// 1. 设置 Checkpoint 存储路径
sc.setCheckpointDir("hdfs://namenode:9000/spark-checkpoint")// 2. 创建 RDD
val rdd = sc.parallelize(Seq(1, 2, 3, 4, 5))// 3. 设置 Checkpoint
rdd.checkpoint()// 4. 触发计算
rdd.count()
  • sc.setCheckpointDir(path) 设置 Checkpoint 目录(必须是 HDFS、S3 或本地持久化存储)。
  • rdd.checkpoint() 标记 RDD 需要 Checkpoint
  • 由于 Checkpoint 是惰性执行的,必须在 Action(如 count()collect())时触发计算并存储。

(2) 与 Cache 结合使用

由于 Checkpoint 计算会重新执行整个 DAG,可以先 cache(),然后 checkpoint(),避免重复计算:

val rdd = sc.textFile("hdfs://namenode:9000/data.txt").map(_.split(" "))rdd.cache()  // 缓存 RDD 避免重复计算
rdd.checkpoint()  // 持久化数据rdd.count()  // 触发计算
  • cache() 先把数据缓存到内存,避免在 checkpoint 时重复计算

5. Checkpoint 在 Spark Streaming 中的应用

Spark Streaming 中,Checkpoint 用于存储 Streaming 计算状态,保证数据处理的容错性,防止任务重启后状态丢失。

(1) 设置 Checkpoint 目录

import org.apache.spark.streaming.{Seconds, StreamingContext}// 创建 StreamingContext
val ssc = new StreamingContext(sc, Seconds(5))// 设置 Checkpoint 目录
ssc.checkpoint("hdfs://namenode:9000/streaming-checkpoint")// 创建 DStream
val lines = ssc.socketTextStream("localhost", 9999)
val wordCounts = lines.flatMap(_.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)// 启动流式计算
ssc.start()
ssc.awaitTermination()
  • ssc.checkpoint(path) 设置 Checkpoint 目录,用于存储流式计算的状态数据(如窗口聚合数据)。
  • 适用于 窗口操作(window, updateStateByKey) 场景。

6. 总结

  • Checkpoint 作用:

    1. 持久化 RDD,避免 DAG 过长导致计算性能下降。
    2. 提高容错性,避免 Executor 挂掉时重算整个 DAG。
    3. 适用于 Streaming 计算,存储流式数据状态。
  • 使用方法:

    1. sc.setCheckpointDir() 设置目录。
    2. 对 RDD 调用 checkpoint()
    3. 触发 Action(如 count())来执行 checkpoint 计算。
  • Checkpoint vs Cache

    • Cache/Persist 适用于临时缓存,提高性能,但不具备容错能力
    • Checkpoint 适用于长计算链路、流式计算,保证容错,但性能略慢

🚀 最佳实践:

  • 长时间运行的任务(如 Spark Streaming)必须开启 Checkpoint
  • Checkpoint 和 Cache 结合使用,避免重复计算导致性能下降。

并行度

Apache Spark 是一个分布式并行计算框架,基于 RDD(弹性分布式数据集) 进行并行计算,并利用集群资源提高计算效率。

Spark 的计算模型遵循 MapReduce 的思想,但相比 Hadoop,Spark 采用 内存计算,并且支持更加细粒度的任务调度和优化,大大提升了计算性能。

Spark 的并行度(parallelism) 取决于以下几个因素:

  1. RDD 的分区数(Partitions)
  2. Executor 的数量
  3. CPU 核心数
  4. 并行任务数(Task 并发数)

1. RDD 的分区数

在 Spark 中,RDD 是由多个 分区(Partitions) 组成的,每个分区可以在一个 Task 中独立计算,因此分区数决定了并行度

  • 默认情况下:
    • sc.textFile(path) 读取 HDFS 文件时,分区数 = HDFS block 数量(通常是 128MB 一个 block)。
    • sc.parallelize(data, numSlices) 允许手动指定分区数 numSlices

示例:

val rdd = sc.parallelize(Seq(1, 2, 3, 4, 5), 3) // 设置 3 个分区
println(rdd.partitions.length)  // 输出: 3

分区数越多,并行度越高,但过多的分区会导致 任务调度开销增加,降低整体效率。

2. Executor 并行度

Executor 是 Spark 任务的执行单元,每个 Executor 拥有多个 CPU 核心,可同时运行多个 Task。

  • Executor 并行度计算方式:
    [
    并行度 = Executors 数量 \times 每个 Executor 的 CPU 核心数
    ]

例如:

--num-executors 5  --executor-cores 4

表示:

  • 5 个 Executors
  • 每个 Executor 4 核心
  • 最大并行 Task 数 = 5 × 4 = 20

3. 并行任务数(Task 并发数)

Spark 会按照RDD 分区数来决定 Task 数量,并由集群的可用资源(Executor 和 核心数)来决定同时能运行的 Task 数量

并行任务数计算公式:
[
并行任务数 = min( RDD 分区数, 总 CPU 核心数 )
]
例如:

  • RDD 分区数 = 100
  • Spark 资源 = 10 Executors,每个 4 核心
  • 总可用核心数 = 10 × 4 = 40

并行度 = min(100, 40) = 40(同时执行 40 个 Task)

如何调整并行度?

  1. 增加 RDD 分区数
    • rdd.repartition(n)(增加或减少分区)
    • rdd.coalesce(n)(减少分区,避免数据洗牌)
  2. 增加 Executor 核心数
    • --executor-cores N
    • --num-executors M
  3. 增加 Task 并发
    • spark.default.parallelism(全局默认并行度)
    • spark.sql.shuffle.partitions(SQL Shuffle 时的分区数)
      示例:
val rdd = sc.parallelize(Seq(1, 2, 3, 4, 5), 10) // 增加分区数提高并行度

总结

影响因素说明影响并行度
RDD 分区数任务并行度取决于分区数分区数越多并行度越高
Executor 数量任务运行的执行节点数量Executors 越多并行度越高
Executor 核心数每个 Executor 可并行运行的 Task 数核心数越多并行度越高
Task 并发数Task 调度和 CPU 资源影响并发Task 数量受 CPU 资源限制

🔥 最佳实践:

  • 大数据计算时,确保 RDD 分区数 ≥ 任务 CPU 核心数,以充分利用计算资源。
  • 避免单个 Task 计算过长,导致 CPU 资源利用率低下
  • Spark SQL 计算时,适当调整 spark.sql.shuffle.partitions(默认 200),减少 Shuffle 代价。

🚀 结论:
Spark 是 并行计算框架,并行度主要由 RDD 分区数、Executor 数量、CPU 核心数、任务调度 共同决定,合理调整参数可以优化计算性能。

相关文章:

Spark 介绍

Spark 架构 Spark 是一个基于内存计算的大数据处理框架,相比 Hadoop 的 MapReduce,它能够提供 更高效的迭代计算 和 流式计算能力。Spark 采用 主从架构(Master-Slave),主要包括 Driver、Cluster Manager、Worker、Ex…...

mac Homebrew安装、更新失败

我这边使用brew安装git-lfs 一直报这个错: curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL更新brew update也是报这个错误。最后使用使用大佬提供的脚本进行操作: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/mast…...

【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.2.3案例:电商订单日志每秒10万条写入优化

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 Elasticsearch批量写入性能调优实战:2.2.3 案例:电商订单日志每秒10万条写入优化1. 原始架构与瓶颈分析1.1 初始集群配置1.2 性能瓶颈定位 2. 全链路…...

http的post请求不走http的整个缓存策略吗?

http的post请求不走http的整个缓存策略吗? DeepSeek R1 思考 33 秒 思考过程 嗯,用户问的是HTTP的POST请求是否不遵循整个缓存策略。我需要先回忆一下HTTP缓存的基本机制,然后考虑不同请求方法的缓存处理。 首先,HTTP缓存通常涉…...

c++ 预处理器和iostream 文件

在C中&#xff0c;预处理器和<iostream>头文件各自扮演关键角色&#xff0c;二者协同工作以实现程序的输入输出功能。以下是它们的详细关系和作用&#xff1a; 1. 预处理器的作用 处理预处理指令&#xff1a;预处理器在编译前执行&#xff0c;处理所有以#开头的指令&…...

【前端】前端设计中的响应式设计详解

文章目录 前言一、响应式设计的定义与作用二、响应式设计的原则三、响应式设计的实现四、响应式设计的最佳实践总结 前言 在当今数字化时代&#xff0c;网站和应用程序需要适应各种设备&#xff0c;从桌面电脑到平板电脑和手机。响应式设计应运而生&#xff0c;成为一种可以适…...

探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(二)

文章目录 2.3.3 极化编码巴氏参数与信道可靠性比特混合生成矩阵编码举例 2.3.4 极化译码最小单元译码串行抵消译码&#xff08;SC译码&#xff09;算法SCL译码算法 2.3.5 总结**Polar 码的优势****Polar 码的主要问题****Polar 码的应用前景** 2.3.6 **参考文档** 本博客为系列…...

打开 Windows Docker Desktop 出现 Docker Engine Stopped 问题

一、关联文章: 1、Docker Desktop 安装使用教程 2、家庭版 Windows 安装 Docker 没有 Hyper-V 问题 3、安装 Windows Docker Desktop - WSL问题 二、问题解析 打开 Docker Desktop 出现问题,如下: Docker Engine Stopped : Docker引擎停止三、解决方法 1、检查服务是否…...

6.人工智能与机器学习

一、人工智能基本原理 1. 人工智能&#xff08;AI&#xff09;定义与范畴 核心目标&#xff1a;模拟人类智能行为&#xff08;如推理、学习、决策&#xff09;分类&#xff1a; 弱人工智能&#xff08;Narrow AI&#xff09;&#xff1a;专精单一任务&#xff08;如AlphaGo、…...

RabbitMQ怎么实现延时支付?

一、使用“死信队列”消息过期时间 1、原理&#xff1a; 设置消息”存活时间“&#xff0c;如果没有被及时消费&#xff0c;就会被丢弃到一个”死信队列“&#xff0c;然后消费者监听这个死信队列处理消息 2、步骤&#xff1a; 2.1、创建两个队列&#xff1a; 2.1.1、普通队…...

vite-vue3使用web-worker应用指南和报错解决

主线程&#xff1a;初始化worker和监听子线程的消息 let worker: any; const salesConfigData ref<any[]>([]); // 显示非上架 const showNotList ref(false);// /src/views/ceshi/salesConfig/worker.js worker new Worker(new URL("/src/views/ceshi/salesConf…...

校园快递助手小程序毕业系统设计

系统功能介绍 管理员端 1&#xff09;登录&#xff1a;输入账号密码进行登录 2&#xff09;用户管理&#xff1a;查看编辑添加删除 学生信息 3&#xff09;寄件包裹管理&#xff1a;查看所有的包裹信息&#xff0c;及物流信息 4&#xff09;待取件信息&#xff1a;查看已到达的…...

python量化交易——金融数据管理最佳实践——使用qteasy管理本地数据源

文章目录 统一定义的金融历史数据表最重要的数据表数据表的定义交易日历表的定义&#xff1a;交易日历表: trade_calendar qteasy是一个功能全面且易用的量化交易策略框架&#xff0c; Github地址在这里。使用它&#xff0c;能轻松地获取历史数据&#xff0c;创建交易策略并完…...

BIO、NIO、AIO、Netty从简单理解到使用

Java编程中BIO、NIO、AIO是三种不同的I/O&#xff08;输入/输出&#xff09;模型&#xff0c;它们代表了不同的I/O处理方式。 Netty就是基于Java的NIO&#xff08;New Input/Output&#xff09;类库编写的一个高性能、异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可…...

计算机毕业设计SpringBoot+Vue.js工厂车间管理系统源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

一、图形图像的基本概念

文章目录 一、分辨率概念二、图形图像的区别三、位图和矢量图的区别 一、分辨率概念 图形显示计数中的分辨率概念有三种&#xff0c;即屏幕分辨率、显示分辨率和显卡分辨率。它们既有区别又有着密切的联系&#xff0c;对图形显示的处理有极大的影响。 1.屏幕分辨率 显示器分辨…...

前端跨域问题初探:理解跨域及其解决方案概览

在当今的Web开发中&#xff0c;跨域问题是一个常见且棘手的挑战 随着前端技术的不断进步&#xff0c;越来越多的应用需要从不同的域名、协议或端口获取资源 然而&#xff0c;浏览器的同源策略&#xff08;Same-Origin Policy&#xff09;限制了这种跨域请求&#xff0c;以确保…...

SQL分组问题

下列为电商公司用户访问时间数据 统计某个用户连续的访问记录&#xff0c;如果时间间隔小于60s&#xff0c;就分为一组 id ts 1001 17523641234 1001 17523641256 1002 17523641278 1001 17523641334 1002 17523641434 1001 17523641534 1001 17523641544 1002 17523…...

Oracle 数据库基础入门(二):深入理解表的约束

在 Oracle 数据库的学习进程中&#xff0c;表的约束是构建健壮、准确且高效数据库的关键要素。约束如同数据库的 “规则守护者”&#xff0c;它通过对数据的限制&#xff0c;确保了数据的完整性和一致性&#xff0c;就如同交通规则保障道路上车辆行驶的有序性一样。对于 Java 全…...

DeepSeek掘金——DeepSeek-R1驱动的房地产AI代理

DeepSeek掘金——DeepSeek-R1驱动的房地产AI代理 本文探讨如何使用 Smolagents 和 DeepSeek-R1 构建房地产代理,并利用工具进行网页抓取和数据导出。 AI 代理对于自动化复杂的推理任务至关重要。Smolagents 是由 Hugging Face 开发的轻量级 AI 代理框架,允许将大型语言模型 …...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...