在集群上运行Spark

时间:2023-03-09 17:36:51
在集群上运行Spark

Spark 可以在各种各样的集群管理器(Hadoop YARN、Apache Mesos,还有Spark 自带的独立集群管理器)上运行,所以Spark 应用既能够适应专用集群,又能用于共享的云计算环境。

在分布式环境下,Spark 集群采用的是主/ 从结构。在一个Spark 集群中,有一个节点负责*协调,调度各个分布式工作节点。这个*协调节点被称为驱动器(Driver)节点,与之对应的工作节点被称为执行器(executor)节点。驱动器节点可以和大量的执行器节点进行通信,它们也都作为独立的Java 进程运行。驱动器节点和所有的执行器节点一起被称为一个Spark 应用(application)。

在集群上运行Spark

Spark 应用通过一个叫作集群管理器(Cluster Manager)的外部服务在集群中的机器上启动。Spark 自带的集群管理器被称为独立集群管理器。Spark 也能运行在Hadoop YARN 和Apache Mesos 这两大开源集群管理器上。

驱动器节点

Spark 驱动器是执行你的程序中的main() 方法的进程。它执行用户编写的用来创建SparkContext、创建RDD,以及进行RDD 的转化操作和行动操作的代码。其实,当你启动Spark shell 时,你就启动了一个Spark 驱动器程序(spark shell 总是会预先加载一个叫作sc 的SparkContext 对象)。驱动器程序一旦终止,Spark 应用也就结束了。

驱动器程序在Spark 应用中的两个职责:

1.把用户程序转为任务。Spark 驱动器程序负责把用户程序转为多个物理执行的单元,这些单元也被称为任务(task)。从上层来看,所有的Spark 程序都遵循同样的结构:程序从输入数据创建一系列RDD,再使用转化操作派生出新的RDD,最后使用行动操作收集或存储结果RDD中的数据。Spark 程序其实是隐式地创建出了一个由操作组成的逻辑上的有向无环(Directed Acyclic Graph,简称DAG)。当驱动器程序运行时,它会把这个逻辑图转为物理执行计划。Spark 会对逻辑执行计划作一些优化,比如将连续的映射转为流水线化执行,将多个操作合并到一个步骤中等。这样Spark 就把逻辑计划转为一系列步骤(stage)。而每个步骤又由多个任务组成。这些任务会被打包并送到集群中。任务是Spark 中最小的工作单元,用户程序通常要启动成百上千的独立任务。

2.为执行器节点调度任务。有了物理执行计划之后,Spark 驱动器程序必须在各执行器进程间协调任务的调度。执行器进程启动后,会向驱动器进程注册自己。因此,驱动器进程始终对应用中所有的执行器节点有完整的记录。每个执行器节点代表一个能够处理任务和存储RDD 数据的进程。Spark 驱动器程序会根据当前的执行器节点集合,尝试把所有任务基于数据所在位置分配给合适的执行器进程。当任务执行时,执行器进程会把缓存数据存储起来,而驱动器进程同样会跟踪这些缓存数据的位置,并且利用这些位置信息来调度以后的任务,以尽量减少数据的网络传输。驱动器程序会将一些Spark 应用的运行时的信息通过网页界面呈现出来,默认在端口4040 上

不论你使用的是哪一种集群管理器,你都可以使用Spark 提供的统一脚本spark-submit 将你的应用提交到那种集群管理器上。通过不同的配置选项,spark-submit 可以连接到相应的集群管理器上,并控制应用所使用的资源数量。

在集群上运行Spark 应用的详细过程:

(1) 用户通过spark-submit 脚本提交应用。
(2) spark-submit 脚本启动驱动器程序,调用用户定义的main() 方法。
(3) 驱动器程序与集群管理器通信,申请资源以启动执行器节点。
(4) 集群管理器为驱动器程序启动执行器节点。
(5) 驱动器进程执行用户应用中的操作。根据程序中所定义的对RDD 的转化操作和行动操作,驱动器节点把工作以任务的形式发送到执行器进程。
(6) 任务在执行器程序中进行计算并保存结果。
(7) 如果驱动器程序的main() 方法退出,或者调用了SparkContext.stop(),驱动器程序会终止执行器进程,并且通过集群管理器释放资源。

使用sbt构建的用Scala编写的Spark应用

sbt 是一个通常在Scala 工程中使用的比较新的构建工具。在工程的根目录中,你要创建出一个叫作build.sbt 的构建文件,源代码则应该放在src/main/scala 中。sbt 构建文件是用配置语言写成的,在这个文件中我们把值赋给特定的键,用来定义工程的构建。例如,有一个键叫作name,是用来指定工程名字的,还有一个键叫作libraryDependencies,用来指定工程的依赖列表。