获取完整的书
教程:Spark应用程序体系结构和集群 使用Python使用Spark进行数据分析(Addison-Wesley数据和分析系列)
建议零售价$ 44.99
看见

本文摘自Jeffrey Aven在Pearson Addison-Wesley撰写的“使用Spark使用Python进行数据分析”一书中。 经培生(Pearson)许可在此处转载©2018。 有关更多信息,请访问notifyit.com/aven/infoworld。

在开始作为Apache Spark程序员的旅程之前,您应该对Spark应用程序体系结构以及如何在Spark集群上执行应用程序有深入的了解。 本文仔细检查了Spark应用程序的组件,研究了这些组件如何协同工作,并研究了Spark应用程序如何在独立群集和YARN群集上运行。

Spark应用程序剖析

Spark应用程序包含多个组件,无论您是在一台机器上还是在数百或数千个节点的集群中运行Spark,所有这些组件都存在。

[InfoWorld的要点: 什么是Apache Spark? 大数据分析平台介绍了以下内容Spark教程:Apache Spark入门什么是数据挖掘? 分析如何发现见解 | 通过《 InfoWorld日报》时事通讯了解最新的企业技术中的关键新闻和问题。 ]

每个组件在执行Spark程序时都有特定的角色。 其中一些角色(例如客户端组件)在执行过程中是被动的。 其他角色在程序执行中是活跃的,包括执行计算功能的组件。

Spark应用程序的组件包括:

  • 司机
  • 大师
  • 集群管理器
  • 执行者

它们都在工作节点(也称为工作程序)上运行。

图1显示了Spark独立应用程序上下文中的所有Spark组件。

教程:Spark应用程序体系结构和集群皮尔森·艾迪生·韦斯利

图1. Spark独立集群应用程序组件

所有Spark组件(包括驱动程序,主进程和执行程序进程)都在Java虚拟机中运行。 JVM是跨平台的运行时引擎,可以执行编译为Java字节码的指令。 Spark编写的Scala可编译为字节码并在JVM上运行。

区分Spark的运行时应用程序组件以及它们在其上运行的位置和节点类型很重要。 这些组件使用不同的部署模式在不同的位置运行,因此不要以物理节点或实例的方式考虑这些组件。 例如,在YARN上运行Spark时,将出现图1的几种变体。但是,图中所示的所有组件仍包含在应用程序中,并且具有相同的角色。

火花驱动

Spark应用程序的生命周期从Spark驱动程序开始并结束。 驱动程序是客户端用来在Spark中提交应用程序的过程。 驱动程序还负责计划和协调Spark程序的执行,并将状态和/或结果(数据)返回给客户端。 该驱动程序可以物理驻留在群集的客户端或节点上,如您稍后将看到的。

SparkSession

Spark驱动程序负责创建SparkSession。 SparkSession对象代表与Spark集群的连接。 SparkSession在Spark应用程序(包括交互式外壳)的开始处实例化,并用于整个程序。

在Spark 2.0之前,Spark应用程序的入口包括用于Spark核心应用程序的SparkContext。 与Spark SQL应用程序一起使用的SQLContext和HiveContext; 和StreamingContext,用于Spark Streaming应用程序。 Spark 2.0中引入的SparkSession对象将所有这些对象组合到单个入口点,该入口点可用于所有Spark应用程序。

通过其SparkContext和SparkConf子对象,SparkSession对象包含用户设置的所有运行时配置属性,包括配置属性,例如主服务器,应用程序名称和执行程序数。 图2在pyspark shell中显示了SparkSession对象及其一些配置属性。

教程:Spark应用程序体系结构和集群皮尔森·艾迪生·韦斯利

图2. SparkSession属性

SparkSession名称

SparkSession实例的对象名称是任意的。 默认情况下,Spark交互式外壳中的SparkSession实例名为spark 为了保持一致性,您始终将SparkSession实例化为spark ; 但是,名称取决于开发人员。

以下代码演示了如何在非交互式Spark应用程序(例如,使用spark-submit的程序)中创建SparkSession。

