集群模式概述

本文简要概述了Spark如何在集群上运行,以便更容易理解涉及的组件。请阅读 应用程序提交指南 以了解如何在集群上启动应用程序。

组件

Spark 应用程序作为独立的进程集在集群上运行,由主程序中的 SparkContext 对象协调(称为 驱动程序 )。

具体来说,要在集群上运行,SparkContext 可以连接几种类型的 集群管理器 (包括 Spark 自身的独立集群管理器、Mesos、YARN 或 Kubernetes),这些管理器在应用程序之间分配资源。一旦连接,Spark 会在集群中的节点上获取 执行器 ,这些执行器是运行计算和存储数据的进程。接下来,它将您的应用程序代码(通过传递给 SparkContext 的 JAR 或 Python 文件定义)发送到执行器。最后,SparkContext 将 任务 发送到执行器以运行。

Spark集群组件

关于这一架构,有几点有用的事项需要注意:

  1. 每个应用程序都有自己的执行进程,这些进程在整个应用程序的运行期间保持活动并在多个线程中运行任务。这有助于将应用程序彼此隔离,无论是在调度方面(每个驱动程序调度自己的任务)还是在执行者方面(来自不同应用程序的任务在不同的JVM中运行)。然而,这也意味着数据无法在不同的Spark应用程序(SparkContext的实例)之间共享,而不需要将其写入外部存储系统。
  2. Spark对底层集群管理器是不可知的。只要它能获取执行进程,并且这些进程能够相互通信,即使在支持其他应用程序的集群管理器(例如Mesos/YARN/Kubernetes)上运行也是相对简单的。
  3. 驱动程序必须在其生命周期内监听并接受来自执行程序的传入连接(例如,参见 spark.driver.port在网络配置部分 )。因此,驱动程序必须能够从工作节点进行网络寻址。
  4. 因为驱动程序在集群上调度任务,所以它应该靠近工作节点运行,最好是在同一局域网内。如果您想远程向集群发送请求,最好是打开一个RPC到驱动程序,并让它从附近提交操作,而不是运行一个远离工作节点的驱动程序。

集群管理器类型

该系统当前支持几种集群管理器:

提交申请

可以使用 spark-submit 脚本向任何类型的集群提交应用程序。 应用程序提交指南 描述了如何做到这一点。

监控

每个驱动程序都有一个 Web 用户界面,通常在 4040 端口,显示有关正在运行的任务、执行器和存储使用情况的信息。只需在 Web 浏览器中访问 http:// :4040 即可访问此用户界面。 监控指南 还描述了其他监控选项。

作业调度

Spark在资源分配方面提供控制,既可以 应用(在集群管理器级别)也可以 应用内(如果在同一个SparkContext上发生多个计算)。 作业调度概述 对此进行了更详细的描述。

词汇表

以下表格总结了您将看到的用于指代集群概念的术语:

术语 含义
应用程序 基于Spark构建的用户程序。由集群上的 驱动程序 执行器 组成。
应用程序jar 包含用户Spark应用程序的jar。在某些情况下,用户可能想要创建一个包含他们的应用程序及其依赖项的“uber jar”。但是,用户的jar不应包含Hadoop或Spark库,然而,这些将在运行时添加。
驱动程序 运行应用程序的main()函数并创建SparkContext的进程
集群管理器 用于获取集群资源的外部服务(例如独立管理器、Mesos、YARN、Kubernetes)
部署模式 区分驱动程序进程运行的位置。在“集群”模式下,框架在集群内部启动驱动程序。在“客户端”模式下,提交者在集群外部启动驱动程序。
工作节点 可以在集群中运行应用程序代码的任何节点
执行器 在工作节点上为应用程序启动的进程,运行任务并在它们之间保持内存或磁盘存储中的数据。每个应用程序都有自己的执行器。
任务 将被发送到一个执行器的工作单元
作业 由多个任务组成的并行计算,响应于Spark操作(例如 save collect )而生成;您将在驱动程序的日志中看到这个术语。
阶段 每个作业被划分为称为 阶段 的更小的任务集,相互依赖(类似于MapReduce中的map和reduce阶段);您将在驱动程序的日志中看到这个术语。