前言
Apache Spark 作为大数据领域的标杆框架,凭借内存计算、分布式处理能力,成为批处理、流处理、机器学习等场景的首选工具。对于开发者而言,Spark Core 是底层基石,SparkSession 是统一入口—— 理解二者的定位、关联与实战用法,是入门 Spark 的关键。
本文将从核心概念、组件对比、实战代码、应用场景四个维度,帮你彻底搞懂 Spark Core 与 SparkSession,附带可直接运行的 PySpark 示例,新手也能快速上手。
一、Spark Core:Spark 生态的底层基石
Spark Core 是 Spark 所有功能的基础,定义了分布式计算的核心抽象与运行机制,核心关键词:RDD、SparkContext、分布式调度。
1. 核心定位
Spark Core 负责处理分布式数据的存储、计算、任务调度与容错,提供了最基础的分布式计算能力。无论是 Spark SQL、Spark Streaming 还是 MLlib,底层都依赖 Spark Core 的 RDD 与调度机制。
2. 三大核心概念
(1)RDD:弹性分布式数据集
RDD(Resilient Distributed Dataset)是 Spark Core 最核心的数据抽象,可理解为「分布式的、不可变的、可容错的集合」,具备三大核心特性:
- 分区存储:数据被拆分为多个分区(Partition),分布在集群不同节点,并行处理;
- 惰性计算:仅当执行 Action 操作时,才会触发实际计算(Transformation 操作仅记录依赖关系);
- 容错性:通过 Lineage(血统)记录数据生成链路,某个分区丢失时可通过父 RDD 重算恢复。
(2)SparkContext:核心驱动对象
SparkContext(简称 sc)是 Spark Core 的「入口对象」,负责与集群管理器(YARN/Standalone/K8s)通信、申请资源、创建 RDD、调度任务。任何 Spark Core 程序,必须先创建 SparkContext。
(3)任务调度机制
Spark Core 通过 DAG(有向无环图)将计算任务拆分为 Stage,再细分为 Task 分发到 Executor 执行:
- 窄依赖(如 map、filter):父分区仅对应一个子分区,无需跨节点数据传输;
- 宽依赖(如 groupByKey、reduceByKey):父分区对应多个子分区,触发 Shuffle(数据跨节点重新分布),是性能优化的核心场景。
3. Spark Core 实战代码(PySpark)
python
运行
# 1. 导入依赖
from pyspark import SparkContext, SparkConf
# 2. 配置并创建 SparkContext(核心入口)
conf = SparkConf() \
.setMaster("local[*]") # 本地运行模式,利用所有CPU核心
.setAppName("SparkCoreDemo") # 应用名称
sc = SparkContext(conf=conf)
sc.setLogLevel("ERROR") # 关闭冗余日志
# 3. 创建 RDD(两种常见方式)
# 方式1:从本地集合创建
rdd1 = sc.parallelize([1, 2, 3, 4, 5, 6])
# 方式2:从文件读取(支持本地文件/HDFS)
rdd2 = sc.textFile("data/input.txt")
# 4. RDD 操作(Transformation + Action)
# Transformation:过滤偶数(仅记录操作,不执行)
filter_rdd = rdd1.filter(lambda x: x % 2 == 0)
# Transformation:计算平方
square_rdd = filter_rdd.map(lambda x: x * x)
# Action:触发计算并收集结果(返回Driver)
result = square_rdd.collect()
print("结果:", result) # 输出:[4, 16, 36]
# 5. 关闭 SparkContext
sc.stop()
4. Spark Core 适用场景
- 非结构化 / 半结构化数据处理(如日志清洗、文本分析);
- 复杂分布式计算(如大数据聚合、排序、关联);
- 底层性能调优(如 RDD 持久化、Shuffle 优化)。
二、SparkSession:Spark 2.0+ 统一入口
SparkSession 是 Spark 2.0 推出的「统一入口对象」,整合了 SparkContext、SQLContext、HiveContext 等多个入口,简化开发流程,核心关键词:DataFrame、统一 API、结构化数据。
1. 核心定位
SparkSession 并非替代 Spark Core,而是在其基础上封装了更高层的 API,核心目标:
- 统一结构化数据处理入口(支持 SQL、DataFrame、DataSet);
- 内置 SparkContext(无需手动创建,底层自动管理);
- 支持与 Hive、HDFS、JDBC 等数据源无缝集成。
2. 与 Spark Core 的核心区别
表格
| 对比维度 | Spark Core | SparkSession |
|---|---|---|
| 核心数据抽象 | RDD(分布式集合,无 Schema) | DataFrame/DataSet(分布式表,带 Schema) |
| 入口对象 | SparkContext | SparkSession(内置 SparkContext) |
| 适用场景 | 非结构化 / 半结构化数据处理 | 结构化数据处理(SQL、数据分析) |
| 编程风格 | 函数式编程(map/filter) | SQL + 函数式 + DataFrame API |
| 核心优势 | 灵活、底层可控 | 简洁、高效、支持 SQL 查询 |
注:SparkSession 完全兼容 Spark Core,可通过
spark.sparkContext获取底层 SparkContext,实现 RDD 与 DataFrame 互转。
3. SparkSession 实战代码(PySpark)
python
运行
# 1. 导入依赖
from pyspark.sql import SparkSession
# 2. 建造者模式创建 SparkSession(统一入口)
spark = SparkSession.builder \
.master("local[*]") # 运行模式
.appName("SparkSessionDemo") # 应用名称
.config("spark.sql.adaptive.enabled", "true") # 额外配置(可选)
.getOrCreate() # 若已存在则复用,不存在则创建
# 3. 两种核心用法
# 用法1:操作 DataFrame(结构化数据)
# 从JSON文件读取数据(自动推断Schema)
df = spark.read.json("data/users.json")
# 显示数据(前5行)
df.show()
# 执行SQL查询(需先创建临时视图)
df.createOrReplaceTempView("users")
sql_result = spark.sql("SELECT name, age FROM users WHERE age > 18")
sql_result.show()
# 用法2:兼容 Spark Core(获取 SparkContext 操作 RDD)
sc = spark.sparkContext
rdd = sc.parallelize([("Alice", 20), ("Bob", 25)])
# RDD 转 DataFrame(指定Schema)
df_from_rdd = spark.createDataFrame(rdd, schema=["name", "age"])
df_from_rdd.printSchema() # 打印Schema信息
# 4. 关闭 SparkSession(自动关闭底层 SparkContext)
spark.stop()
4. SparkSession 核心优势
- 简化配置:无需手动创建 SparkContext、SQLContext,建造者模式一键配置;
- Schema 支持:DataFrame 带 Schema 信息,支持类型校验、SQL 查询,开发效率更高;
- 生态整合:无缝对接 Spark SQL、MLlib、Hive,一站式解决结构化数据处理需求。
三、实战进阶:Spark Core 与 SparkSession 协同使用
实际开发中,二者常结合使用:用 Spark Core 处理非结构化数据(如日志清洗),转为结构化数据后,用 SparkSession 进行高效分析。
协同实战示例:日志分析
python
运行
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StringType, IntegerType
# 1. 创建 SparkSession(统一入口)
spark = SparkSession.builder \
.master("local[*]") \
.appName("LogAnalysis") \
.getOrCreate()
sc = spark.sparkContext
sc.setLogLevel("ERROR")
# 2. Spark Core:清洗非结构化日志(RDD操作)
log_rdd = sc.textFile("data/access.log")
# 日志格式:ip - - [time] "request" status size
clean_rdd = log_rdd \
.filter(lambda line: len(line.split()) > 10) # 过滤无效日志
.map(lambda line: {
"ip": line.split()[0],
"status": line.split()[8],
"size": int(line.split()[9]) if line.split()[9].isdigit() else 0
})
# 3. 转为 DataFrame,用 SparkSession 分析
# 定义Schema(推荐显式指定,避免自动推断错误)
schema = StructType() \
.add("ip", StringType(), nullable=True) \
.add("status", StringType(), nullable=True) \
.add("size", IntegerType(), nullable=True)
df = spark.createDataFrame(clean_rdd, schema=schema)
# 4. 数据分析(SQL + DataFrame API)
# 统计各状态码数量
status_count = df.groupBy("status").count().orderBy("count", ascending=False)
status_count.show()
# 统计TOP10访问IP
top_ip = df.groupBy("ip").count().orderBy("count", ascending=False).limit(10)
top_ip.show()
spark.stop()
四、核心总结与学习建议
1. 核心结论
- Spark Core 是基础:掌握 RDD、SparkContext、Shuffle 机制,是理解 Spark 底层原理的关键;
- SparkSession 是工具:2.0+ 开发首选,简化代码、统一 API,适配结构化数据处理;
- 二者协同为王:非结构化数据用 Spark Core 清洗,结构化数据用 SparkSession 分析,效率最大化。
2. 学习建议
- 新手先学 SparkSession:DataFrame API 简洁直观,快速实现业务需求,建立信心;
- 进阶深入 Spark Core:理解 RDD 依赖、DAG 调度、Shuffle 优化,提升性能调优能力;
- 多练实战场景:日志分析、数据 ETL、SQL 查询,结合实际需求巩固知识点。

973

被折叠的 条评论
为什么被折叠?



