在集群上运行Spark

1 Spark运行时架构

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

1.1 驱动器节点

Spark驱动器是执行你的程序中的 main() 方法的进程。它执行用户编写的用来创建 SparkContext、创建 RDD,以及进行 RDD 的转化操作和行动操作的代码。Spark 驱动器程序负责把用户程序转为多个物理执行的单元,这些单元也被称为任务 (task)。Spark 程序其实是隐式地创建出了一个由操作组成的逻辑上的有向无环图
(Directed Acyclic Graph,简称 DAG)
。当驱动器程序运行时,它会把这个逻辑图转为物理执行计划。Spark 会对逻辑执行计划作一些优化,比如将连续的映射转为流水线化执行,将多个操作合并到一个步骤中等。这样 Spark 就把逻辑计划转为一系列步骤(stage)。而每个步骤又由多个任务组成。这些任务会被打包并送到集群中。任务是Spark中最小的工作单元,用户程序通常要启动成百上千的独立任务。

1.2 执行器节点

Spark执行器节点是一种工作进程,负责在Spark作业中运行任务,任务间相互独立。如果有执行器节点发生了异常或崩溃,Spark 应用也可以继续执行。执行器进程有两大作用:第一,它们负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程; 第二,它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD提供内存式存储。RDD 是直接缓存在执行器进程内的,因此任务可以在运行时充分利用缓存数据加速运算。

1.3 集群管理器

Spark依赖于集群管理器来启动执行器节点,而在某些特殊情况下,也依赖集群管理器来启动驱动器节点。集群管理器是Spark中的可插拔式组件。这样,除了Spark自带的独立集群管理器,Spark也可以运行在其他外部集群管理器上,比如YARN和Mesos。

1.4 启动一个程序

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

1.5 小结

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

2 使用spark-submit部署应用

如下是使用 spark-submit 提交 Python 程序的简单示例:

bin/spark-submit my_script.py

如果在调用 spark-submit 时除了脚本或 JAR 包的名字之外没有别的参数,那么这个 Spark 程序只会在本地执行。如下是spark-submit的一些常见标记:
在这里插入图片描述

3 打包代码与依赖

通常用户程序则需要依赖第三方的库。如果你的程序引入了任何既不在 org.apache.spark 包内也不属于语言运行 时的库的依赖,你就需要确保所有的依赖在该 Spark 应用运行时都能被找到。对于 Python 用户而言,有多种安装第三方库的方法。由于 PySpark 使用工作节点机器上已有的 Python 环境,你可以通过标准的 Python 包管理器(比如 pip 和 easy_install)直接在集群中的所有机器上安装所依赖的库,或者把依赖手动安装到 Python 安装目录下的 site- packages/ 目录中。你也可以使用== spark-submit 的 --py-Files 参数提交独立的库==,这样它们也会被添加到 Python 解释器的路径中。如果你没有在集群上安装包的权限,可以手动添加依赖库,这也很方便,但是要防范与已经安装在集群上的那些包发生冲突。

4 Spark应用内与应用间调度

在现实中,许多集群是在多个用户间共享的。在调度多用户集群时,Spark 主要依赖集群管理器来在 Spark 应用间共享资源。当 Spark 应用向集群管理器申请执行器节点时,应用收到的执行器节点个数可能比它申请的更多或者更少,这取决于集群的可用性与争用。许多集群管理器支持队列,可以为队列定义不同优先级或容量限制,这样 Spark 就可以把作业提交到相应的队列中。Spark应用有一种特殊情况,就是那些长期运行(long lived)的应用。这意味着这些应用从不主动退出。Spark SQL 中的 JDBC 服务器就是一个长期运行的 Spark 应用。当 JDBC 服务器启动后,它会从集群管理器获得一系列执行器节点,然后就成为用户提交 SQL 查询 的永久入口。

5 集群管理器

Spark 可以运行在各种集群管理器上,并通过集群管理器访问集群中的机器。如果你只想在一堆机器上运行 Spark,那么自带的独立模式是部署该集群最简单的方法。然而,如果你有一个需要与别的分布式应用共享的集群(比如既可以运行 Spark 作业又可以运行 Hadoop MapReduce 作业),Spark 也可以运行在两个广泛使用的集群管理器——Hadoop YARN 与 Apache Mesos 上面。最后,在把 Spark 部署到 Amazon EC2上时,Spark 有个自带的脚本可以启动独立模式集群以及各种相关服务。

6 总结

本章描述了 Spark 应用的运行时架构,它是由一个驱动器节点和一系列分布式执行器节点组成的。之后本章讲了如何构建、打包 Spark 应用并向集群提交执行。

猜你喜欢

转载自blog.csdn.net/BGoodHabit/article/details/121988815
今日推荐