from pyspark.sql import SparkSession 
spark = SparkSession.builder \
  .master("spark://sparkmaster:7077") \
  .appName("My Spark Application") \
  .config("spark.submit.deployMode", "client") \
  .getOrCreate()
numlines = spark.sparkContext.textFile("file:///opt/spark/licenses") \
  .count()
print("The total number of lines is " + str(numlines))

应用规划

驱动程序的主要功能之一是计划应用程序。 驱动程序接受应用程序处理的输入并计划程序的执行。 驱动程序执行所有请求的转换 (数据操作操作)和动作 (对输出的请求或执行程序的提示),并创建节点的有向无环图(DAG),每个节点代表一个转换或计算步骤。

有向无环图(DAG)

DAG是一种数学构造,通常在计算机科学中用于表示数据流及其依赖性。 DAG包含顶点(或节点)和边。 数据流上下文中的顶点是流程中的步骤。 DAG中的边缘以有向的方向将顶点相互连接,并且不可能有圆形参考。

Spark应用程序DAG包含任务阶段 任务是Spark程序中可调度工作的最小单元。 阶段是可以一起运行的一组任务。 阶段相互依赖; 换句话说,存在阶段依赖性

从流程调度的角度来看,DAG并非Spark独有。 例如,它们可用于其他大数据生态系统项目中,例如Tez,Drill和Presto。 DAG是Spark的基础,因此值得熟悉这个概念。

应用编排

驱动程序还协调DAG中定义的阶段和任务的运行。 计划和运行任务涉及的关键驱动程序活动包括:

  • 跟踪可用资源来执行任务。
  • 计划任务以尽可能“接近”数据运行(数据局部性的概念)。

其他功能

除了计划和协调Spark程序的执行之外,驱动程序还负责从应用程序返回结果。 在请求将数据返回给客户端的操作(例如,交互式查询)的情况下,这些可以是返回码或数据。

驱动程序还在端口4040上提供应用程序UI,如图3所示。 它与提交的代码或提交方式无关(即,使用pyspark交互或使用spark-submit非交互)。

教程:Spark应用程序体系结构和集群皮尔森·艾迪生·韦斯利

图3. Spark应用程序UI

如果后续应用程序在同一主机上启动,则后续端口将用于应用程序UI(例如4041、4042等)。

星火工人和执行者

Spark执行程序是运行Spark DAG任务的进程。 执行程序在Spark集群中的从属节点或工作程序上保留CPU和内存资源。 执行程序专用于特定的Spark应用程序,并在应用程序完成时终止。 Spark程序通常由许多执行程序组成,通常并行工作。

通常,承载执行程序进程的工作节点在任何时间点都有有限或固定数量的执行程序分配。 因此,群集(即节点数已知)具有可在任何给定时间运行的有限数量的执行程序。 如果应用程序要求执行者超出群集的物理容量,则计划将它们在其他执行者完成并释放其资源时启动。

如前所述,JVM托管Spark执行程序。 为执行者的JVM分配了一个 ,该是用于存储和管理对象的专用内存空间。

提交给执行者的JVM堆的内存量由属性spark.executor.memory设置,或作为pysparkspark-shellspark-submit命令的pyspark --executor-memory参数设置。

执行程序将任务的输出数据存储在内存或磁盘中。 重要的是要注意,工作者和执行者仅了解分配给他们的任务,而驱动程序则负责理解整套任务以及组成应用程序的各个依赖项。

通过在驱动程序主机的端口404 x上使用Spark应用程序UI,您可以检查该应用程序的执行程序,如图4所示。

教程:Spark应用程序体系结构和集群皮尔森·艾迪生·韦斯利

图4. Spark应用程序UI中的“ Executors”选项卡

对于Spark独立群集部署,工作节点在端口8081上公开用户界面,如图5所示。

教程:Spark应用程序体系结构和集群皮尔森·艾迪生·韦斯利

图5. Spark worker UI

Spark Master和集群管理器

