spark集群模式的概述(cluster mode overview)
文章来自http://spark.apache.org/docs/latest/cluster-overview.html
Component
spark应用程序以独立进程的集合的方式运行在集群中,通过driver program
中的SparkContext
对象进行协调。SparkContext
能够连接多种不同类型的cluster manager
(如standalone,mesos,yarn),这些cluster manager
都是用来分配资源给spark应用程序的。一旦建立连接,spark就会获取到集群节点中的executor
。executor
以进程的形式运行在work node
上,用来执行计算以及存储数据,因此多个work node
就会有多个executor
。driver program
将spark应用程序的代码先交给SparkContext
然后再发送给executor
。最后,SparkContext
将task
发送到executor
去执行。
架构中的一些注意事项:
- 每一个spark应用程序都会获取属于自己的
executors
进程,在整个应用程序执行的过程中,executor
以多线程的形式执行task
。这样有利于应用程序间的隔离,不管从调度层面来讲(每个driver
调度属于自己的tasks
)还是从executor
层面(不同spark应用程序的tasks
实际上运行在不同的jvm上)。但是,应用程序间隔离也意味着数据无法在spark应用程序(SparkContext
的实例)间传递,除非将数据写到外部存储系统中。
- 底层的
cluster manager
感知不到spark的存在。只要spark能够获取到executor
进程(同一个spark应用程序下的executor
进程能够相互通信),即使cluster manager
属于不同类型(如 mesos,yarn),spark应用程序都能够相对容易地运行起来。
-
driver program
在整个生命周期中都必须监听,接受来自属于自己的executor
的连接请求(可以在network config section中的spark.driver.port
项进行配置)。因此,driver program
必须要保持和其他work node
的网络是可以连通的。(这里可能存在跨网段问题?)
- 因为集群上的
tasks
受到driver
的调度,所以driver
需要够靠近work node
运行,在同一个局域网中是最好的。如果想要远程向集群发送请求,那么通过RPC
将请求发送给driver
,由driver
在近work node
端提交给我们的操作,比在远work node
端运行一个driver
来的好一些。
Cluster Manager Types
- Standalone,附带简单
cluster manger
的spark,可以轻松设置集群(单机版) - Apache Mesos,一个通用的
cluster manger
,也可以运行Hadoop MapReduce和服务应用程序 - Hadoop YARN,Hadoop 2.x中的资源管理器
- Kubernetes,一个开源系统,用于自动化容器化应用程序的部署,扩展和管理。
Submitting Applications
spark可以通过spark-submit
脚本将应用程序提交到任何不同类型的集群中。
Monitoring
每个driver program
都拥有自己的web UI,端口一般为4040,web包含运行中的tasks,executors,storage usage
信息。 通过http://<driver-node>:4040可以访问到。
Job Scheduling
spark可以控制跨应用程序(从cluster manager
的层面)的资源分配以及应用程序内(如果有多个计算发生在同一个SparkContext
中)的资源分配。
Glossary
术语 | 含义 |
---|---|
Application | 用户构建在spark上的程序,在集群中包括一个driver programe 和多个executor
|
Application jar | 一个装着用户的spark应用程序的jar包。有时候用户想要创建一个包含spark应用程序及其依赖项的“uber jar”。用户的jar不应该(never)包含Hadoop或Spark库,因为这些库将在运行时添加。 |
Driver program | 是一个进程,用来运行应用程序的main方法,并且创建SparkContext
|
Cluster manager | 是一个外部服务,用来获取集群中的资源(有多种模式) |
Deploy mode | 用来区分dirver 进程运行的位置。在cluster模式中,spark框架在集群内部启动driver ;在client模式中,由submitter在集群外部启动driver
|
Worker node | 集群中任何可以运行spark应用程序代码的节点 |
Executor | 一个由spark应用程序创建的,位于worker node 上的进程,用来执行task ,将数据保存在内存或者磁盘上。每个spark应用程序都有属于自己的多个executor
|
Task | 一个工作单元,会被送往executor 去执行 |
Job | 一个由多个task 组成的并行计算,通过Spark的action类算子进行触发,可以在driver 日志中观察到 |
Stage | 每个job 可以被切分成更小的,多个task 组成的集合,集合之间相互依赖(类似于mapreduce中的map stage和reduce stage)。可以在driver 日志中观察到。 |