1 集群管理器
Spark 可以运行在各种集群管理器上,并通过集群管理器访问集群中的机器。如果你只想在一堆机器上运行Spark,那么自带的独立模式是部署该集群最简单的方法。然而,如果你有一个需要与别的分布式应用共享的集群(比如既可以运行Spark 作业又可以运行Hadoop MapReduce 作业),Spark 也可以运行在两个广泛使用的集群管理器——Hadoop YARN 与Apache Mesos 上面。
1.1 独立集群管理器
Spark 独立集群管理器提供在集群上运行应用的简单方法。这种集群管理器由一个主节点(Master)和几个工作节点(Worker)组成,各自都分配有一定量的内存和CPU 核心。当提交应用时,你可以配置执行器进程(Executor)使用的内存量,以及所有执行器进程使用的CPU 核心总数。
启动独立集群管理器
要启动独立集群管理器,你既可以通过手动启动一个主节点和多个工作节点来实现,也可以使用Spark 的sbin 目录中的启动脚本来实现。启动脚本使用最简单的配置选项,但是需要预先设置机器间的SSH 无密码访问。
要使用集群启动脚本,请按如下步骤执行。
(1) 将编译好的Spark 复制到所有机器的一个相同的目录下,比如/home/yourname/spark。
(2) 设置好从主节点机器到其他机器的SSH 无密码登陆。这需要在所有机器上有相同的用户账号,并在主节点上通过ssh-keygen 生成SSH 私钥,然后将这个私钥放到所有工作节点的.ssh/authorized_keys 文件中。如果你之前没有设置过这种配置,你可以使用如下命令:
# 在主节点上:运行ssh-keygen并接受默认选项
$ ssh-keygen -t dsa
Enter file in which to save the key (/home/you/.ssh/id_dsa): [回车]
Enter passphrase (empty for no passphrase): [空]
Enter same passphrase again: [空]
# 在工作节点上:
# 把主节点的~/.ssh/id_dsa.pub文件复制到工作节点上,然后使用:
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ chmod 644 ~/.ssh/authorized_keys
(3) 编辑主节点的conf/slaves 文件并填上所有工作节点的主机名。
(4) 在主节点上运行sbin/start-all.sh(要在主节点上运行而不是在工作节点上)以启动集群。如果全部启动成功,你不会得到需要密码的提示符,而且可以在http://masternode:8080看到集群管理器的网页用户界面,上面显示着所有的工作节点。
(5) 要停止集群,在主节点上运行bin/stop-all.sh。
默认情况下,集群管理器会选择合适的默认值自动为所有工作节点分配CPU 核心与内
存。
提交应用
要向独立集群管理器提交应用,需要把spark://masternode:7077 作为主节点参数传给
spark-submit。例如:
spark-submit --master spark://masternode:7077 yourapp
你可以使用–master 参数以同样的方式启动spark-shell 或pyspark,来连接到该集群上:
spark-shell --master spark://masternode:7077
pyspark --master spark://masternode:7077
要检查你的应用或者shell 是否正在运行,你需要查看集群管理器的网页用户界面http://
masternode:8080 并确保:(1)应用连接上了(即出现在了Running Applications 中);(2)列出的所使用的核心和内存均大于0。
阻碍应用运行的一个常见陷阱是为执行器进程申请的内存(spark-submit 的–executor-memory 标记传递的值)超过了集群所能提供的内存总量。在这种情况下,独立集群管理器始终无法为应用分配执行器节点。请确保应用申请的值能够被集群接受。
最后,独立集群管理器支持两种部署模式。在这两种模式中,应用的驱动器程序运行在不同的地方。在客户端模式中(默认情况),驱动器程序会运行在你执行spark-submit 的机器上,是spark-submit 命令的一部分。这意味着你可以直接看到驱动器程序的输出,也可以直接输入数据进去(通过交互式shell),但是这要求你提交应用的机器与工作节点间有很快的网络速度,并且在程序运行的过程中始终可用。相反,在集群模式下,驱动器程序会作为某个工作节点上一个独立的进程运行在独立集群管理器内部。它也会连接主节点来申请执行器节点。在这种模式下,spark-submit 是“一劳永逸”型,你可以在应用运行时关掉你的电脑。你还可以通过集群管理器的网页用户界面访问应用的日志。向sparksubmit传递–deploy-mode cluster 参数可以切换到集群模式。
配置资源用量
如果在多应用间共享Spark 集群,你需要决定如何在执行器进程间分配资源。独立集群
管理器使用基础的调度策略,这种策略允许限制各个应用的用量来让多个应用并发执行。Apache Mesos 支持应用运行时的更动态的资源共享,而YARN 则有分级队列的概念,可以让你限制不同类别的应用的用量。
在独立集群管理器中,资源分配靠下面两个设置来控制。
- 执行器进程内存
可以通过spark-submit 的–executor-memory 参数来配置此项。每个应用在每个工作节点上最多拥有一个执行器进程(虽然一个从节点只能运行一个执行器进程,但是一台机器上可以运行多个从节点),因此这个设置项能够控制执行器节点占用工作节点的多少内存。此设置项的默认值是1 GB,在大多数服务器上,你可能需要提高这个值来充分利用机器。 - 占用核心总数的最大值
这是一个应用中所有执行器进程所占用的核心总数。此项的默认值是无限。也就是说,应用可以在集群所有可用的节点上启动执行器进程。对于多用户的工作负载来说,你应该要求用户限制他们的用量。
你可以通过spark-submit 的–total-executorcores 参数设置这个值,或者在你的Spark 配置文件中设置spark.cores.max 的值。
要验证这些设定,你可以从独立集群管理器的网页用户界面(http://masternode:8080)中查看当前的资源分配情况。
最后,独立集群管理器在默认情况下会为每个应用使用尽可能分散的执行器进程。例如,假设你有一个20 个物理节点的集群,每个物理节点是一个四核的机器,然后你使用–executor-memory 1G 和–total-executor-cores 8 提交应用。这样Spark 就会在不同机器上启动8 个执行器进程,每个1 GB 内存。Spark 默认这样做,以尽量实现对于运行在相同机器上的分布式文件系统(比如HDFS)的数据本地化,因为这些文件系统通常也把数据分散到所有物理节点上。
如果你愿意,可以通过设置配置属性spark.deploy.spreadOut为false 来要求Spark 把执行器进程合并到尽量少的工作节点中。在这样的情况下,前面那个应用就只会得到两个执行器节点,每个有1 GB 内存和4 个核心。这一设定会影响运行在独立模式集群上的所有应用,并且必须在启动独立集群管理器之前设置好。
1.2 Hadoop YARN
YARN 是在Hadoop 2.0 中引入的集群管理器,它可以让多种数据处理框架运行在一个共享的资源池上,并且通常安装在与Hadoop 文件系统(简称HDFS)相同的物理节点上。在这样配置的YARN 集群上运行Spark 是很有意义的,它可以让Spark 在存储数据的物理节点上运行,以快速访问HDFS 中的数据。
提交应用
在Spark 里使用YARN 很简单:你只需要设置指向你的Hadoop 配置目录的环境变量,然后使用spark-submit 向一个特殊的主节点URL 提交作业即可。
第一步是找到你的Hadoop 的配置目录,并把它设为环境变量HADOOP_CONF_DIR。这个目录包含yarn-site.xml 和其他配置文件;如果你把Hadoop 装到HADOOP_HOME 中,那么这个目录通常位于HADOOP_HOME/conf 中,否则可能位于系统目录/etc/hadoop/conf 中。然后用如下方式提交你的应用:
export HADOOP_CONF_DIR="..."
spark-submit --master yarn yourapp
和独立集群管理器一样,有两种将应用连接到集群的模式:客户端模式以及集群模式。在客户端模式下应用的驱动器程序运行在提交应用的机器上(比如你的笔记本电脑),而在集群模式下,驱动器程序也运行在一个YARN 容器内部。你可以通过spark-submit 的–master标记的yarn-client和yarn-cluster 参数设置不同的模式。
Spark 的交互式shell 以及pyspark 也都可以运行在YARN 上。只要设置好HADOOP_CONF_DIR 并对这些应用使用–master yarn 参数即可。注意,由于这些应用需要从用户处获取输入,所以只能运行于客户端模式下。
配置资源用量
当在YARN 上运行时,根据你在spark-submit 或spark-shell 等脚本的–num-executors
标记中设置的值,Spark 应用会使用固定数量的执行器节点。默认情况下,这个值仅为2,所以你可能需要提高它。你也可以通过–executor-memory 设置每个执行器的内存用量,通过–executor-cores 设置每个执行器进程从YARN 中占用的核心数目。对于给定的硬件资源,Spark 通常在用量较大而总数较少的执行器组合(使用多核与更多内存)上表现得更好,因为这样Spark 可以优化各执行器进程间的通信。然而,需要注意的是,一些集群限制了每个执行器进程的最大内存(默认为8 GB),不让你使用更大的执行器进程。
出于资源管理的目的,某些YARN 集群被设置为将应用调度到多个队列中。使用–queue选项来选择你的队列的名字。
1.3 选择合适的集群管理器
Spark 所支持的各种集群管理器为我们提供了部署应用的多种选择。如果你需要从零开始部署,正在权衡各种集群管理器,我们推荐如下一些准则。
- 如果是从零开始,可以先选择独立集群管理器。独立模式安装起来最简单,而且如果你只是使用Spark 的话,独立集群管理器提供与其他集群管理器完全一样的全部功能。
- 如果你要在使用Spark 的同时使用其他应用,或者是要用到更丰富的资源调度功能
(例如队列),那么YARN 和Mesos 都能满足你的需求。而在这两者中,对于大多数Hadoop 发行版来说,一般YARN 已经预装好了。 - Mesos 相对于YARN 和独立模式的一大优点在于其细粒度共享的选项,该选项可以将类似Spark shell 这样的交互式应用中的不同命令分配到不同的CPU 上。因此这对于多用户同时运行交互式shell 的用例更有用处。
- 在任何时候,最好把Spark 运行在运行HDFS 的节点上,这样能快速访问存储。你可以自行在同样的节点上安装Mesos 或独立集群管理器。如果使用YARN 的话,大多数发行版已经把YARN 和HDFS 安装在了一起。
参考 《Spark快速大数据分析》