说明
- Spark生态系统已经发展成为一个包含多个子项目的集合,其中包含SparkSQL、Spark Streaming、GraphX、MLib、SparkR等子项目,Spark是基于内存计算的大数据并行计算框架。除了扩展了广泛使用的 MapReduce 计算模型,而且高效地支持更多计算模式,包括交互式查询和流处理。Spark 适用于各种各样原先需要多种不同的分布式平台的场景,包括批处理、迭代算法、交互式查询、流处理。通过在一个统一的框架下支持这些不同的计算,Spark 使我们可以简单而低耗地把各种处理流程整合在一起。
spark生态
- spark现有五个子生态项目,具体功能如下:
Spark Core
- spark内核,实现了 Spark 的基本功能,包含任务调度、内存管理、错误恢复、与存储系统 交互等模块。Spark Core 中还包含了对弹性分布式数据集(resilient distributed dataset,简称RDD)的 API 定义。
Spark SQL
- 结构化数据处理组件,支持SQL 或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据。Spark SQL 支持多种数据源,比 如 Hive 表、Parquet 以及 JSON 等。
Spark Streaming
- 流处理组件,提供操作数据流的 API,并且与 Spark Core 中的 RDD API 高度对应。
Spark MLLib
- 机器学习组件,提供包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据 导入等额外的支持功能。
Spark Graphx
- 图计算
spark 架构
整体架构
-
spark 运行架构图如下,遵从分布式主从架构,集群资源控制管理器(Cluster Manager)、多运行作业任务工作节点(Worker Node)、单应用任务控制节点(Driver)和各工作节点负责具体任务的执行进程(Executor)
-
详细架构流程如下图:
运行流程
- spark运行流程大概有4步。如下图
- 构建 Spark Application 的运行环境,启动 SparkContext,SparkContext 向 Cluster Manager 注册,并申请运行 Executor 资源。
- Cluster Manager 为 Executor 分配资源并启动 Executor 进程,Executor 运行情况将随着“心跳”发送到 Cluster Manager 。
- SparkContext 构建 DAG 图,将 DAG 图分解成多个 Stage,并把每个 Stage 的 TaskSet(任务集)发送给 Task Scheduler (任务调度器)。Executor 向 SparkContext 申请 Task, Task Scheduler 将 Task 发放给 Executor,同时,SparkContext 将应用程序代码发放给 Executor
- Task 在 Executor 上运行,把执行结果反馈给 Task Scheduler,然后再反馈给 DAG Scheduler。运行完毕后写入数据,SparkContext 向 ClusterManager 注销并释放所有资源。
细节说明
-
DAG
- DAG Scheduler 把一个 Spark 作业转换成 Stage 的 DAG,根据 RDD 和 Stage 之间的关系找出开销最小的调度方法,然后把 Stage 以 TaskSet 的形式提交给 Task Scheduler。此外,DAG Scheduler 还处理由于 Shuffle 数据丢失导致的失败,这有可能需要重新提交运行之前的 Stage。
- DAG Scheduler 决定运行 Task 的理想位置,并把这些信息传递给下层的 Task Scheduler。
-
Stages
- 每个 Spark Job 包含一系列 stages
- Stages 按照数据是否需要 shuffle 来划分(宽依赖)
- Stages 之间的执行是串行的(除非stage 间计算的RDD不同)
- 因为 Stages 是串行的,所以 shuffle 越少越好
-
Task Scheduler
- 维护所有 TaskSet,当 Executor 向 Driver 发送“心跳”时,Task Scheduler 会根据其资源剩余情况分配相应的 Task。另外,Task Scheduler 还维护着所有 Task 的运行状态,重试失败的 Task。
-
Task
- 每个 stage 包含一系列的 task
- Task 是并行计算的最小单元
- 一个 stage 中的所有 task 执行同一段代码逻辑,只是基于不同的数据块
- 一个 task 只能在一个executor中执行,不能是多个
- 一个 stage 输出的 partition 数量等于这个 stage 执行 task 的数量
-
partition
- Spark 中 partition(分区) 可以理解为内存中的一个数据集
- 一个 partition 对应一个 task,一个 task 对应 一个 executor 中的一个 slot,一个 slot 对应物理资源是一个线程 thread
- 1 partition = 1 task = 1 slot = 1 thread
总结
- spark是大数据计算引擎中重要组成部分,悠久的发展历史,奠定很多计算框架的底层逻辑,值得深入学习和研究。