文档章节

《Spark指南》二、 独立模式

苏伟杰
 苏伟杰
发布于 2017/02/25 21:26
字数 4173
阅读 3
收藏 0

本文主要翻译至链接且不局限于该文内容,也加入了笔者实践内容,翻译水平有限,欢迎指正,转载请注明出处。

除了运行在Mesos和YARN集群管理模式上,Spark也支持简单的独立部署模式。你可以通过手工启动一个master进程(主管理进程)和若干workers进程(工作者进程)或者使用脚本两种方式来启动一个独立模式的集群。独立模式允许在其他机器上运行这些镜像,并进行测试。

安装

你可以通过已经构件好的各个发布版来安装Spark,也可以按照这个教程自己完成构建。

笔者下载了spark-2.1.0-bin-hadoop2.7发布版,解压之后的目录如下:

spark-2.1.0-bin-hadoop2.7发布版目录

启动

你可以通过如下命令启动一个独立模式的master服务:

./sbin/start-master.sh

启动后,master服务会打印出服务地址(后文中使用master-spark-URL来表示这个地址),形如spark://HOST:PORT,该地址就是workers服务连接的地址,执行作业时传递给SparkContext的“master”参数,也是这个地址。你还可以通过访问“http://localhost:8080” (默认,后文中使用master web UI来表示)来查看spark集群的基本情况,在上面你也可以找到spark master服务的地址,形如:

Spark master服务的web UI界面

类似地,你也可以通过如下命令来启动一个或若干个连接到master服务的workers进程(一台机器只能启动一个worker进程):

./sbin/start-slave.sh <master-spark-URL>

一旦你启动了一个worker,你就可以在master web UI中找到这个进程信息,还包括这个进程使用的CPU、内存(系统的内存中为操作系统留出了1G)等信息,笔者上文的截图中,你就可以看到有一个worker连接到了master服务。 下表列举了所有可以传递给master和worker服务的配置选项:

参数含义
-h HOST, --host HOST监听的主机名
-i HOST, --ip HOST监听的主机名(已废弃,使用-h或--host代替)
-p PORT, --port PORT服务监听的端口(master服务默认是7077,worker服默认是随机端口)
--webui-port PORTweb UI 服务使用的端口,master服务默认使用8080,worker服务默认使用8081
-c CORES, --cores CORESSpark应用程序允许使用的CPU数量,默认是所有的CPU,该参数仅对worker配置有效
-m MEM, --memory MEMSpark应用程序允许使用的内存大小,格式形如1000M或2G,默认情况是机器所有内存减去1G,该参数仅对worker有效
-d DIR, --work-dir DIRSpark服务的暂存空间目录和作业的logs输出目录,默认是SPARK_HOME/work,该参数仅对worker有效
--properties-file FILESpark配置文件加载的文件路径,默认是conf/spark-defaults.conf

集群执行脚本

使用脚本运行一个独立模式集群前,需要先创建一个SPARK_HOME/conf/slaves文件,该文件包含你想启动的所有worker所在的机器配置,每一条一行。如果conf/slaves文件不存在,spark会默认在本机启动一个worker进程,可以用这个worker来做测试。注意,master所在的机器使用ssh来访问其他worker机器。默认情况下,ssh并行访问worker机器,并且这些机器需要安装免密模式(使用私钥来登录)。如果你没有安装免密模式,你可以通过设置环境变量SPARK_SSH_FOREGROUND来连续提供每个worker的密码。

一旦你创建和编辑好了slaves文件,你就可以通过下面这些脚本来运行Spark,这些脚本在SPARK_HOME/sbin目录中可以找到,他们都是基于Hadoop的部署脚本:

  • sbin/start-master.sh - 在该脚本所执行的机器上启动一个master实例
  • sbin/start-slaves.sh - 根据conf/slaves机器的配置,启动每一个worker实例
  • sbin/start-slave.sh - 在该脚本所执行的机器上启动一个worker实例
  • sbin/start-all.sh - 启动一个master实例和一系列的worker实例(slaves中配置的实例)
  • sbin/stop-master.sh - 停止master实例
  • sbin/stop-slaves.sh - 以此停止slaves上配置的所有机器上的worker实例
  • sbin/stop-all.sh - 停止master实例和所有worker实例

