内容
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)执行器处理任务,通过集群管理器把结果发送回驱动程序。