Loading......

文章背景图

⚡ Spark Core & SQL 核心知识

2025-11-10
16
-
- 分钟

1. Spark 的部署方式 🚀

Spark 支持多种部署方式,以满足不同的开发、测试和生产环境需求。

部署方式

特点

典型场景

Local 模式

单机运行(单 JVM 进程),不依赖集群,启动最简单。

本地学习、调试、功能验证。

Standalone 模式

Spark 自带的原生集群管理器,Master+Worker 架构。Master 负责调度,Worker 执行任务。

中小型集群部署,无需依赖 Hadoop。

YARN 模式

运行在 Hadoop 生态中,统一由 YARN 管理资源。包括:
➡️ yarn-client:Driver 运行在客户端;
➡️ yarn-cluster:Driver 运行在集群。

企业级生产环境(主流方式)。

Mesos 模式

通用资源管理框架,可调度多种计算框架(如 Spark、Flink)。

大规模多框架混合部署环境。


2. Spark 作业提交方式

在生产环境中,Spark 作业主要通过 Shell 脚本命令行 提交,而不是 JavaEE 界面。

✅ 常用提交脚本样式:

spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --class com.company.app.MainClass \
  --driver-memory 8g \
  --executor-memory 8g \
  --executor-cores 4 \
  --num-executors 10 \
  --name "UserLogETLJob" \
  app.jar input_path output_path

常见参数说明:

参数

含义

建议配置

--executor-cores

每个 Executor 的 CPU 核数

2–5(推荐 4)

--num-executors

Executor 数量

根据数据量调整

--executor-memory

每个 Executor 的内存

一般为 4–8G

--driver-memory

Driver 的内存

一般为 4–8G

--deploy-mode

提交模式

client 或 cluster


3. Spark 架构与作业提交流程(重点)

Spark 运行时由以下组件组成:

  • Driver:运行用户的 main() 方法,负责任务划分和调度。

  • Executor:执行具体任务并将结果返回给 Driver。

  • Cluster Manager:资源调度器,如 YARN 或 Standalone。

  • Worker Node:实际运行 Executor 的节点。

🌐 Yarn-Client 模式流程(Driver 在客户端)

  1. 启动脚本 → 执行 SparkSubmit

  2. 初始化 Driver 并创建 SparkContext。

  3. Driver 划分 Job → Stage → Task。

  4. 向 YARN ResourceManager 申请资源。

  5. ResourceManager 分配 NodeManager。

  6. NodeManager 启动 ExecutorBackend。

  7. Executor 注册到 Driver 并执行任务。

⚙️ Yarn-Cluster 模式流程(Driver 在集群)

  1. 客户端提交任务给 YARN。

  2. YARN 启动 ApplicationMaster。

  3. AM 内启动 Driver 线程执行用户逻辑。

  4. Driver 申请 Executor 资源。

  5. NodeManager 启动 ExecutorBackend。

  6. Executor 执行任务并返回结果。


4. Spark 的 RDD 血统(Lineage)机制

RDD(Resilient Distributed Dataset) 是 Spark 的核心抽象。
RDD 具有 血统(Lineage),即记录了其由哪些 RDD 经过哪些转换(transformation)得到。

✳️ 优势:

  • 无需数据副本即可实现容错:当部分数据丢失时,可根据 lineage 重新计算。

  • 可用于任务调度优化和失败恢复。

🔗 依赖类型:

依赖类型

特征

示例

窄依赖(Narrow Dependency)

父 RDD 的一个分区最多被一个子 RDD 分区使用。

map、filter、union

宽依赖(Wide Dependency)

父 RDD 的一个分区被多个子分区使用(会触发 shuffle)。

groupByKey、reduceByKey、join


5. Stage 与 Task 划分规则

  • Stage 划分:遇到一个 宽依赖 就会产生新的 Stage。

  • Task 划分:一个 Stage 内部根据 分区数(Partition 数) 生成对应数量的 Task。

示例:
map → reduceByKey

  • map 是窄依赖(同 Stage)

  • reduceByKey 是宽依赖(需 Shuffle,触发新 Stage)


6. 常见 Transformation 算子汇总 💡

算子

功能简介

备注

map(func)

对每个元素应用函数 func

一对一转换

filter(func)

按条件过滤元素

常用

flatMap(func)

映射并扁平化

常用于分词

mapPartitions(func)

对每个分区执行函数

比 map 更高效

reduceByKey(func)

聚合同 key 的 value

触发 Shuffle

groupByKey()

按 key 分组

容易产生数据倾斜

aggregateByKey()

带初始值的按 key 聚合

可定制计算逻辑

combineByKey()

可灵活定义聚合逻辑

复杂聚合场景使用

join()

两个 RDD 按 key 连接

容易 Shuffle

distinct()

去重

内部实现 reduceByKey

sortByKey()

按 key 排序

需全局 shuffle

union()

合并两个 RDD

简单集合操作


7. Spark 性能调优思路总结 🧩

  • 使用合适的算子reduceByKey 替代 groupByKey

  • 尽量使用广播变量(Broadcast) 减少数据传输。

  • 使用缓存与持久化(cache/persist) 提高重复计算性能。

  • 合理设置并行度spark.default.parallelism 一般为集群核数的 2–3 倍。

  • 避免数据倾斜:通过随机前缀或 map-side combine。

  • 压缩与序列化优化:采用 Kryo 序列化、Snappy 压缩。

  • 资源参数调优:合理设置 executor 核数与内存,避免 OOM。

评论交流