作者:余辉
简介:余辉,硕士毕业于中科院,从事IT行业12年。专注于大数据和机器学习。在数据团队担任过的角色:研发、架构师、负责人、讲师。数据知识产权:出版大数据书籍【1】本,论文【2】篇,软著【6】篇,专利【65】篇。
第1章 Spark 简介
1.3 Spark运行模式
Spark具有多种运行模式,以满足不同场景下的需求。具体来说,Spark的运行模式可以分为以下几种:
1)本地模式(Local Mode)
用于在单机上运行Spark应用程序,通常用于教学、调试和演示。
本地模式可以进一步细分为Local、Local[K]和Local[]三种,其中Local表示只启动一个executor,Local[K]表示启动K个executor,Local[]表示启动与CPU数目相同的executor。
2)独立模式(Standalone Mode)
StandAlone模式是spark自带的集群运行模式,不依赖其他的资源调度框架,部署起来简单。
StandAlone模式分为client模式和cluster模式,本质区别是Driver运行在哪里,如果Driver运行在SparkSubmit进程中就是Client模式,如果Driver运行在集群中就是Cluster模式。
3)Yarn模式(Spark on Yarn)
使用Yarn作为资源管理器,在Yarn集群上运行Spark应用程序。
Yarn模式分为Yarn-client和Yarn-cluster两种模式,其中Yarn-client模式适用于交互和调试,客户端能看到应用程序的输出;Yarn-cluster模式通常用于生产环境,Driver运行在Application Master中,用户提交作业后可以关闭客户端,作业会继续在Yarn上运行。
此外,Spark还支持在Mesos和Kubernetes等资源管理系统上运行,即Spark on Mesos和Spark on K8s模式。总的来说,Spark的多种运行模式使其能够灵活适应不同的应用场景和需求。
1. Local模式
如图1-7所示为Spark Local模式,就是指的只在一台计算机上来运行Spark。通常用于测试的目的来使用Local模式,实际的生产环境中不会使用Local模式。Local模式执行步骤如下:
1)客户端向Driver提交任务。
2)Driver开始运行,初始化SparkContext,任务划分、任务调度。
3)Driver向资源管理者,注册应用程序。
4)资源管理者启动Executor。
5)Executor执行任务且反向与Driver进行注册连接。
Local模式启动命令如下:
$SPARK_HOME/bin/spark-submit \
--master local[n] \
--class <主类> \
--conf <配置属性>=<值> \
<应用的jar路径> \
[应用参数]
2. standalone client模式
如图1-8展示Spark的standAlone Clinet模式,执行步骤如下:
1)客户端Node-5向Master节点Node-1提交任务。
2)Master根据客户端提交的任务,计算那些Worker符合执行任务的条件,找到符合执行条件的Worker然后和Worker进行RPC通信,通知Worker启动Executor,并且会将一些Driver端的信息告诉给Executor,Executor启动之后会向Driver端反向注册,建立链接。
3)Driver端和Executor端建立链接之后,Driver端会创建RDD调用Transformation和Action,然后构建DAG切分Stage,生产Task,然后将Task放到TaskSet中,通过TaskSchedule,将TaskSet序列化,发送到指定的Executor中。
Spark的standAlone Clinet模式启动命令如下:
$SPARK_HOME/bin/spark-submit \
--master spark://IP:7077
--deploy-mode client
--class <主类> \
--conf <配置属性>=<值> \
<应用的jar路径> \
[应用参数]
3. standalone cluster模式
图1-9展示Spark的standAlone Cluster模型执行步骤:
1)spark集群中任意找一台安装了spark并且有spark脚本的机器就可以向集群中提交任务,首先和master进行通信。
2)master会在worker中找一台符合条件的worker,然后在worker中启动一个DriverWapper进程,其中driver端就是在DriverWapper进程中。
3)mater会在driver启动完成之后,继续和其他worker进行通信,然后让worker启动executor,executor启动完成之后就会反向向driver进行注册。
4)executor启动完成之后就会反向向driver进行注册完成之后DriverWapper端就会有SparkContext,创建RDD,调用transformation和action算子生成DAG,之后切分stage,再成task,最后放在taskSet中序列化通过网络传输到对应的Executor中。
$SPARK_HOME/bin/spark-submit \
--master spark://IP:7077
--deploy-mode cluster
--class <主类> \
--conf <配置属性>=<值> \
<应用的jar路径> \
[应用参数]
4. Spark On YARN cluster模式
图1-10展示Spark On Yarn Cluster模型执行步骤:
1)client向ResourceManager申请资源,返回一个applicationID。
2)client上传spark jars下面的jar包、自己写的jar和配置。
3)ResourceManager随机找一个资源充足的NodeManager。
4)然后通过RPC让NodeManager从HDFS上下载jar包和配置,启动ApplicationMaster;
5)ApplicationMaster向ResourceManager申请资源。
6)ResourceManager中的ResourceScheduler找到符合条件的NodeManager,将NodeManager的信息返回给ApplicationMaster。
7)AppllcationMaster跟返回的NodeManager进行通信。
8)NodeManager从HDFS下载依赖。
9)NodeManager启动Executor。
10)Executor启动之后反向向ApplicationMaster【Driver】注册。
Spark的Yarn模式启动命令如下:
$SPARK_HOME/bin/spark-submit \
--master cluster
--deploy-mode yarn
--class <主类> \
--conf <配置属性>=<值> \
<应用的jar路径> \
[应用参数]
1.4 Spark执行流程
从Spark的架构角度来看,RDD是Spark的运行逻辑的载体。一个Spark应用的执行过程可以分为五个步骤,如图1-11所示。
1)RDD Object构建DAG有向无环图DAG(Directed Acyclic Graph)。
2)DAGScheduler将DAG切分Stage,将Stage中生成的Task以TaskSet的形式给TaskScheduler。
3)TaskScheduler向集群管理发射Task,根据资源情况将Task分发给Worker中的Executor。
4)如果集群管理中,发射task失败,则向DAGScheduler返回失败信息。
5)如果集群管理中,发射task成功,Worker启动Executor,Executor启动线程池用于执行Task。
1.5 Spark专有名词
- Cluster Manager(集群管理器)
在集群上获取资源的拓展服务,Spark主要支持三种类型:standalone(Spark自带的集群管理模式)、mesos(Apache Mesos是一个集群管理器,用于在分布式环境中运行应用程序)、yarn(Hadoop YARN是Hadoop 2.x中的资源管理系统)。 - Master(主节点)
在Spark的standalone集群管理模式中,Master是一个关键的组件,它负责接收来自客户端的Spark作业请求,管理集群中的Worker节点,以及进行资源分配和作业调度。 - Worker(工作节点)
集群中任何可以运行Spark应用的节点。在standalone模式中,worker节点通过Spark的conf目录下的slave文件配置;在Spark on yarn模式中,worker节点对应的是nodemanager节点。 - SparkSubmit(spark任务提交)
SparkSubmit是Spark提供的一个命令行工具,用于提交Spark应用程序到集群上运行。通过SparkSubmit,用户可以指定应用程序的主类、依赖的jar包、运行模式(如standalone、yarn等)、以及各种配置参数。 - Application(应用程序)
用户编写的Spark代码,包含了运行在Driver端的代码和运行在各个节点上的Executor代码。 - Job(作业)
由Spark的action操作触发,包含多个RDD及作用于RDD上的各种操作。一个Job由多个Stage组成,每个Stage包含多个Task。 - Driver(驱动程序)
运行用户程序的main()函数,并创建SparkContext,它是Spark程序的入口点。Driver负责初始化Spark应用程序的运行环境,与Cluster Manager进行通信,进行资源的申请、任务的分配和监控等。 - SparkContext(Spark上下文)
Spark应用程序的上下文,控制应用的生命周期。它负责与Cluster Manager进行通信,进行资源的申请、任务的分配和监控等。 - Executor(执行器)
在工作节点上为Spark应用所启动的一个进程,负责运行任务,并可以在内存或磁盘中保存数据。每个应用都有属于自己的独立的一批Executor。 - Task(任务)
被送到某个Executor上的工作单元,是运行Spark应用的基本单元。 - TaskSet(任务集合)
TaskSet是Spark中的一个概念,它代表了一个Stage中所有任务的集合。每个TaskSet中的任务是并行执行的,每个任务对应着RDD中的一个分区的数据处理。 - TaskScheduler(任务调度器)
接收DAGScheduler提交过来的TaskSets,然后把一个个Task提交到Worker节点运行,每个Executor运行什么Task也是在此处分配的。 - DAG(Directed Acyclic Graph,有向无环图)
在Spark中,DAG是用来表示Spark作业执行计划的一个重要数据结构。DAG中的节点代表RDD(Resilient Distributed Dataset,弹性分布式数据集)的转换操作(如map、filter、reduce等),而边则代表数据之间的依赖关系。 - DAGScheduler(有向无环图调度器)
负责接收Spark应用提交的Job,根据RDD的依赖关系划分Stage,并提交Stage给TaskScheduler。 - Stage(阶段)
DAGScheduler根据RDD之间的依赖关系(宽依赖或窄依赖)对Job进行阶段划分的结果。一个Stage包含多个Task,这些Task会在Executor上并行执行。 - RDD(弹性分布式数据集)
Spark的编程模型,是已被分区、被序列化的、不可变的、有容错机制的,并且能够并行操作的数据集合。RDD是Spark中数据的基本抽象,所有对数据的操作都是基于RDD进行的。 - Narrow Dependency(窄依赖)
父RDD的一个分区会被子RDD的一个分区依赖。窄依赖允许RDD的分区在多个不同的任务之间并行计算。 - Wide Dependency(宽依赖)
父RDD的一个分区会被子RDD的多个分区所依赖。宽依赖通常会导致shuffle操作,需要将数据重新分布到集群中的不同节点上。
1.6 本章小结
本章作为Spark的入门篇章,全面而简洁地介绍了Spark的基本概念及特点、技术生态系统、运行模式、执行流程以及专有名词。通过“Spark是什么”这一小节,读者能够迅速了解Spark的起源、定义及其在大数据处理领域的地位。紧接着,Spark的特点被详细阐述,包括其高速、易用、通用和容错性强等显著优势。技术生态系统的介绍则让读者对Spark的组件和工具链有了初步认识。此外,本章还深入探讨了Spark的运行模式和执行流程,帮助读者理解Spark任务是如何在集群中分布式执行的。最后,通过介绍Spark的专有名词,本章为读者后续深入学习Spark奠定了坚实的术语基础。总体而言,本章是理解Spark全貌的绝佳起点。