Spark如何工作

1. 目的

本章将学习Spark如何工作。在Spark中输入代码时,驱动程序(Driver Program)中的SparkContext会在调用Action时创建作业(Job),提交到Spark中的作业生成RDD DAG,DAG调度程序(DAG Scheduler)转换RDD DAG为Stage DAG,每个Stage中产生相应的Task集合,然后将其提交给任务调度程序(Task Scheduler),任务调度程序通过群集管理器将任务分发到执行器(Executor)执行。

本章将解释Spark的运行时架构以及Spark的关键术语,如SparkContext、Spark Shell、应用程序(Application)、任务(Task)、作业(Job)和阶段(Stage)。我们还将学习Spark运行时组件,如Spark驱动程序(Driver)、集群管理器(Cluster Manager)和执行器(Executor)。最后,我们将看到Spark如何使用这些组件来工作。

2. Spark如何工作

Spark是一款开源的通用分布式计算引擎,用于处理和分析大数据,就像Hadoop MapReduce一样,它可以在分布式文件系统上并行处理数据。Spark使用主/从体系结构,即一个中央协调员(Central Coordinator)和许多分布式工作节点(Distributed Worker),中央协调员被称为Driver。

Driver运行在自己的Java进程中,Driver与很多执行器(Executor)进行通信,每一个Executor都是在Worker上的独立的Java进程。Spark应用程序是Driver和它自己的Executor的组合。在集群管理器的帮助下,Spark应用程序在一组机器上启动。Standalone是Spark的默认内置群集管理器,除了内置的集群管理器外,Spark还可以与Hadoop Yarn,Apache Mesos等开源集群管理器一起工作。

3. 术语

3.1 SparkContext

SparkContext是Spark应用程序的核心,它建立了与Spark 执行环境的连接。它用于创建Spark RDD,累加器(accumulators)和广播变量(broadcast variables),访问Spark服务和运行作业。SparkContext是Spark执行环境的客户端,它的主要工作是:

1)获取Spark应用程序的当前状态

2)取消作业

3)取消阶段(Stage)

4)同步运行作业

5)异步运行作业

6)访问持久化RDD

7)取消持久化RDD

8)可编程动态分配,如:requestExecutors, killExecutors, requestTotalExecutors, getExecutorIds

3.2 Spark Shell

Spark Shell是一个用Scala编写的Spark应用程序,它提供了命令行环境,有助于我们熟悉Spark的特性,这些特性有助于开发我们自己的Standalone Spark应用程序。

3.3 Spark 应用程序(Application)

Spark应用程序运行用户提供的代码来计算结果。

3.4 任务(Task)

任务是发送给执行器(Executor)的工作单元。每个阶段(Stage)都有一些任务,每个分区有一个任务,相同的任务工作在RDD的不同分区上。

3.5 作业(Job)

作业是并行计算的,由多个任务组成。

3.6 阶段(Stage)

作业被分成多个阶段,每个阶段包含一组任务,这些阶段相互依赖。

4. Spark运行时组件

4.1 驱动程序(Driver)

程序的main()方法在驱动程序中运行,驱动程序运行用户代码,创建SparkContext,创建RDD,执行转换和操作。当Spark Shell启动时,表示我们已经创建了一个驱动程序,驱动程序终止时,应用程序结束。

驱动程序将Spark应用程序拆分为任务并安排它们在执行器(Executor)上运行。

驱动程序的两个主要任务是:

1)将应用程序转换为任务。

2)配合执行器调度任务。

4.2 集群管理器(Cluster Manager)

Spark依靠集群管理器来启动执行器,并且在某些情况下,通过它启动驱动程序,它是Spark中的可插入组件。Spark应用程序使用的资源可以根据工作负载进行动态调整,应用程序可以释放未使用的资源并在有需求时再次请求它们。所有集群管理器(Standalone模式,YARN模式和Mesos粗粒度模式)都支持工作负载动态调整。

4.3 执行器(Executor)

Spark作业中的任务在执行器中运行,执行器在Spark应用程序开始时启动一次,然后在应用程序的整个生命周期中运行。

执行器的两个主要任务是:

1)运行任务并将结果返回给驱动程序。

2)为用户缓存的RDD提供内存存储。

5. 如何在Spark中启动应用程序

不管使用哪种集群管理器,Spark提供了可用于提交应用程序的脚本,称为spark-submit。spark-submit可以通过不同的选项连接到不同的集群管理器,并控制应用程序获得的资源数量。对于某些集群管理器,spark-submit可以在集群内运行驱动程序(例如:在YARN Worker节点上),而对于其他集群管理器,它只能在本地机器上运行。

6. 如何在群集上运行Spark应用程序

1)使用spark-submit提交一个应用程序。

2)在spark-submit中,调用main()方法启动驱动程序。

3)驱动程序向集群管理器请求资源。

4)集群管理器启动执行器。

5)驱动程序把任务发送给执行器。

6)执行器处理任务,通过集群管理器把结果发送回驱动程序。

Spark如何工作