Spark最初的设计目标是基于内存计算的大数据批处理系统,用于构建大型的、低延迟的数据分析应用程序。
Spark从最初仅使用内存的批处理系统,转为内外存同时使用的批处理系统,增加 Spark Streaming 支持实时流计算,Structured Streaming 支持批流融合,也提供机器学习工具包 MLlib 和图处理工具包 GraphX。因而 Spark 已形成较完整的软件栈。
本章讲述的 Spark 实际上是指 Spark Core 内容。
1 设计思想
1.1 MapReduce的局限性
- MapReduce仅提供map和reduce两个编程算子,编程框架的表达能力有限,用户编程复杂。
- 单个作业中,需要Shuffle的数据以阻塞方式传输,磁盘I/O开销大,延迟高。
- 需要Shuffle的数据先由Map任务将计算结果写入本地磁盘,之后Reduce任务才能读取该计算结果。
- 多个作业之间衔接涉及I/O开销,应用程序的延迟高。
- 特别是延迟计算,迭代中间结果的反复读写,使得整个应用程序的延迟非常高
- 资源管理和作业管理紧耦合。
1.2 数据模型
Spark 将数据抽象为弹性分布式数据集 RDD
,具有3个特性:
- Resilient:具有可恢复的容错特性
- Distributed:每个RDD分为多个分区,不同分区存在集群不同节点,每个分区是一个数据集片段
- Dataset:Spark 操作对象是抽象的数据集,而不是文件
1.3 计算模型
Spark提供丰富的操作算子对RDD进行变换。操作算子
分为:
- 创建:从本地内存或外部数据源创建RDD,提供数据输入的功能。
- 转换 Transformation:描述RDD的转换逻辑,提供对RDD进行变换的功能。
-
行动 Action:标志转换结束,触发
DAG
生成。- 行动操作包含数据输出类、count、collect等操作算子
RDD是只读的,不可变。RDD转换/行动操作会不断生成新的RDD,而不改变原有的RDD。
—— 遵循函数式编程的特性(变量值是不可变的)
为什么这样设计?
对RDD进行并行转换操作时,RDD的不变性能简化设计,也能保证容错恢复
Spark的逻辑计算模型
:Operator DAG、RDD Lineage
- Operator DAG 描述的主体是算子,RDD Lineage 描述的主体是数据
- RDD Lineage中,通过读入外部数据源进行RDD创建,经过一系列转换操作,每次都产生不同的RDD供下一个转换操作使用,最后一个RDD经过“行动”操作进行转换并输出到外部数据源。
Spark的物理计算模型
2 体系架构
2.1 架构图
抽象的Spark架构图,包含:集群管理器、执行器、驱动器。
- Cluster Manager:集群管理器,负责管理整个系统的资源,监控工作节点。
- 根据Spark部署方式的不同,Spark可分为:
- Standalone模式:不使用Yarn等其他资源管理系统,该模式的集群管理器包含Master、Worker
- Yarn模式:将Spark与Yarn一起部署,该模式的集群管理器包含ResourceManager、NodeManager
- 根据Spark部署方式的不同,Spark可分为:
- Executor:执行器,负责任务执行。
- 本身是运行在工作节点上的一个进程,启动若干线程Task或线程组TaskSet执行任务
- 在Standalone部署方式下,Executor进程名称为Coarse Grained Executor Backend
- Driver:驱动器,负责启动应用程序的主方法并管理作业运行。
⚠️MapReduce中Task是进程,Spark中Task是线程。
Spark架构实现资源管理、作业管理的分离:Cluster Manager负责集群资源管理、Driver负责作业管理。
Standalone模式下Spark的架构图(没画Driver)
Standalone中的Driver:
- 逻辑上,Driver独立于主节点、从节点以及客户端
- 但根据应用程序的不同运行方式,Driver可以不同形式存在
- Client方式:Driver和客户端同一个进程
- Cluster方式:系统将由某一Worker启动一个进程作为Driver(DriverWrapper)
客户端提交应用程序时可以选择Client或Cluster。
Spark系统