集群模式概述
简单介绍spark如何运行在集群上,以便更容易理解所涉及的组件。通读应用程序提交,了解如何在集群上启动应用程序。
组件
Spark 应用程序作为集群上的独立进程集运行,由主程序(称为driver)中的 SparkContext
对象协调。
具体来说,要在集群上运行,SparkContext 可以连接到多种类型的集群管理器(Spark 自己的独立集群管理器 Mesos
或 YARN
)跨应用程序分配资源。连接之后,spark会在集群的节点上获取executors
,这些executors
进程为您的应用程序运行计算和存储数据。接下来,它将您的应用程序代码(由传递给 SparkContext 的 JAR 或 Python 文件定义)发送到executors
,最后,SparkContext
将任务发送给executor
运行。
关于这个架构,有几个有用的地方需要注意:
- 每个应用程序都有自己的
executor
程序进程,这些进程在整个应用程序运行期间保持运行并在多个线程中运行任务,这具有在调度端(每个driver
程序调度自己的任务)和executor
端(来自不同应用程序的任务在不同的 JVM 中运行)上彼此隔离应用程序的好处。然而,这也意味着在不将数据写入外部存储系统的情况下,数据无法在不同的 Spark 应用程序(SparkContext 的实例)之间共享 - Spark 与底层集群管理器无关。 只要它可以获取 executor 进程,并且这些进程相互通信,即使在也支持其他应用程序(例如 Mesos/YARN)的集群管理器上运行它也相对容易。
driver
程序必须在其整个生命周期内侦听并接受来自其executor
程序的传入连接(例如,请参阅网络配置部分中的 spark.driver.port)。 因此,驱动程序必须可以从工作节点网络寻址- 因为
driver
程序在集群上调度任务,所以它应该在工作节点附近运行,最好在同一个局域网上。 - 如果你想远程向集群发送请求,最好向
driver
程序打开一个RPC
并让它从附近提交操作,而不是运行远离工作节点的driver
程序(就近原则?)
集群管理器的类型
spark系统当前支持的几种集群管理器:
- standalone:Spark 附带的一个简单的集群管理器,可以轻松设置集群
- Apache Mesos:一个通用的集群管理器,也可以运行
Hadoop MapReduce
和service applications
。 - Hadoop YARN:Hadoop 2 中的资源管理器。
- k8s:一个用于自动化部署、扩展和管理容器化应用程序的开源系统。
存在第三方项目(不受 Spark 项目支持)以添加对 Nomad 作为集群管理器的支持。
提交应用
可以使用 spark-submit 脚本将应用程序提交到任何类型的集群。 application submission guide 描述了如何做到这一点
监控
每个driver
程序都有一个 Web UI,通常在端口 4040 上,显示有关正在运行的任务、执行程序和存储使用情况的信息;只需在 Web 浏览器中转到 http://<driver-node>:4040
即可访问此 UI。 monitoring guide还描述了其他监控选项
作业调度
Spark 可以控制跨应用程序(在集群管理器级别)和应用程序内部(如果在同一个 SparkContext 上发生多个计算)的资源分配。有关详情参考:job scheduling overview
词汇表
- Application:用户在spark上构建的应用程序。包括
driver
和executor
程序 - Application jar:包含用户spark应用程序的
jar
包文件。在某些情况下,用户会想要创建一个“uber jar”,其中包含他们的应用程序及其依赖项。用户的 jar 不应包含 Hadoop 或 Spark 库,但是,这些将在运行时添加 - Driver program:运行应用程序的 main() 函数并创建 SparkContext 的过程
- Cluster manager:用于获取集群资源的外部服务
- Deploy mode:区分
driver
进程在哪里运行cluster
模式下:框架在集群内部启动driver
程序client
模式下:提交者在集群外启动driver
程序
- Worker node:任何可以在集群中运行应用程序代码的节点
- Executor:为工作节点上的应用程序启动的进程,该进程运行任务并将数据保存在内存或磁盘存储中。 每个application都有自己的
executor
程序 - Task:将发送给一个
executor
的工作单元 - Job:由多个
Task
组成的并行计算,这些任务响应 Spark 操作(例如保存、收集)而产生; 您会在driver
程序日志中看到Job
这个术语 - Stage:每个
Job
被分成更小的Task
集,称为Stage
,这些Task
相互依赖(类似于 MapReduce 中的 map 和 reduce 阶段); 您会在驱动程序日志中看到Stage
这个术语