Spark驱动程序计划并协调运行Spark应用程序所需的任务集。 任务本身在执行程序中运行,执行程序托管在工作程序节点上。

主服务器和群集管理器是监视,保留和分配运行执行程序的分布式群集资源(或YARN或Mesos的容器)的中央过程。 主服务器和集群管理器可以是单独的进程,也可以合并为一个进程,就像在独立模式下运行Spark时一样。

火花大师

Spark主站是请求集群中资源并将其提供给Spark驱动程序的过程。 在所有部署模式下,主服务器与工作节点或从节点协商资源或容器,并跟踪其状态并监视其进度。

在独立模式下运行Spark时,Spark主进程在主主机的端口8080上提供Web UI,如图6所示。

教程:Spark应用程序体系结构和集群皮尔森·艾迪生·韦斯利

图6. Spark主用户界面

Spark Master与Spark驱动程序

区分驱动程序和主机的运行时功能很重要。 名称master可以推断为意味着此过程控制着应用程序的执行-事实并非如此。 主机仅请求资源,并将这些资源提供给驱动程序。 尽管主服务器监视这些资源的状态和运行状况,但它不参与应用程序的执行以及其任务和阶段的协调。 那是司机的工作。

集群管理员

集群管理器是负责监视工作程序节点并根据主服务器的请求在这些节点上保留资源的过程。 然后,主服务器以执行程序的形式将这些群集资源提供给驱动程序。

如前所述,集群管理器可以与主进程分开。 在Mesos或YARN上运行Spark时就是这种情况。 如果Spark在独立模式下运行,则主进程还将执行集群管理器的功能。 实际上,它充当自己的集群管理器。

群集管理器功能的一个很好的例子是在Hadoop群集上运行的Spark应用程序的YARN ResourceManager进程。 ResourceManager计划,分配和监视在YARN NodeManager上运行的容器的运行状况。 然后,Spark应用程序使用这些容器来承载执行程序进程以及主进程(如果该应用程序以集群模式运行)。

使用独立调度程序的Spark应用程序

在第2章“部署Spark”中,我解释了独立调度程序作为Spark的部署选项。 在那里,我在第2章的练习之一中部署了一个功能齐全的多节点Spark独立集群。如前所述,在以独立模式运行的Spark集群中,Spark主进程也执行集群管理器功能,并控制集群中的可用资源。集群并将其授予主进程以在Spark应用程序中使用。

在YARN上运行的Spark应用程序

Hadoop是Spark的非常流行且通用的部署平台。 一些业内专家认为,Spark将很快取代MapReduce,成为Hadoop中应用程序的主要处理平台。 YARN上的Spark应用程序共享相同的运行时体系结构,但在实现方面略有不同。

ResourceManager作为集群管理器

与独立调度程序相反,YARN群集中的群集管理器是YARN ResourceManager。 ResourceManager监视群集中所有节点之间的资源使用情况和可用性。 客户端将Spark应用程序提交到YARN ResourceManager。 ResourceManager为应用程序分配第一个容器,即称为ApplicationMaster的特殊容器。

ApplicationMaster作为Spark Master

ApplicationMaster是Spark主进程。 就像主进程在其他集群部署中所做的一样,ApplicationMaster在应用程序驱动程序和集群管理器(在这种情况下为ResourceManager)之间协商资源; 然后,这些资源(容器)可供驱动程序使用,以用作执行程序来运行任务和存储应用程序的数据。

ApplicationMaster在应用程序的生命周期内保持不变。

在YARN上运行的Spark应用程序的部署模式

将Spark应用程序提交到YARN群集时,可以使用两种部署模式:客户端模式和群集模式。 让我们现在来看它们。

客户端模式

在客户端模式下,驱动程序进程在提交应用程序的客户端上运行。 它实际上是不受管理的; 如果驱动程序主机发生故障,则应用程序将失败。 交互式shell会话( pysparkspark-shell等)和非交互式应用程序提交( spark-submit )均支持客户端模式。 以下代码显示了如何使用客户端部署模式启动pyspark会话。

