Spark 的一大好处就是能够经过增长机器数量并使用集群模式运行,来扩展程序的计算能力。好在编写用于在集群上并行执行的 Spark 应用所使用的 API 跟本地单机模式下的彻底同样。也就是说,你能够在小数据集上利用本地模式快速开发并验证你的应用,而后无需修改代码就能够在大规模集群上运行。shell
首先介绍分布式 Spark 应用的运行环境架构,而后讨论在集群上运行 Spark 应用时的一些配置项。Spark 能够在各类各样的集群管理器(Hadoop YARN、Apache Mesos,还有Spark 自带的独立集群管理器)上运行,因此 Spark 应用既可以适应专用集群,又能用于共享的云计算环境。缓存
在分布式环境下,Spark 集群采用的是主 / 从结构。在一个 Spark 集群中,有一个节点负责中央协调,调度各个分布式工做节点。这个中央协调节点被称为驱动器(Driver)节点,与之对应的工做节点被称为执行器(executor)节点。驱动器节点能够和大量的执行器节点进行通讯,它们也都做为独立的 Java 进程运行。驱动器节点和全部的执行器节点一块儿被称为一个 Spark 应用(application)。网络
Spark 应用经过一个叫做集群管理器(Cluster Manager)的外部服务在集群中的机器上启动。Spark 自带的集群管理器被称为独立集群管理器。Spark 也能运行在 Hadoop YARN 和Apache Mesos 这两大开源集群管理器上。架构
Spark 驱动器是执行你的程序中的 main() 方法的进程。它执行用户编写的用来建立SparkContext、建立 RDD,以及进行 RDD 的转化操做和行动操做的代码。其实,当你启动 Spark shell 时,你就启动了一个 Spark 驱动器程序(相信你还记得,Spark shell 老是会预先加载一个叫做 sc 的 SparkContext 对象)。驱动器程序一旦终止,Spark 应用也就结束了。app
驱动器程序在 Spark 应用中有下述两个职责。
• 把用户程序转为任务
Spark 驱动器程序负责把用户程序转为多个物理执行的单元,这些单元也被称为任务(task)。从上层来看,全部的 Spark 程序都遵循一样的结构:程序从输入数据建立一系列 RDD,再使用转化操做派生出新的 RDD,最后使用行动操做收集或存储结果 RDD中的数据。
Spark 程序实际上是隐式地建立出了一个由操做组成的逻辑上的有向无环图(Directed Acyclic Graph,简称 DAG)。当驱动器程序运行时,它会把这个逻辑图转为物理执行计划。
Spark 会对逻辑执行计划做一些优化,好比将连续的映射转为流水线化执行,将多个操做合并到一个步骤中等。这样 Spark 就把逻辑计划转为一系列步骤(stage)。而每一个步骤又由多个任务组成。这些任务会被打包并送到集群中。任务是 Spark 中最小的工做单元,用户程序一般要启动成百上千的独立任务。
• 为执行器节点调度任务
有了物理执行计划以后,Spark 驱动器程序必须在各执行器进程间协调任务的调度。执行器进程启动后,会向驱动器进程注册本身。所以,驱动器进程始终对应用中全部的执行器节点有完整的记录。每一个执行器节点表明一个可以处理任务和存储 RDD 数据的进程。
Spark 驱动器程序会根据当前的执行器节点集合,尝试把全部任务基于数据所在位置分配给合适的执行器进程。当任务执行时,执行器进程会把缓存数据存储起来,而驱动器进程一样会跟踪这些缓存数据的位置,而且利用这些位置信息来调度之后的任务,以尽可能减小数据的网络传输。
驱动器程序会将一些 Spark 应用的运行时的信息经过网页界面呈现出来,默认在端口4040 上。好比,在本地模式下,访问 http://localhost:4040 就能够看到这个网页了。分布式
Spark 执行器节点是一种工做进程,负责在 Spark 做业中运行任务,任务间相互独立。Spark 应用启动时,执行器节点就被同时启动,而且始终伴随着整个 Spark 应用的生命周期而存在。若是有执行器节点发生了异常或崩溃,Spark 应用也能够继续执行。执行器进
程有两大做用:第一,它们负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程;第二,它们经过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。RDD 是直接缓存在执行器进程内的,所以任务能够在运行时充分利用缓存数据加速运算。
在本地模式下,Spark 驱动器程序和各执行器程序在同一个 Java 进程中运行。这是一个特例;执行器程序一般都运行在专用的进程中。工具
不论你使用的是哪种集群管理器,你均可以使用 Spark 提供的统一脚本 spark-submit 将你的应用提交到那种集群管理器上。经过不一样的配置选项, spark-submit 能够链接到相应的集群管理器上,并控制应用所使用的资源数量。在使用某些特定集群管理器时, spark-submit 也能够将驱动器节点运行在集群内部(好比一个 YARN 的工做节点)。但对于其余的集群管理器,驱动器节点只能被运行在本地机器上。oop
在集群上运行 Spark 应用的详细过程大数据
(1) 用户经过 spark-submit 脚本提交应用。
(2) spark-submit 脚本启动驱动器程序,调用用户定义的 main() 方法。
(3) 驱动器程序与集群管理器通讯,申请资源以启动执行器节点。
(4) 集群管理器为驱动器程序启动执行器节点。
(5) 驱动器进程执行用户应用中的操做。根据程序中所定义的对 RDD 的转化操做和行动操做,驱动器节点把工做以任务的形式发送到执行器进程。
(6) 任务在执行器程序中进行计算并保存结果。
(7) 若是驱动器程序的 main() 方法退出,或者调用了 SparkContext.stop() ,驱动器程序会终止执行器进程,而且经过集群管理器释放资源。优化
Spark 为各类集群管理器提供了统一的工具来提交做业,这个工具是 spark-submit 。在调用 spark-submit 时除了脚本或 JAR 包的名字以外没有别的参数,那么这个 Spark程序只会在本地执行。当咱们但愿将应用提交到 Spark 独立集群上的时候,除了脚本或 JAR 包的名字以外还必须有别的参数。例如:
bin/spark-submit --master spark://host:7077 --executor-memory 10g my_script.py
--master 标记指定要链接的集群 URL;下表给出了spark-submit 的 --master 标记能够接收的值
除了集群 URL, spark-submit 还提供了各类选项,可让你控制应用每次运行的各项细节。这些选项主要分为两类。第一类是调度信息,好比你但愿为做业申请的资源量。第二类是应用的运行时依赖,好比须要部署到全部工做节点上的库和文件。下面列出 spark-submit 的一些常见标记。
还能够运行 spark-submit --help 列出全部能够接收的标记。
Spark 能够运行在各类集群管理器上,并经过集群管理器访问集群中的机器。若是你只想在一堆机器上运行 Spark,那么自带的独立模式是部署该集群最简单的方法。然而,若是你有一个须要与别的分布式应用共享的集群(好比既能够运行 Spark 做业又能够运行Hadoop MapReduce 做业),Spark 也能够运行在两个普遍使用的集群管理器——HadoopYARN 与 Apache Mesos 上面。最后,在把 Spark 部署到 Amazon EC2 上时,Spark 有个自带的脚本能够启动独立模式集群以及各类相关服务。
Spark 所支持的各类集群管理器为咱们提供了部署应用的多种选择。若是你须要从零开始部署,正在权衡各类集群管理器,咱们推荐以下一些准则。
• 若是是从零开始,能够先选择独立集群管理器。独立模式安装起来最简单,并且若是你只是使用 Spark 的话,独立集群管理器提供与其余集群管理器彻底同样的所有功能。
• 若是你要在使用 Spark 的同时使用其余应用,或者是要用到更丰富的资源调度功能(例如队列),那么 YARN 和 Mesos 都能知足你的需求。而在这二者中,对于大多数Hadoop 发行版来讲,通常 YARN 已经预装好了。
• Mesos 相对于 YARN 和独立模式的一大优势在于其细粒度共享的选项,该选项能够将相似 Spark shell 这样的交互式应用中的不一样命令分配到不一样的 CPU 上。所以这对于多用户同时运行交互式 shell 的用例更有用处。
• 在任什么时候候,最好把 Spark 运行在运行 HDFS 的节点上,这样能快速访问存储。你能够自行在一样的节点上安装 Mesos 或独立集群管理器。若是使用 YARN 的话,大多数发行版已经把 YARN 和 HDFS 安装在了一块儿。
这篇博文主要来自《Spark快速大数据分析》这本书里面的第七章,内容有删减。