✨博客主页: https://blog.csdn.net/m0_63815035?type=blog
💗《博客内容》:大数据、Java、测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识
📢博客专栏: https://blog.csdn.net/m0_63815035/category_11954877.html
📢欢迎点赞 👍 收藏 ⭐留言 📝
📢本文为学习笔记资料,如有侵权,请联系我删除,疏漏之处还请指正🙉
📢大厦之成,非一木之材也;大海之阔,非一流之归也✨
前言
一、概述
简介
- Apache Spark 是快速通用的分布式计算引擎,诞生于加州大学伯克利分校AMP实验室,基于内存计算,适用于迭代算法(如数据挖掘、机器学习)。
- 核心优势:中间结果缓存于内存,减少磁盘IO,比Hadoop MapReduce快10-100倍。
历史
- 2009年始于伯克利大学,2010年开源,2014年成为Apache顶级项目。
- 主要创始人Matei Zaharia创立了Databricks公司,推动Spark商业化。
与MapReduce对比
特性 MapReduce Spark 编程模型 仅Map和Reduce 支持多种算子(map、flatMap等) 运算效率 中间结果写入磁盘,IO开销大 中间结果存内存,基于DAG优化调度 适用场景 离线计算 离线+实时计算 数据共享 依赖HDFS读写 内存缓存复用 核心特点
- 快:内存计算+DAG引擎,速度远超MapReduce。
- 易用:支持Scala、Java、Python等多语言,提供80+高级算法。
- 通用:一站式支持批处理(Spark Core)、交互式查询(Spark SQL)、流处理(Spark Streaming)、机器学习(MLlib)、图计算(GraphX)。
- 兼容:可整合Hadoop生态(HDFS、YARN等)。
二、核心组件
Spark Core
- 核心组件,负责离线批处理,提供RDD(弹性分布式数据集)抽象。
其他组件
- Spark SQL:结构化数据查询,支持SQL和DataFrame。
- Spark Streaming:准实时流处理,基于DStream。
- MLlib:机器学习库,包含分类、回归等算法。
- GraphX:图计算库,支持图算法(如PageRank)。
三、运行架构
核心角色
- Driver:负责任务调度、DAG生成、与集群通信。
- Executor:运行Task,缓存数据,位于Worker节点。
- Cluster Manager:资源管理器(支持Standalone、YARN、K8s等)。
运行流程
- 提交应用→Driver申请资源→Executor反向注册→解析代码生成RDD→DAG调度划分Stage→Task分发至Executor执行。
运行模式
- Local:本地模式,用于调试,单进程多线程模拟集群。
- Standalone:Spark自带集群模式,Master-Worker架构。
- YARN:整合Hadoop YARN,国内主流模式,支持Client/Cluster部署。
- Kubernetes:容器化部署,支持动态资源调度。
四、核心编程
RDD(弹性分布式数据集)
- 定义:不可变、可分区、并行计算的分布式数据集合,通过血统(Lineage)实现容错。
- 五大属性:分区列表、分区计算函数、依赖关系、分区器(可选)、首选计算位置(可选)。
- 创建方式:
- 内存集合(
parallelize
/makeRDD
) - 外部文件(
textFile
/wholeTextFiles
)
- 内存集合(
算子
- 转换算子(Transformation):懒执行,返回新RDD(如
map
、filter
、reduceByKey
)。 - 行动算子(Action):触发计算,返回结果(如
collect
、count
、foreach
)。 - 控制算子:
cache
(内存缓存)、persist
(磁盘缓存)、checkpoint
(持久化并切断依赖)。
- 转换算子(Transformation):懒执行,返回新RDD(如
宽依赖与窄依赖
- 窄依赖:父RDD分区与子RDD分区一对一(如
map
),可并行计算。 - 宽依赖:父RDD分区与子RDD分区多对多(如
groupByKey
),会产生Shuffle。
- 窄依赖:父RDD分区与子RDD分区一对一(如
五、Shuffle机制
定义:数据在分区间重新分布的过程,涉及大量磁盘IO和网络传输,是性能瓶颈。
Spark Shuffle类型
- Hash Shuffle:早期实现,小文件过多,已被淘汰。
- Sort Shuffle:主流实现,按Key排序,合并小文件,减少IO。
SortShuffleWriter
:内存排序+溢写合并。BypassMergeSortShuffleWriter
:非聚合场景优化,避免排序。
优化建议
- 启用Map端预聚合(如
reduceByKey
替代groupByKey
)。 - 调整缓冲区大小(
spark.shuffle.file.buffer
)和并行度(spark.default.parallelism
)。 - 压缩Shuffle数据(
spark.shuffle.compress
)。
- 启用Map端预聚合(如
六、内存管理
统一内存管理(默认)
- 内存分为:存储内存(缓存RDD)、执行内存(Shuffle等计算)、其他内存(用户数据结构)。
- 动态借用机制:存储与执行内存可互相借用,执行内存可强制收回。
配置参数
spark.memory.fraction
:统一内存占JVM堆比例(默认0.6)。spark.memory.storageFraction
:存储内存占统一内存比例(默认0.5)。
七、应用场景
- 离线批处理(日志分析、数据清洗)。
- 实时流处理(监控告警、实时推荐)。
- 机器学习(模型训练、预测)。
- 图计算(社交网络分析、路径规划)。
结尾
Spark Core是Spark生态的基础,通过内存计算、DAG优化和丰富的算子,大幅提升分布式计算效率。其核心是RDD抽象和Shuffle机制,结合多模式部署和内存管理优化,成为大数据处理的主流引擎。实际应用中需根据场景选择合适的运行模式和算子,重点优化Shuffle和内存使用以提升性能。
今天这篇文章就到这里了,大厦之成,非一木之材也;大海之阔,非一流之归也。感谢大家观看本文