Cluster Mode Overview
本文档对Spark如何在集群上运行给出了一个简短的浏览,以便更加容易理解相关组件。通过看application submission guide来学习关于在集群上启动一个applicaiton的信息。
Components
Spark的application作为一组独立的进程在集群上运行,通过你主程序(被称为driver)中的SparkContext对象来协调合作。
具体来说,要在集群上运行application,SparkContext能够连接到某种类型的集群管理器(Spark自己的standalone集群管理器、Mesos或YARN),集群管理器能够跨application分配资源。一旦连接成功,Spark得到集群节点上的executor,这些executor为你的application执行计算以及存储数据。接下来SparkContext发送你的application代码(由传递给你SparkContext的JAR或Python文件定义)到executor。最终,SparkContext发送任务到executor来运行。
此处是图片
关于这个结构,有一些有用的东西需要注意:
1、每个application会得到自己的executor进程,这些executor在这个application持续期间保持不变并以多线程运行任务。这样的好处是application彼此隔离,无论是在调度方面(每个driver调度它自己的任务)还是executor方面(来自不同application的任务运行在不同的JVM中)。因此,这也意味着数据在不同的Spark application之间是不能共享的,除非借助其他外部存储。
2、Spark与底层集群管理器无关。只要它能够得到executor进程,并且它们能够彼此通信,这样即使是在支持其他application的集群管理器上也能相对简单的运行。
3、在driver程序整个生命周期内,它必须监听并接受来自它的executor的连接(查看网路配置章节spark.driver.port)。因此,driver程序对于它的worker节点来说必须是可以迅指的。
4、因为driver在集群上调度任务,因此它应该靠近worker节点,最好是在相同的局域网内。如果你想要远程向集群发送请求,最好为你的driver打开一个RPC,让它就近提交,而不是在远离worker节点的地方运行driver。
Cluster Manager Types
系统当前支持3种集群管理器:
Stangalone - Spark自带的一种集群管理器,使用它能够很容易的构建集群。
Apache Mesos - 一个很普遍的集群管理器,它还能够运行Hadoop的MapReduce和服务应用。
Hadoop YARN - Hadoop2种的资源管理器。
Kubernetes - 一个开源的系统,用于自动部署、扩展以及管理application。
Submitting Applications
使用spark-submit脚本可以将application提交到任何类型集群。application submission guide描述了应该如何做。
Monitoring
每个driver程序都有一个Web UI,端口一般是4040,这个web UI展示了运行的任务、executor已经存储的使用情况。通过在浏览器中输入http://
Job Scheduling
spark给出了两种资源分配,一种是跨applications(在集群管理器级别上),一种是application中(在相同SparkContext上出现多次计算的情况)。job scheduling overview描述了详细信息。
Glossary
下面的表格列出了常用的一些集群概念:
Term | Meaning |
---|---|
Application | 在Spark上构建的用户程序。由一个driver程序和集群上的executors组成。 |
Application jar | 一个包含了用户的Spark application的jar。在某些情况下用户可能想要创建一个”uber jar”来包含他们的application以及依赖。用户的jar应当不要包含Hadoop或Spark的库,因为这些库会在运行时自动被添加。 |
Driver program | 运行application的main函数并创建SparkContext的进程。 |
Cluster | 一个额外的服务,用来获取集群上的资源(如standalong manager、Mesos或YARN)。 |
Deploy mode | 用来区分在哪里运行driver进程。在“cluster”模式中,系统在集群内部启动driver。在“client”模式中,在集群之外启动driver。 |
Worker node | 集群中任何可以运行application的节点。 |
Executor | 在worker节点上启动的用来处理application的进程,它执行任务并在内存或磁盘上保存数据。每个application都有自己的exectors。 |
Task | 发送给executor的一个工作单元。 |
Job | 由多个tasks组成的一个并行计算,并为一个spark action产生结果(如 save、collect)。 你将会在driver的日志中看到它们。 |
Stage | 每个job被划分为一更小的task,称为stage,这些stage相互依赖(类似MapReduce中map阶段和reduce阶段)。你将会在driver的日志中看到他们。 |