《Spark数据分析:基于Python语言 》 —3 理解Spark集群架构
第3章
理解Spark集群架构
值得关注的不是建筑的美丽,而是让它能历经时间考验的基础结构。
—美国创作歌手戴维·阿伦·科(David Allan Coe)
本章提要
Spark应用与集群组件的详细介绍
Spark资源调度器和集群管理器
YARN集群上的Spark应用是如何调度的
Spark部署模式
在准备成为Spark程序员之前,你应该先深入理解Spark应用的架构,以及应用是如何在Spark集群上执行的。本章详细讲解Spark应用的组件,介绍各组件如何合作,以及Spark应用在独立集群和YARN集群上如何运行。
3.1 Spark应用中的术语
无论是使用单机运行Spark,还是使用成百上千台机器组成的集群,Spark应用里始终存在几个组件。
在Spark程序的执行过程中,每个组件都有特定的作用。一部分组件(如客户端)在执行过程中较为不活跃,而另一部分组件在执行过程中较为活跃,如执行计算函数的组件。
Spark应用的组件包括驱动器(driver)、主进程(master)、集群管理器(cluster manager),以及至少一个执行器(executor)。执行器运行在工作节点(worker)上。图3.1展示了Spark独立集群模式的应用环境中所有的Spark组件。本章稍后会进一步介绍每个组件及其功能。
包括驱动器进程、主进程和至少一个执行器进程在内的所有Spark组件都运行在Java虚拟机(JVM)上。JVM是跨平台的运行环境引擎,可以执行被编译为Java字节码的指令。Spark是用Scala实现的,而Scala语言会编译为字节码并运行在JVM上。
Spark的运行时应用组件与这些组件所运行的位置和节点类型之间的区别是有必要特别注意的。当使用不同的部署模式时,这些组件运行的位置也不一样,因此不要把这些组件当成物理节点或者实例之类的东西。比如,在YARN集群上运行Spark时的情况和图3.1所示的情况就不尽相同。不过,应用中仍然包含了图里所有的组件,这些组件还是一样各司其职。
图3.1 Spark独立集群中的应用组件
3.1.1 Spark驱动器
Spark应用生命周期的开始和结束与Spark驱动器的保持一致。驱动器是Spark客户端用来提交应用的进程。驱动器进程也负责规划和协调Spark程序的执行,并向客户端返回执行状态以及结果数据。后面会介绍,驱动器进程可以运行于客户端上,也可以运行在集群里的一个节点上。
1.SparkSession
Spark驱动器进程负责创建SparkSession对象。SparkSession对象代表Spark集群的一个连接。SparkSession在Spark应用启动的时候实例化出来,并在程序整个运行过程中使用,包括交互式shell程序也是这样的。
在Spark 2.0之前,Spark应用的入口有这么几个:Spark core应用使用SparkContext,Spark SQL应用使用SQLContext和HiveContext,Spark Streaming应用使用StreamingContext。而Spark 2.0引入的SparkSession对象把这些对象组合到了一起,成为所有Spark程序统一的入口。
SparkSession对象中包含运行时用户配置的所有参数属性,包括Spark主程序、应用名称、执行器数量等。这些参数属性在SparkSession对象内的SparkContext和SparkConf子对象中。图3.2展示了pyspark的shell里的SparkSession对象和它的部分配置项的属性。
SparkSession对象名
SparkSession实例的对象名可以随便设置。默认情况下,在Spark交互式shell里的SparkSession实例以spark作为名称。如果要保持一致,你可以给自己实例化的SparkSession也起名为spark,具体名称完全由开发者决定。
图3.2 SparkSession的参数属性
程序清单3.1展示了如何在非交互式Spark应用内创建SparkSession对象,比如一个通过spark-submit提交的程序。
程序清单3.1 创建一个SparkSession对象
2.应用规划
驱动器的主要功能之一就是确定应用执行计划。驱动器接收应用处理作业作为输入,规划程序的执行计划。驱动器进程根据所有要执行的转化操作(transformation,对数据进行的操作)和行动操作(action,请求输出数据或提示程序实际执行的操作)创建出由节点(node)组成的有向无环图(Directed Acyclic Graph,DAG),其中每个节点表示一个转化或者计算的步骤。
有向无环图
DAG是一种数学结构,在计算机科学中常用来表示数据流及其依赖关系。DAG包括点(节点)和边。在表示数据流时,节点表示处理流程中的单个步骤。DAG中的边把节点有向连接起来,同时确保不出现环状引用。
一个Spark应用的DAG由任务和阶段组成。任务是Spark程序最小的可调度单元。阶段是一组可以并发执行的任务的总称。阶段间存在依赖关系,即阶段依赖(stage dependency)。
就进程调度而言,DAG不是Spark所独有的。比如其他的一些大数据生态圈中的项目也在调度中使用DAG,例如Tez、Drill、Presto等。DAG对于Spark来说至关重要,因此要把DAG的概念烂熟于心。
3.应用协调
驱动器进程也负责协调DAG内定义的各阶段各任务的运行。在任务的调度和执行中,驱动器进程做的主要的事情包括下列两项:
维护执行任务时可用的资源的记录。
把任务尽量调度到“靠近”数据的地方(数据本地化的概念)。
4.其他功能
除了规划执行计划和协调Spark程序执行,驱动器还负责返回应用的执行结果。这个结果可以是一个返回码,当行动操作要求把实际数据返回到客户端时,也可以是实际数据(比如在交互式查询的场景里)。
驱动器进程还在4040端口上提供应用的用户界面,如图3.3所示。这个用户界面是自动创建的,与所提交的应用的代码或者应用提交的方式(不管是使用pyspark的交互式应用还是使用spark-submit的非交互式应用)都没有关系。
图3.3 Spark应用的用户界面
如果后续有应用在同一台主机上启动,应用用户界面会使用连续的端口号(比如4041、4042等)。
- 点赞
- 收藏
- 关注作者
评论(0)