注意这些脚本都应该在在你想要作为master实例的机器上执行,不是你的本机。

你可以进一步通过在SPARK_HOME/conf/spark-env.sh文件中配置如下这些环境变量来更改集群的设置,你可以以SPARK_HOME/conf/spark-env.sh.template文件为模板来创建配置文件,然后拷贝到所有的worker机器以使这些配置生效:

参数含义
SPARK_MASTER_HOST指定master所在的主机名或地址,必须是一个网络可达的地址
SPARK_MASTER_PORT指定master进程的端口,默认是7077,有不同的话必须配置
SPARK_MASTER_WEBUI_PORT指定master web UI的端口,默认是8080,有不同的话必须配置
SPARK_MASTER_OPTSmaster主机的额外配置,形如“-Dx=y”,默认是空,后文会进一步列举
SPARK_LOCAL_DIRS指定Spark暂存目录,用于存储在磁盘上的map输出文件和RDDs,它最好应该是一个本地可以快速访问的磁盘,可以通过逗号分隔不同磁盘上的多个目录
SPARK_WORKER_CORES允许Spark应用程序使用的CPU总数,默认是所有都可用
SPARK_WORKER_MEMORY允许Spark应用程序使用的内存总量,例如1000m,2g,默认是该机器的内存总量减去1G;注意每个Spark应用程序独立的内存使用spark.executor.memory属性来配置
SPARK_WORKER_PORT指定worker启动的端口,默认是随机端口
SPARK_WORKER_WEBUI_PORT指定worker在web UI中的端口,默认是8081
SPARK_WORKER_DIRSpark应用程序使用的暂存空间目录,用于存放日志等,默认是SPARK_HOME/work
SPARK_WORKER_OPTSworker主机的额外配置,形如“-Dx=y”,默认是空,后文会进一步列举
SPARK_DAEMON_MEMORY分配给Spark master和worker镜像进程自身的内存,默认是1g
SPARK_DAEMON_JAVA_OPTSSpark master和worker镜像进程使用的JVM配置,默认是空
SPARK_PUBLIC_DNSSpark master和worker机器的公共的DNS主机名,默认是空

注意,上述这些脚本不支持在Windows中执行,如果要再Windows系统中使用Spark集群,请手工启动master和workers。

SPARK_MASTER_OPTS属性支持如下这些配置:

参数默认值含义
spark.worker.cleanup.enabledfalse开启后将会周期性自动清理worker中的Spark应用程序目录,注意该属性只在独立模式下有效,YARN使用不同的工作模式,并且只有停止运行的应用程序会被清理
spark.worker.cleanup.interval1800(30分钟))自动清理的时间周期,以秒为单位
spark.worker.cleanup.appDataTtl7243600(7天)每个worker实例为应用程序工作目录保留的时间,以s为单位,这是一个存留时间,且应该取决于你的磁盘空间可用量。应用程序在执行时将会下载所需的jars文件和产生日志,随着时间的推移,磁盘可能很快会被占满,特别是当你频繁提交和执行应用程序的时候
spark.worker.ui.compressedLogFileLengthCacheSize100(比较费解),对于压缩的日志文件,只能通过解压缩文件来计算未压缩文件,Spark缓存了压缩日志文件的未压缩文件大小,本属性用于控制缓存大小

连接应用程序到集群

在Spark集群上运行一个应用程序,只要通过为SparkContext构造器传递master实例所在的URL即可,改地址即spark://IP:PORT。

可以通过如下命令来使用可交互的Spark shell环境控制集群:

./bin/spark-shell --master spark://IP:PORT

上述命令中可以传递选项--total-executor-cores <numCores>来控制spark-shell使用的CPU数。

运行Spark应用程序

spark-submit脚本提供了一个最直接的方式来提交已编译的Spark应用程序,对于独立模式的集群,Spark目前支持两种部署模式。1)使用client模式,则驱动程序运行在该客户端所在的进程上,2)使用cluster模式,则驱动程序运行在集群里的某一个worker进程上,且该客户端进程在提交应用程序之后就会退出,不会等等应用程序的执行。

