Spark - Cluster Mode概述(翻译)
这个文档简要的介绍下Spark是怎么样在集群模式中运行的,以方便更容易的理解其涉及到的组件。可以通过阅读 application submission guide来了解怎么样在集群中运行应用程序。
Components
Spark应用程序作为独立的进程集运行,它们是由 main程序(称为driver程序)中的
SparkContext
对象进行协调的。特别地,在集群上运行是,SparkContext可以与几种不同的cluster managers进行连接通信,比如Spark自己的standalone 集群管理器或者Mesos或者Yarn,这些集群管理器为应用程序分配资源。一旦连接上以后,Spark可以获取到运行在集群节点上的executors,executors是负责运行你的应用程序中计算和存储数据。然后,它把你的代码(由传递给SparkContext的JAR或者Python定义)发送给executor。最终,SparkContext发送task给executor来运行。
关于这个架构有几个有用的东西值得注意:
1. 每个application获取它自己的executor进程。在整个application运行期间,executor会一直存活,并且它以多线程的方式运行task。这有利于使各个应用之间相互隔离,这种特性体现在两方面:一是调度端(每个driver调度它自己的tasks),二是executor方面(来自于不同应用的executor运行在不同的JVM中)。然而,这也意味着数据不能在不同的Spark应用之间共享,除非把数据写到外部的存储系统。
2.底层的集群管理器对于Spark来说是透明的。只要Spark可以获取到executor,并且他们之间可以相互通信,那么运行Spark就是相当简单的,即使运行在也支持其他应用的集群管理器上也可以(比如:Mesos/YARN)
3. driver程序在其整个存活期间必须监听并且接受来自它的executor的连接(比如:请参见 spark.driver.port in the network config section )。因此,driver程序必须与worker节点中的网络是可连接的。
4. 因为driver在集群上调度任务,所以,它应该运行在与worker节点较近的地方,最好是同一个局域网内。如果你想要发送请求到远处的集群,最好给driver开启RPC协议让其在节点附近提交操作,而不是让driver在离工作节点很远的地方运行。
Cluster Manager Types
Spark现在直接支持3种集群管理器:
- Standalone – Spark内部的一个简单的集群管理器,它使设置群变得很简单。
- Apache Mesos – 一个通用的集群管理器,它可以运行Hadoop MapReduce和服务应用(service applications)
- Hadoop YARN – 在Hadoop 2 中的集群管理器。
- Kubernetes (experimental) – 以上之外的集群管理器,对于Kubernetes也有丰富的支持。Kubernetes是一个开源的提供容器化结构的平台。Kubernetes的支持是在 apache-spark-on-k8s Github组织内积极开发的。相关的文档,请阅读那个项目的README。
Submitting Applications
Applications可以使用 spark-submit 脚本提交到任意类型的集群上。 application submission guide描述了怎么样来提交任务。
Job Scheduling
Spark将在跨应用程序(在集群管理器的级别)和应用程序内(如果在同一个SparkContext上运行多个计算)中,对资源分配进行控制。 job scheduling overview 更加详细的描述了这个特性。
Glossary(术语)
术语项
|
含义
|
Application
|
基于Spark的用户程序。由driver和executor组成。
|
Application Jar
|
包含用户Spark程序的Jar包。在某些场景下,用户可能想创建“Uber jar”,它同时包含用户的应用程序和它的依赖。用户的Jar绝对不要包含Hadoop和Spark的类库。但是这些将会在运行时被加载。
|
Driver program
|
运行应用程序的main()函数并创建SparkContext的进程
|
Cluster manager
|
在集群上获取资源的外部程序。(比如: standalone manager, Mesos, YARN )
|
Deploy mode
|
它用来区分应用程序运行在哪里。在“cluster”模式中,框架在集群中运行driver,在“client”模式中,提交者在集群之外运行driver。
|
Worker node
|
集群中任何可以运行应用程序代码的节点
|
Executor | 运行与工作节点之上的应用程序进程,他们执行task并且把数据保存在内存中或者磁盘存储中。每个应用有它自己的executor。 |
Task
|
被发送给一个executor的最小的工作单元。
|
Job
|
可以引起Spark action的返回的由多个tasks组成的并行的计算(比如:save,collect)。你可以在driver的log中看到这个词的使用。 |
Stage
|
每个job被切分成小的任务集,这些小的任务集叫做stages,并且他们之间相互依赖(类似于MapReduce中的map和redu ce阶段)。你可以在driver的log中看到这个词的使用。 |