文章目录

        • 一、整体架构概述
        • 二、核心组件详解
          • 1. SparkContext
          • 2. DAG Scheduler
          • 3. Task Scheduler
          • 4. Executor
        • 三、作业执行流程
          • 1. DAG 生成与 Stage 划分
          • 2. Task 调度与执行
          • 3. 内存管理
        • 四、Shuffle 机制详解
          • 1. Shuffle 过程
          • 2. Shuffle 优化
        • 五、内存管理机制
          • 1. 统一内存管理(Unified Memory Management)
          • 2. Tungsten 优化
        • 六、容错机制
          • 1. Lineage(血统)
          • 2. Checkpoint
          • 3. 任务重试
        • 七、调度策略
          • 1. 任务调度
          • 2. 推测执行
        • 八、性能优化关键点
          • 1. 数据本地性
          • 2. 并行度调整
          • 3. 内存调优
        • 九、高级特性
          • 1. Catalyst 优化器
          • 2. Tungsten 项目
        • 十、监控与调试工具
          • 1. Spark UI
          • 2. 事件日志
          • 3. Spark 性能调优工具

一、整体架构概述

Spark 采用主从架构(Master-Slave),主要组件包括:

  • Driver Program:运行用户应用的 main 函数,负责创建 SparkContext、分析作业、调度任务。
  • Cluster Manager:资源管理器,如 YARN、Mesos、Standalone
  • Worker Node:集群中的工作节点,负责执行具体任务。
  • ExecutorWorker 节点上的进程,负责运行任务并缓存数据。

执行流程

  1. 用户提交应用,Driver 启动并创建 SparkContext
  2. SparkContext 连接 Cluster Manager,请求资源。
  3. Cluster Manager 分配资源,在 Worker 节点上启动 Executor
  4. Driver 将任务分发给 Executor 执行。
  5. ExecutorDriver 汇报任务状态和结果。
二、核心组件详解
1. SparkContext
  • Spark 应用的入口,负责与 Cluster Manager 通信,协调资源分配。
  • 管理 RDD 的依赖关系(血统图),并生成 DAG(有向无环图)。
2. DAG Scheduler
  • 将作业(Job)分解为多个阶段(Stage),每个阶段包含多个任务(Task)。
  • 根据 RDD 的依赖关系划分 Stage
    • 宽依赖(如 shuffle)会触发新的 Stage
    • 窄依赖(如 map、filter)会被合并到同一个 Stage
3. Task Scheduler
  • Task 分配给具体的 Executor 执行。
  • 负责任务调度、重试失败的任务,以及处理推测执行(Speculative Execution)。
4. Executor
  • 负责执行 Task,并将结果返回给 Driver
  • 维护内存缓存,存储 RDD 分区数据。
三、作业执行流程
1. DAG 生成与 Stage 划分
# 示例代码
rdd = sc.textFile("data.txt")  # 读取文件,创建 RDD
words = rdd.flatMap(lambda line: line.split())  # 转换操作
pairs = words.map(lambda word: (word, 1))  # 转换操作
counts = pairs.reduceByKey(lambda a, b: a + b)  # 触发 Shuffle
counts.collect()  # 动作操作,触发作业执行

执行流程

  1. collect() 触发作业提交。
  2. DAG Scheduler 将作业划分为两个 Stage
    • Stage 1:执行 textFile、flatMap、map 操作。
    • Stage 2:执行 reduceByKeycollect 操作,依赖于 Stage 1 的输出。
2. Task 调度与执行
  • ShuffleMapTask:执行 Stage 1 的任务,输出中间结果(Shuffle 文件)。
  • ResultTask:执行 Stage 2 的任务,读取 Shuffle 文件并聚合结果。
3. 内存管理
  • Storage Memory:存储缓存的 RDDDataFrame
  • Execution Memory:执行 Shuffle、聚合、排序等操作的内存。
  • User Memory:用户代码使用的内存。
四、Shuffle 机制详解
1. Shuffle 过程
  1. Map 端

    • 将数据分区并写入内存缓冲区。
    • 缓冲区满时溢写到磁盘,生成多个小文件。
    • 最终合并所有小文件为一个大文件,并生成索引。
  2. Reduce 端

    • 从各个 Map 任务拉取属于自己的数据。
    • 合并数据并按 key 排序。
    • 执行聚合或其他操作。
2. Shuffle 优化
  • Sort Shuffle:默认实现,减少文件数量。
  • Tungsten-Sort Shuffle:基于内存管理框架 Tungsten,提高效率。
  • 自适应执行(Spark 3.0+):动态调整 Shuffle 分区数。
五、内存管理机制
1. 统一内存管理(Unified Memory Management)
  • Spark 1.6+ 引入,StorageExecution 内存可相互借用:
    # 内存配置参数
    spark.memory.fraction = 0.6  # 统一内存占堆内存的比例
    spark.memory.storageFraction = 0.5  # Storage 内存占统一内存的比例
    
2. Tungsten 优化
  • 堆外内存:减少 GC 压力,提高内存访问效率。
  • 二进制格式:直接操作二进制数据,避免 Java 对象开销。
