4. Apache Spark简介

中国谚语

知己知彼,百战不殆。 –孙子兵法的成语

4.1. 核心概念

以下大部分内容来自 [Kirillov2016]. 所以版权属于 安东基里洛夫 . 我建议你从 Apache Spark core concepts, architecture and internals .

在深入了解Apache Spark的工作原理之前,让我们先了解Apache Spark的行话。

  • 作业:一段代码,它从HDF或本地读取一些输入,对数据执行一些计算并写入一些输出数据。

  • 阶段:工作分为阶段。阶段被划分为一个映射或减少阶段(如果你在Hadoop上工作过并且想要关联的话,更容易理解)。阶段是根据计算边界划分的,所有计算(运算符)不能在单个阶段中更新。它发生在许多阶段。

  • 任务:每个阶段都有一些任务,每个分区一个任务。一个任务在一个执行器(机器)上的一个数据分区上执行。

  • DAG:DAG代表有向无环图,在当前上下文中它是一个DAG运算符。

  • 执行者:负责执行任务的过程。

  • 主:驱动程序运行的机器

  • 从机:执行程序运行的机器。

4.2. Spark 组件

images/spark-components.png
  1. Spark 驱动器

  • 执行用户应用程序的单独进程

  • 创建SparkContext以计划作业执行并与群集管理器协商

  1. 遗嘱执行人

  • 运行驱动程序计划的任务

  • 将计算结果存储在内存、磁盘上或堆外

  • 与存储系统交互

  1. 集群管理器

  • 介子

  • YARN

  • Spark独立

spark driver包含更多负责将用户代码转换为在集群上执行的实际作业的组件:

images/spark-components1.png
  • SparkContext

    • 表示到 Spark 簇的连接,可用于在该簇上创建RDD、累加器和广播变量。

  • DAGScheduler

    • 为每个作业计算阶段的DAG,并将其提交给TaskScheduler确定任务的首选位置(基于缓存状态或无序处理文件位置),并找到运行作业的最小计划。

  • TaskScheduler

    • 负责将任务发送到集群,运行它们,在出现故障时重试,并减轻分散者

  • SchedulerBackend

    • 用于调度系统的后端接口,允许插入不同的实现(介子、纱线、独立、本地)

  • BlockManager

    • 提供将块本地和远程放入和检索到各种存储(内存、磁盘和堆外)的接口。

4.3. 架构

4.4. Spark 是如何工作的?

Spark有一个小的代码库,系统分为不同的层。每一层都有一些责任。这些层彼此独立。

第一层是解释器,Spark使用scala解释器,并做了一些修改。当您在Spark控制台中输入代码(创建RDD并应用操作符)时,Spark会创建一个操作符图。当用户运行一个操作(如collect)时,图形将提交到DAG调度程序。DAG调度程序将操作员图划分为(映射和减少)阶段。阶段由基于输入数据分区的任务组成。DAG调度程序将操作程序连接在一起以优化图形。例如,许多地图操作员可以安排在一个阶段。这种优化是 Spark 性能的关键。DAG调度程序的最终结果是一组阶段。阶段被传递给任务调度程序。任务调度程序通过集群管理器启动任务。(独立 Spark /纱线/介子)。任务调度程序不知道阶段之间的依赖关系。

images/work_flow.png