如果你的应用程序通过Spark submit提交,该程序运行所需的jars文件都会自动部署到所有worker节点。对于你的应用程序依赖的其他附加jars文件,都可以通过 --jars 标识引入(多个jars文件使用英文逗号间隔,例如 --jars jar1,jar2)。更改应用程序配置和执行环境的方式,可以参考链接

此外,独立cluster模式支持自动重启应用程序,如果该程序是以非零值退出。如果要使用这个特征,你可以在以spark-submit命令启动你的应用程序时传递 --supervice 标记。如果你想杀掉一个重复失败的应用程序,你可以执行如下指令:

./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>

其中的dirver ID,你可以在master web UI(地址:http://<master url>:8080)上找到。

资源调度

在提交的多个应用程序中,独立cluster模式目前只支持简单的FIFO调度方式。然而,为了允许多个应用程序并发执行,你可以通过修改每个应用程序使用的最大资源来控制。默认情况下,它将获得及群里的所有CPU资源,这意味着一次只能执行一个应用程序。你可以在传递给SparkContext的SparkConf类实例中覆盖 spark.cores.max属性来修改这一限制,例如:

val conf = new SparkConf()
  .setMaster(...)
  .setAppName(...)
  .set("spark.cores.max", "10")
val sc = new SparkContext(conf)

此外,你还可以配置master服务上的spark.deploy.defaultCores环境变量来修改默认值,而不用每次都给应用程序传递spark.cores.max值。在 conf/spark-env.sh文件后追加一行如下配置:

export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"

监控和日志

Spark的独立模式提供了一个web交互界面来控制集群,master服务和每一个worker都有自己的ui界面以方便查看集群状态和作业的统计。默认情况下,可以访问master主机的8080端口(该端口可以通过前文所述的命令行参数方式修改)进入该界面,前文的截图中可以看到类似的界面。

此外,作业运行的日志将会打印在每台worker机器的工作目录上(默认是SPARK_HOME/work目录)。你会看到每个作业有两个日志文件,stdout和stderr,他们将输出作业打印到控制台的所有信息。

与Hadoop一起运行

你可以让Spark与一个已存在的Hadoop集群一起工作,只要在相同的机器上再启动单独的进程。如果想从Spark访问Hadoop的数据,只要使用该数据在HDFS系统上的地址(正常是形如hdfs://<namenode>:9000,具体的地址你可以在Hadoop Namenode的web界面上找到)。或者,你可以在独立的集群上安装Spark,然后通过网络访问HDFS系统上的数据,当然这会比上一种方式更慢,因为数据的传输需要经过网络(如果你是在同一个本地局域网内,数据的传输速度可能也不会太慢,例如你可以将部分Spark机器安装在与Hadoop同一个机架上,这样它的副本就可以被快速访问)。

配置网络安全

Spark会重度依赖网络,而一些环境对使用严格的防火墙设置有着严格的要求。你可以在这个链接中查看完整的配置。

高可用性

默认情况下,独立模式对worker故障具有弹性(Spark自身对无法工作的弹性是通过将它移到其他的worker上)。然而,这个过程需要使用一个Master服务来进行调度决策,于是存在一个单点故障的可能:如果Master服务崩溃了,新的应用程序将无法创建。为了保证可用性,Spark提供了如下两种策略:

使用ZooKeeper的备用master

概述

通过利用Zookeeper来提供leader选举和一些状态存储,你可以在Spark集群内运行多个master服务,并将它们连接到同一个zookeeper实例。这些master服务的其中一个将被选举为“leader”提供服务,其他的则作为备用运行。如果当前的leader挂了,zookeeper会选举一个新的master服务来充当leader,并应用老master的状态,然后新的master服务将会重新提供调度服务。整个恢复过程大概花费1到2分钟,时间从master服务挂了开始算起。注意,这个延时只会影响新应用程序的调度,在老master挂了期间已经提交执行的应用程序不会受到影响。

关于Zookeeper,可以参考这里

配置

你可以通过设置spark-env中的SPARK_DAEMON_JAVA_OPTS属性来启用恢复模式,方式是修改 spark.deploy.recoveryMode 和相关的spark.deploy.zookeeper.*配置,详细的配置请参考这里

注意:在多master方式运行下,如果你没有正确的配置zookeeper属性,他们无法正常恢复工作,因为所有的master都会认为自己是leader,也会单独进行调度,造成错误的集群状态。

细节

当你安装了Zookeeper集群后,启用高可用性就变得很简单。只要使用相同的Zookeeper配置(包括Zookeeper目录和URL)来启动多个master服务。master服务可以随时添加和移除。

为了调度新的应用程序,或者添加新的worker,他们得知道当前leader的IP地址,解决方式是传递一个master地址列表而不是只传一个,例如,你可以在SparkContext上下文中指定master地址为 spark://host1:port1,host2:port2。SparkContext会尝试注册所有的master,如果host1挂了,host2也能被正确发现。

“注册到Master服务”与普通操作之间有个很重要的特性。当应用程序或worker启动时,他们需要能够找到和注册到当前的lead master,一旦成功注册,他们就会被存到Zookeeper中,一旦出现故障,新的leader会联系之前注册的应用程序和workers去更新leader已变更的信息,而在新的master启动期间,他们无需知道他的存在。

由于这个特质,新的master可以在任意时间创建,你唯一需要担心的是当新的应用程序或workers启动时能够找到成为leader的master并成功注册。

使用本地文件系统进行单点恢复

概述

使用zookeeper是生产环境下保证高可用性的最好方式,但是如果你只想重启一下挂掉的master服务,也可以使用本地的文件系统进行恢复。当注册应用程序和workers时,他们的状态将被记录到指定的暂存目录中,使得master重启时可以通过这些状态文件恢复他们的状态。

配置

通过在spark-env中设置SPARK_DAEMON_JAVA_OPTS属性可以激活这一模式,相关配置如下:

系统属性含义
spark.deploy.recoveryMode设置为FILESYSTEM可以开启单机恢复模式,默认不启用
spark.deploy.recoveryDirectory该目录将用来存储master恢复状态

细节

  • 这个方案可以与一个进行监控器例如monit一起工作,也可以只简单的通过重启来恢复。
  • 虽然文件系统恢复模式比不适用任何恢复模式要好,但是在开发或者实验环境下建议不必启用。使用stop-master.sh脚本停止一个master服务时,Spark不会清空任何恢复状态,因此当重启一个master服务时,它将进入恢复模式,如果他需要等待所有之前的worker/clients超时,就会显著的增加系统启动的时间(接近一分钟)。
  • 虽然不是官方支持,但是你可以挂在一个NFS(网络文件系统)目录来作为恢复目录,如果master挂了,你可以在一个新的节点上启动master,这样也可以恢复所有workers和应用程序的状态(等价于Zookeeper恢复)。但是新的应用程序必须能够找到这个新的master。

© 著作权归作者所有

苏伟杰
粉丝 0
博文 3
码字总数 8551
作品 0
朝阳
程序员
私信 提问
Spark Streaming入门

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文将帮助您使用基于HBase的Apache Spark Streaming。Spark Streaming是Spark API核心的一个扩展,支持连续的数据流处理。 什么...

腾讯云加社区
2018/05/16
0
0
MaxCompute Spark开发指南

概述 本文档面向需要使用MaxCompute Spark进行开发的用户使用。本指南主要适用于具备有Spark开发经验的开发人员。 MaxCompute Spark是MaxCompute提供的兼容开源的Spark计算服务,它在统一的计...

zhaowei121
03/11
9
0
Spark 学习资源收集【Updating】

(一)spark 相关安装部署、开发环境 1、Spark 伪分布式 & 全分布式 安装指南 http://my.oschina.net/leejun2005/blog/394928 2、Apache Spark探秘:三种分布式部署方式比较 http://dongxic...

大数据之路
2014/09/08
5K
0
Spark 独立部署模式

除了在 Mesos 或 YARN 集群上运行之外, Spark 还提供一个简单的独立部署的模块。你通过手动开始master和workers 来启动一个独立的集群。你也可以利用我们提供的脚本 .它也可以运行这些进程在...

vincent_hv
2013/10/14
6.1K
2
【Spark】Spark Quick Start(快速入门翻译)

本文主要是翻译Spark官网Quick Start。只能保证大概意思,尽量保证细节。英文水平有限,如果有错误的地方请指正,轻喷 目录导航在右上角,感谢两个大佬(孤傲苍狼 JavaScript自动生成博文目录...

跑呀跑
2018/09/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
今天
5
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
16
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
9
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部