六、容错机制
1. Lineage(血统)
  • RDD 记录其创建过程(依赖关系),当部分分区丢失时,可通过重新计算恢复。
2. Checkpoint
  • RDD 写入可靠存储(如 HDFS),切断血统关系,用于长依赖链的 RDD
    rdd.checkpoint()  # 设置检查点
    
3. 任务重试
  • Task 失败时,Task Scheduler 会自动重试(默认 4 次)。
七、调度策略
1. 任务调度
  • FIFO(默认):先进先出。
  • FAIR:公平调度,支持多作业共享资源。
    # 启用公平调度
    spark.conf.set("spark.scheduler.mode", "FAIR")
    
2. 推测执行
  • 当某个任务执行缓慢时,会在其他节点启动副本任务,取最先完成的结果。
    # 启用推测执行
    spark.conf.set("spark.speculation", "true")
    
八、性能优化关键点
1. 数据本地性
  • PROCESS_LOCAL:数据在同一 JVM 内,最快。
  • NODE_LOCAL:数据在同一节点,但需跨进程传输。
  • RACK_LOCAL:数据在同一机架的不同节点。
  • ANY:数据在任意位置。
2. 并行度调整
  • 根据集群资源设置合理的并行度:
    # 设置默认并行度
    spark.conf.set("spark.default.parallelism", 200)
    
3. 内存调优
  • 调整 Executor 内存和堆外内存:
    spark.executor.memory = 8g
    spark.memory.offHeap.enabled = true
    spark.memory.offHeap.size = 2g
    
九、高级特性
1. Catalyst 优化器
  • Spark SQL 的查询优化器,将 SQL 查询转换为高效的物理执行计划:
    • 分析:解析 SQL 语句,检查表和列是否存在。
    • 逻辑优化:应用规则优化逻辑计划(如谓词下推、投影修剪)。
    • 物理计划生成:生成多个物理计划并选择最优。
    • 代码生成:将执行计划编译为 Java 字节码。
2. Tungsten 项目
  • 优化内存和 CPU 利用率:
    • 二进制数据处理,减少内存占用。
    • 避免 Java 对象开销,直接操作内存。
十、监控与调试工具
1. Spark UI
  • 查看作业、阶段、任务的执行情况,内存使用等指标。
2. 事件日志
  • 记录作业执行的详细信息,可用于离线分析:
    # 启用事件日志
    spark.eventLog.enabled = true
    spark.eventLog.dir = "hdfs:///spark-logs"
    
3. Spark 性能调优工具
  • Shuffle 调优:分析 Shuffle 性能瓶颈。
  • SQL 执行计划分析:查看 SQL 查询的优化过程。

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

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

相关文章

xlsx-style 插件批量导出多个sheet表格excel中遇到的问题及解决

Vue2中 前端界面导出表格,使用XLSXS插件版本(^0.8.13)导出表格存在表格背景颜色无法正常展示,百分比数据没有正常展示 【有条件的尽量先升级高版本插件,此插件版本对样式支持度不够】 优先考虑插件版本升级 同样的使用方法在vue3中没有出现错…

Java后端与Vue前端项目部署全流程:从环境配置到Nginx反向代理

文章目录 1. 准备项目所需的环境2. 后端项目打包步骤 1:使用 Maven 打包步骤 2:定位生成的 JAR 包步骤 3:上传 JAR 包到 Linux 系统步骤 4:验证 Java 环境步骤 5:启动 JAR 包 3. 前端项目打包步骤 1:执行 B…

Mybatis踩坑之一天

background: 对接AML系统,日间实时需要送交易对手要素过去(目前主要是交易对手全名),夜间需要将历史交易送AML进行回溯,交互方式是文件。文件要素为日期、对手类型、对手名、交易流水之类。 设置对送AML的文件设计表…

【PyTorch】分布式训练报错记录-ERROR:torch.distributed.elastic.multiprocessing.api:failed (exitcode: 1)

最近,我在服务器上起基于PyTorch分布式框架的预训练实验,起初实验都在顺利进行,但是当我们把模型的深度与宽度调大之后,模型在训练几代之后便会出现如下的报错: WARNING:torch.distributed.elastic.multiprocessing.a…

有哪些词编码模型

有哪些词编码模型 词编码模型:是将自然语言符号映射为稠密的高维向量,使语义相近的词汇在向量空间中位置接近。 不过,也有部分模型会考虑字母或字符信息,如基于字节对编码(BPE)的模型会将单词拆分成子词,这里的子词可能是字母组合。 词编码模型的原理主要是通过机器学…

Mono 功能介绍与使用示例

Mono 功能介绍与使用示例 一、核心概念与特性 Mono 是 Spring Reactor 框架中的核心组件,属于响应式编程(Reactive Programming)模型,专注于处理包含 0 或 1 个元素 的异步序列[1][2][5]。其核心特点包括: 异步非阻…

5060Ti双显卡+LLaMA-factory大模型微调环境搭建

