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