Spark Overview

一直以来都想了解一下 Spark 的运行原理, 但一直都浮于表面, 难以深入. 去年买了一本 《大数据处理框架 Apache Spark 设计与实现》, 但是一直没时间好好看看, 最近抽时间过了一下这本书, 在此记录一下.

先大致了解一下 Spark.

1. Introducion

老早就久仰 Spark 的大名, 自己也在服务器上用 docker 搭过 Spark 集群, 做了一点简单的尝试, 但总是差点感觉, 处于盲人摸象的阶段, 对 Spark 的认识还是一团浆糊. 有幸接触到了 《大数据处理框架 Apache Spark 设计与实现》(许利杰, 方亚芬著, 电子工业出版社), 解答了我不少困惑.

众所周知, Spark 是一个分布式计算框架, 于 2012 年由 UC Berkeley 的 AMPLab 研发并开源. 其核心思想包括两方面:

  • 对大数据处理框架的输入/输出, 中间数据进行建模, 将这些数据抽象为统一的数据结构 (RDD, 最新版的 Spark 增加了 Dataset, DataFram 等高层 API), 并在此数据结构的基础上构建了一系列通用的数据操作;
  • 采用基于内存的数据聚合, 数据缓存机制加速应用的执行.

多年的发展, Spark 也发展出了自己的生态, 以 Spark 处理框架为核心, 在上层构建了面向 SQL 的 Spark SQL 框架, 面向大规模图计算的 GraphX 框架, 面向大规模机器学习的 MLlib 框架及算法库, 以及面向流处理的 Spark Streaming 框架; 在下层, 也推出了相关的存储系统, 如基于分布式文件系统的 Alluxio, 支持 ACID 事务的数据湖系统 Delta Lake 等.

2. Spark Application

Spark 处理的核心: 如何将应用程序转化为可以分布式执行的计算任务?

从一个 Spark Application 开始.

  • 一个 Spark 应用包含了用户代码, 配置, 以及要处理的数据 (可以是存储在分布式文件系统, 数据库中的数据, 也可以是流式数据等);
  • 那要怎么执行一个 Spark 应用呢? Spark 作为一个分布式计算框架, 是可以部署在多个结点上的, Spark 采用的是主从式的结构, 系统架构中包含了一个 Master 结点和多个 Worker 结点: Master 负责管理应用和任务, Worker 负责执行任务. 当我们要在 Spark 集群上执行一个应用时, 需要将应用 (及代码, 配置, 数据) 提交到集群上 --- 具体是通过什么提交和提交到哪呢? 通过什么提交, 这个问题等价于 --- 当 Spark 集群部署好之后, 怎么与集群交互. 部署完后, Spark 集群就相当于服务的提供方 --- Sever, 而我们则可以通过 Client 与 Server 进行交互. Client 具体是什么样子的, 取决于 Spark 集群的部署模式, 主要有: Standalone, Mesos, YARN, Kubernetes. 先不管不同部署模式的区别, 它们都会为我们提供一个与集群交互的入口, 通过这个入口我们可以向集群提交应用 (当然也可以干别的, 比如启动和关闭集群);
  • 提交应用后, 集群中的 Master 结点会接收应用. 和普通的程序有一个入口 (main() 函数) 一样, Spark 应用在执行时也有一个入口. Master 收到一个用后会启动一个 Driver (官方的解释: "The process running the main() function of the application and creating the SparkContext") 进程, 用于运行应用的 main() 函数. Driver 的作用包括: 与集群管理者进行交互, 对应用进行划分, 管理 Worker 上相关任务的执行. Master 也会为应用在 Worker 上分配计算资源 --- Executor 进程. Executor 进程中会有多个线程用于执行其负责的计算任务 (即 Task).
  • 资源差不多分配妥当后, Driver 会对应用进行分解, 怎么分解呢? 一个 Spark 应用程序包含了对数据的处理流程, 一个应用对应着多个 job, 每个 job 由多个 stage 组成, 每个 stage 可以拆分成多个 task. Driver 会将 task 分发给 Worker, 由 Executor 中的线程完成 task.
  • 计算完成后可以将结果汇集到 Driver 端, 或者保存至磁盘中.

3. Concepts

  • Master 进程. 运行在 Master 结点上, 该进程负责管理全部的 Worker 结点, 监控 Worker 结点的存活状态;
  • Worker 进程. 运行在 Worker 结点上, 该进程除了与 Master 结点通信, 还负责管理任务的执行, 监控任务执行的状态;
posted @ 2022-10-31 15:27  Milkha  阅读(27)  评论(0编辑  收藏  举报