1. Spark 核心概念
1.1 RDD(弹性分布式数据集)
- 定义:RDD(Resilient Distributed Dataset)是 Spark 的核心抽象,是不可变、可分区、容错的分布式数据集合。
-
特性:
- 弹性:自动进行内存和磁盘之间的数据存储切换。
- 分布式:数据分区存储在集群的多个节点上。
- 容错:通过 Lineage(血缘关系)重建丢失的数据分区。
-
创建方式:
- 从 HDFS、本地文件等外部数据源创建。
- 从现有 RDD 转换而来。
- 并行化集合(如
sc.parallelize([1,2,3])
)。
1.2 转换(Transformation)与动作(Action)
-
转换:惰性操作,返回新的 RDD(如
map
,filter
,reduceByKey
)。 -
动作:触发计算并返回结果(如
collect
,count
,saveAsTextFile
)。 - 惰性计算:转换操作不会立即执行,只有当动作触发时才会进行计算。
1.3 共享变量
- 广播变量(Broadcast Variables):在每个节点缓存一份只读变量,减少数据传输。
- 累加器(Accumulators):只能通过关联操作累加,用于计数或求和等场景。
2. Spark 编程模型
2.1 SparkContext
- Spark 应用的入口点,负责与集群管理器通信,创建 RDD、累加器和广播变量。
- 在 Spark 2.x 后,推荐使用
SparkSession
统一处理 SQL 和 DataFrame 操作。
2.2 基本操作示例
python
运行
# Python API (PySpark) 示例
from pyspark.sql import SparkSession
# 创建 SparkSession
spark = SparkSession.builder \
.appName("WordCount") \
.getOrCreate()
# 创建 RDD
lines = spark.sparkContext.textFile("hdfs://path/to/input.txt")
# 转换操作
words = lines.flatMap(lambda x: x.split(" "))
pairs = words.map(lambda x: (x, 1))
counts = pairs.reduceByKey(lambda a, b: a + b)
# 动作操作
counts.saveAsTextFile("hdfs://path/to/output")
# 关闭 SparkSession
spark.stop()
3. Spark SQL & DataFrame
3.1 DataFrame
- 带 Schema 的分布式数据集,类似于关系型数据库的表。
- 支持 SQL 查询和多种数据源(JSON、Parquet、Hive 等)。
- 性能优化:Catalyst 优化器自动生成高效执行计划。
3.2 Spark SQL
- 通过 SQL 或 DSL 操作结构化数据。
- 示例:
python
运行
# 创建 DataFrame
df = spark.read.json("hdfs://path/to/data.json")
# SQL 查询
df.createOrReplaceTempView("people")
results = spark.sql("SELECT name, age FROM people WHERE age > 20")
# DataFrame API
results.select("name", "age").filter(df["age"] > 20).show()
4. Spark 集群架构
4.1 组件
- Driver:运行用户程序的主进程,负责调度任务。
- Executor:工作节点上的进程,执行具体任务并缓存数据。
- Cluster Manager:资源调度(如 YARN、Kubernetes、Standalone)。
4.2 任务执行流程
- Driver 分解作业为 DAG(有向无环图)。
- DAG Scheduler 将 DAG 划分为多个 Stage。
- Task Scheduler 将任务分配给 Executor 执行。
5. Spark 部署模式
5.1 本地模式
- 单节点运行,主要用于开发和测试。
bash
spark-submit --master local[4] my_script.py
5.2 集群模式
- Standalone:Spark 自带的集群管理器。
- YARN:Hadoop YARN 管理资源(常见于生产环境)。
- Kubernetes:容器化部署(新兴趋势)。
6. 性能优化
6.1 内存管理
- 合理配置
spark.memory.fraction
(执行内存与存储内存比例)。 - 使用序列化(如 Kryo)减少内存占用。
6.2 数据倾斜处理
- 加盐(Salting):对 Key 增加随机前缀。
- 广播大表 Join 中的小表。
6.3 其他优化
- 重用 RDD:使用
cache()
或persist()
。 - 合并小文件:使用
coalesce()
减少分区数。
7. 生态系统
7.1 核心模块
- Spark Core:基础引擎。
- Spark SQL:结构化数据处理。
- Spark Streaming:流处理。
- MLlib:机器学习。
- GraphX:图计算。
7.2 集成工具
- Zeppelin/Notebook:交互式开发。
- MLflow:机器学习生命周期管理。
- Delta Lake:数据湖事务处理。
8. 应用场景
- 批处理:ETL、报表生成。
- 实时分析:日志监控、实时推荐。
- 机器学习:预测模型训练。
- 图计算:社交网络分析。