Spark集群模式概览
本文讲解Spark如何运行于集群之上,对其中相关的组件进行介绍。
组件(Components)
Spark应用主程序通过引用SparkContext对象,以进程的独立集合的形式运行于集群上。该主程序被称为驱动程序(driver program)。
具体地说,在集群上运行的时候,SparkContext对象可以连接多种集群管理器(cluster managers)用以协调分配资源,其中包括Spark自身(standalone)的集群管理器、Mesos和YARN。一旦连接到集群管理器,Spark将请求获取集群中各个节点上的executor,executor是为程序执行计算和存储数据的进程。紧接着,(SparkContext以JAR或Python文件的形式)将应用程序代码传送给executor。最后,SparkContext在executor中发起任务(task)用以执行应用代码。
上述架构图中有几点有用的信息需要指出:
- 每个应用程序请求获取到的executor进程会伴随着应用程序的生命周期一直存在,task是以多线程的方式在executor进程中执行。这有利于应用程序在调度端(每个驱动调度自身的tasks)和executor端(来自不同应用的tasks运行于不同的JVM中)都可以彼此隔离。然而,这也意味着不同的Spark应用程序(SparkContext实例)不能共享数据,除非将这些数据写入外部存储系统。
- Spark对于集群管理器(cluster manager)并不可知。只要SparkContext可以获取到executor进程并与这些进程进行交互。这样的话,也可以很轻易地将集群管理器(cluster manager)替换为支持其他应用的集群管理器,例如Mesos或YARN。
- 驱动程序(driver program)在它的生命周期内必须监听并接收来自于executors的连接。因此,驱动程序(driver program)对于工作节点(work nodes)必须是网络可寻址的(network addressable)。
- 在集群中,由于驱动(driver)调度任务(tasks),所以驱动应尽量靠近工作节点,最好两者可以处于同一个局域网内。如果你想要向远程集群发送请求,最好是让驱动(driver)以RPC的方式执行近端提交操作,而不是在远程工作节点上运行驱动(driver)。
集群管理器类型(Cluster Manager Types)
Spark现在支持3种集群管理器:
- Standalone — 一个Spark自带的简易集群管理器,主要目的是可以方便地建立一个Spark集群;
- Apache Mesos — 一个通用的集群管理器,同样也适用于Hadoop MapReduce和其他计算应用模型;
- Hadoop YARN — Hadoop 2.0引入的资源管理器。
提交应用程序(Submitting Applications)
可以使用spark-submit脚本将应用程序(application)提交给一个集群。
性能监控(Monitoring)
驱动程序(driver program)提供一个Web UI来展示运行的tasks、executors和存储使用情况(storage usage)。可以通过http://<driver-node>:4040访问这个UI进行查看。
工作调度(Job Scheduling)
Spark不仅控制跨应用(集群管理器这一级别)的资源调配,还控制着应用内部(SparkContext上的多重计算)的资源调配。
术语(Glossary)
下表总结了一些集群中常用到的术语:
Term | Meaning |
Application | Spark集群上构建的用户程序,包括一个驱动程序(driver program)和多个executor |
Application jar | Spark用户程序打包后的JAR文件。在某些情况下,用户会创建一个包含应用以及其依赖的“uber jar”。用户提供的JAR文件不需要包含Hadoop或Spark的库文件,这些库文件会在运行时自动加上。 |
Driver program | 运行应用main()方法并创建SparkContext的进程 |
Cluster manager | 调配集群资源的外部服务(例如:standalone manager、Mesos、YARN) |
Deploy mode | 区别在于是谁发起驱动进程。在cluster模式下,框架在集群内部发起驱动进程;在client模式下,程序提交者在集群外部发起驱动进程。 |
Worker node | 可以运行应用代码的任何集群节点。 |
Executor | 在worker node上为应用启动的一个进程,可以执行tasks,并将数据保存在内存或硬盘上。每个application有自己的一组executors。 |
Task | 一个executor中的工作单元。 |
Job | 由多个tasks构成的并行计算,在Spark action(例如:save,collect)被调用执行时被孵化启动。 |
Stage | 每个job被切分成许多小的任务集,这些任务集之间有所依赖(就像MapReduce中的map阶段和reduce阶段),这些任务集就被称作stage。 |