Spark基础介绍

时间:2025-05-14 21:47:56
1. Spark 核心概念
1.1 RDD(弹性分布式数据集)
  • 定义:RDD(Resilient Distributed Dataset)是 Spark 的核心抽象,是不可变、可分区、容错的分布式数据集合。
  • 特性
    • 弹性:自动进行内存和磁盘之间的数据存储切换。
    • 分布式:数据分区存储在集群的多个节点上。
    • 容错:通过 Lineage(血缘关系)重建丢失的数据分区。
  • 创建方式
    • 从 HDFS、本地文件等外部数据源创建。
    • 从现有 RDD 转换而来。
    • 并行化集合(如 sc.parallelize([1,2,3]))。
1.2 转换(Transformation)与动作(Action)
  • 转换:惰性操作,返回新的 RDD(如 mapfilterreduceByKey)。
  • 动作:触发计算并返回结果(如 collectcountsaveAsTextFile)。
  • 惰性计算:转换操作不会立即执行,只有当动作触发时才会进行计算。
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 任务执行流程
  1. Driver 分解作业为 DAG(有向无环图)。
  2. DAG Scheduler 将 DAG 划分为多个 Stage。
  3. 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、报表生成。
  • 实时分析:日志监控、实时推荐。
  • 机器学习:预测模型训练。
  • 图计算:社交网络分析。