查看环境确定安装版本安装CUDA12.8安装Anaconda安装Visual Studio C桌面开发环境(编译llama.cpp需要)安装cmake(编译llama.cpp需要)安装llama.cpp(用于量化)安装huggingface-cli安装llama-factory安装PyTorch2.7.0安装bitsandbytes安装flash-attention加…

Lnmp和XunRuiCMS一键部署(Rocky linux)

先上传XunRuiCMS-Study.zip包到当前目录,可以去官网下载 #!/bin/bash # function: install nginx mysql php on Rocky Linux 9.5 with fixed PHP-FPM configip$(hostname -I | awk {print $1}) yhxunrui passwordxunrui123# 检查是否为root用户 if [ "$USER&qu…

高精度OFDR设备在CPO交换机中的应用

光电共封装(CPO)交换机的特点 核心需求:CPO将光模块与交换芯片集成封装,缩短电互连距离,降低功耗和延迟,但需解决以下挑战: 1.光器件微型化:硅光芯片、光纤阵列等需高精度制造。 …

Vulkan 通过 CMake 集成 Dear ImGUI

一、 目录与文件部署 从官网获取 IMGUI 代码库,在项目 extern 目录下新建 imgui 目录,将相关文件复制进去,构建出如下目录结构: . ├── build ├── extern │ ├── glfw │ ├── glm │ └── imgui │ ├…

Linux设备框架:kset与kobject基本介绍

系列文章目录 Linux设备框架:kset与kobject基本介绍 [link] Linux设备框架:kset与kobject源码分析 [link] kset与kobject基本介绍 一、前言二、kobject、kset和设备的关系2.1 kset 结构体2.2 kobject 结构体 三、总结 一、前言 Linux 设备模型如同一座拥…

【AI论文】扩展大型语言模型(LLM)智能体在测试时的计算量

摘要:扩展测试时的计算量在提升大型语言模型(LLMs)的推理能力方面已展现出显著成效。在本研究中,我们首次系统地探索了将测试时扩展方法应用于语言智能体,并研究了该方法在多大程度上能提高其有效性。具体而言&#xf…

LeapMotion-PhysicalHandsManager 类详解

PhysicalHandsManager 类详解 这个类是 Ultraleap 物理手交互系统的核心管理器,负责处理手部物理交互的不同模式。下面我将详细解析这个类的结构和功能: 类概述 PhysicalHandsManager 继承自 LeapProvider,是物理手交互系统的中央控制器: public class PhysicalHandsMa…

vue-22(理解组合式 API:setup、ref、reactive)

Vue.js 中的组合式 API 代表了我们构建和组织组件方式的重大转变。它为传统的选项式 API 提供了一种更灵活、更强大的替代方案,尤其适用于复杂的应用程序。本章将深入探讨组合式 API 的核心概念:setup函数、ref和reactive,为你构建更可维护、…

【Golang玩转MCP】-实现一个加减乘除MCP服务

文章目录 概要1 首先创建一个MCP服务器2 添加MCP工具如何测试我们的MCP服务功能是否正常呢小结 概要 今天我们使用golang简单实现一个加减乘除MCP服务 1 首先创建一个MCP服务器 s : server.NewMCPServer("Hello World Server","1.0.0",server.WithToolCa…

计算机网络期末 网络基础概述

目录 网络的定义历史发展(了解) 网络的分类,功能和应用(熟悉) 网络的组成与结构(理解) 网络的 OSI 七层参考模型(熟悉) 网络的 TCP/IP 四次模型(理解) 网络有关性能指标(掌握) 网络的定义历史发展(了解) 计算机网络是什么 四个阶段 总结 网络 互连网 因特网的…

SwiftUI学习笔记day4: Lecture 4 | Stanford CS193p 2023

Lecture 4 | Stanford CS193p 2023 课程链接:https://www.youtube.com/watch?v4CkEVfdqjLw 代码仓库:iOS 课程大纲: 简要课程大纲:SwiftUI 高级主题 Swift 访问控制(Access Control) 5 个级别&#xff1…

Docker 高级管理——容器通信技术与数据持久化

目录 一、Docker 容器的网络模式 1. Bridge 模式 2. Host 模式 3. Container 模式 4. None 模式 5. Overlay 模式 6. Macvlan 模式 7. 自定义网络模式 二、端口映射 1. 端口映射 2. 随机映射端口 3. 指定映射端口 (1)固定端口 (…

git操作案例 -设置远程分支,并提交到新远程新分支

文章目录 前言一、分析当前的问题二、修改远程仓库地址(一)修改远程仓库地址场景 现有保留远程分支场景替换现有远程分支 二、 找回已经提交的文件场景:提交后,代码在本地仓库但未推送 三、同步远程分支四、提交到新远程的新分支 …

mysql一张表,其中一个字段设置了唯一索引,又设置了普通索引,查询的时候很慢,没有走普通索引,是const

问题分析 在 MySQL 中,当一个字段同时存在唯一索引和普通索引时,查询优化器通常会优先选择最严格的索引(即能最快缩小结果集的索引)。在你的场景中,优化器选择了唯一索引并将查询视为const类型,这通常是高…