集群模式概述
本文档简要概述了 Spark 如何在集群上运行,以便更容易理解所涉及的组件。阅读 应用程序提交指南 以了解如何在集群上启动应用程序。
组件
Spark 应用程序在集群上作为独立的进程集运行,由主程序(称为驱动程序)中的 SparkContext
对象协调。
具体来说,为了在集群上运行,SparkContext 可以连接到几种类型的集群管理器(无论是 Spark 自身的独立集群管理器、Mesos、YARN 还是 Kubernetes),这些管理器在应用程序之间分配资源。连接后,Spark 在集群中的节点上获取执行器,这些执行器是运行计算并为您的应用程序存储数据的进程。接下来,它将您的应用程序代码(由传递给 SparkContext 的 JAR 或 Python 文件定义)发送到执行器。最后,SparkContext 将任务发送到执行器以运行。
关于这种架构,有几点需要注意
- 每个应用程序都拥有自己的执行器进程,这些进程在整个应用程序的持续时间内保持运行,并在多个线程中运行任务。这具有将应用程序彼此隔离的优点,无论是在调度方面(每个驱动程序都调度自己的任务)还是在执行器方面(来自不同应用程序的任务在不同的 JVM 中运行)。但是,这也意味着在没有将数据写入外部存储系统的情况下,无法在不同的 Spark 应用程序(SparkContext 的实例)之间共享数据。
- Spark 对底层集群管理器是不可知的。只要它能够获取执行器进程,并且这些进程彼此通信,那么即使在也支持其他应用程序(例如 Mesos/YARN/Kubernetes)的集群管理器上运行它也相对容易。
- 驱动程序必须在其整个生命周期内监听并接受来自其执行器的传入连接(例如,参见 网络配置部分中的 spark.driver.port)。因此,驱动程序必须从工作节点进行网络寻址。
- 由于驱动程序在集群上调度任务,因此它应该运行在靠近工作节点的地方,最好是在同一个局域网内。如果您想远程向集群发送请求,最好打开一个到驱动程序的 RPC,并让它从附近提交操作,而不是在远离工作节点的地方运行驱动程序。
集群管理器类型
该系统目前支持几种集群管理器
- 独立 – Spark 自带的简单集群管理器,可以轻松设置集群。
- Apache Mesos – 一种通用的集群管理器,也可以运行 Hadoop MapReduce 和服务应用程序。(已弃用)
- Hadoop YARN – Hadoop 3 中的资源管理器。
- Kubernetes – 用于自动部署、扩展和管理容器化应用程序的开源系统。
提交应用程序
可以使用 spark-submit
脚本将应用程序提交到任何类型的集群。 应用程序提交指南 描述了如何执行此操作。
监控
每个驱动程序都具有一个 Web UI,通常在端口 4040 上,它显示有关正在运行的任务、执行器和存储使用情况的信息。只需在 Web 浏览器中访问 http://<driver-node>:4040
即可访问此 UI。 监控指南 还描述了其他监控选项。
作业调度
Spark 允许控制跨应用程序(在集群管理器级别)和内部应用程序(如果多个计算在同一个 SparkContext 上发生)的资源分配。 作业调度概述 更详细地描述了这一点。
词汇表
下表总结了您将看到用于引用集群概念的术语
术语 | 含义 |
---|---|
应用程序 | 基于 Spark 构建的用户程序。由集群上的驱动程序和执行器组成。 |
应用程序 jar | 包含用户 Spark 应用程序的 jar。在某些情况下,用户可能希望创建一个包含其应用程序及其依赖项的“uber jar”。但是,用户的 jar 不应包含 Hadoop 或 Spark 库,这些库将在运行时添加。 |
驱动程序 | 运行应用程序的 main() 函数并创建 SparkContext 的进程 |
集群管理器 | 用于在集群上获取资源的外部服务(例如独立管理器、Mesos、YARN、Kubernetes) |
部署模式 | 区分驱动程序进程运行的位置。在“集群”模式下,框架在集群内部启动驱动程序。在“客户端”模式下,提交者在集群外部启动驱动程序。 |
工作节点 | 任何可以在集群中运行应用程序代码的节点 |
执行器 | 在工作节点上为应用程序启动的进程,它运行任务并在它们之间将数据保存在内存或磁盘存储中。每个应用程序都有自己的执行器。 |
任务 | 将发送到一个执行器的执行单元 |
作业 | 由多个任务组成的并行计算,这些任务响应 Spark 操作(例如save 、collect )而生成;您将在驱动程序的日志中看到此术语。 |
阶段 | 每个作业都被分成称为阶段的更小的任务集,这些任务彼此依赖(类似于 MapReduce 中的映射和归约阶段);您将在驱动程序的日志中看到此术语。 |