$SPARK_HOME/bin/pyspark \ 
--master yarn-client \
--num-executors 1 \
--driver-memory 512m \
--executor-memory 512m \
--executor-cores 1
# OR
$SPARK_HOME/bin/pyspark \
--master yarn \
--deploy-mode client \
--num-executors 1 \
--driver-memory 512m \
--executor-memory 512m \
--executor-cores 1

图7概述了在客户端模式下在YARN上运行的Spark应用程序。

教程:Spark应用程序体系结构和集群皮尔森·艾迪生·韦斯利

图7.在YARN客户端模式下运行的Spark应用程序

图7中显示的步骤是:

  1. 客户端将Spark应用程序提交给集群管理器(YARN ResourceManager)。 驱动程序进程,SparkSession和SparkContext已创建并在客户端上运行。
  2. ResourceManager为应用程序分配一个ApplicationMaster(Spark主控器)。
  3. ApplicationMaster向ResourceManager请求要用于执行程序的容器。 分配了容器后,执行程序就产生了。
  4. 然后,位于客户端上的驱动程序与执行程序进行通信,以调度处理Spark程序的任务和阶段。 驱动程序将进度,结果和状态返回给客户端。

客户端部署模式是最简单的使用模式。 但是,它缺乏大多数生产应用程序所需的弹性。

集群模式

与客户端部署模式相反,对于以YARN群集模式运行的Spark应用程序,驱动程序本身作为ApplicationMaster的子进程在群集上运行。 这提供了弹性:如果承载驱动程序的ApplicationMaster进程失败,则可以在群集中的另一个节点上重新实例化它。

下面的代码显示了如何使用spark-submit和YARN群集部署模式提交应用程序。 由于驱动程序是在集群中运行的异步进程,因此交互式Shell应用程序( pysparkspark-shell )不支持集群模式。

$SPARK_HOME/bin/spark-submit \
--master yarn-cluster \
--num-executors 1 \
--driver-memory 512m \
--executor-memory 512m \
--executor-cores 1
$SPARK_HOME/examples/src/main/python/pi.py 10000
# OR
$SPARK_HOME/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--num-executors 1 \
--driver-memory 512m \
--executor-memory 512m \
--executor-cores 1
$SPARK_HOME/examples/src/main/python/pi.py 10000

图8概述了在集群模式下在YARN上运行的Spark应用程序。

教程:Spark应用程序体系结构和集群皮尔森·艾迪生·韦斯利

图8.在YARN集群模式下运行的Spark应用程序

图8所示的步骤是:

  1. 客户端是一个调用spark-submit的用户进程,它将Spark应用程序提交给集群管理器(YARN ResourceManager)。
  2. ResourceManager为应用程序分配一个ApplicationMaster(Spark主控器)。 驱动程序进程在同一群集节点上创建。
  3. ApplicationMaster向ResourceManager请求容器以供执行者使用。 执行程序在由ResourceManager分配给ApplicationMaster的容器中生成。 然后,驱动程序与执行程序进行通信,以调度对Spark程序的任务和阶段的处理。
  4. 在群集中的节点上运行的驱动程序将进度,结果和状态返回给客户端。

如上所示,Spark应用程序Web UI可从群集中的ApplicationMaster主机获得。 可以从YARN ResourceManager UI中获得指向该用户界面的链接。

重新进入本地模式

在本地模式下,驱动程序,主服务器和执行程序都在单个JVM中运行。 如本章前面所述,这对于开发,单元测试和调试很有用,但是由于它不是分布式的并且无法扩展,因此在运行生产应用程序时用途有限。 此外,默认情况下不会重新执行在本地模式下运行的Spark应用程序中失败的任务。 但是,您可以覆盖此行为。

在本地模式下运行Spark时,可从http:// localhost:4040获得应用程序UI。 在本地模式下运行时,主用户界面和工作界面不可用。

From: https://www.infoworld.com/article/3307106/tutorial-spark-application-architecture-and-clusters.html

相关文章: