《Spark指南》二、 独立模式

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

除了运行在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 PORT web UI 服务使用的端口,master服务默认使用8080,worker服务默认使用8081
-c CORES, --cores CORES Spark应用程序允许使用的CPU数量,默认是所有的CPU,该参数仅对worker配置有效
-m MEM, --memory MEM Spark应用程序允许使用的内存大小,格式形如1000M或2G,默认情况是机器所有内存减去1G,该参数仅对worker有效
-d DIR, --work-dir DIR Spark服务的暂存空间目录和作业的logs输出目录,默认是SPARK_HOME/work,该参数仅对worker有效
--properties-file FILE Spark配置文件加载的文件路径,默认是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_OPTS master主机的额外配置,形如“-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_DIR Spark应用程序使用的暂存空间目录,用于存放日志等,默认是SPARK_HOME/work
SPARK_WORKER_OPTS worker主机的额外配置,形如“-Dx=y”,默认是空,后文会进一步列举
SPARK_DAEMON_MEMORY 分配给Spark master和worker镜像进程自身的内存,默认是1g
SPARK_DAEMON_JAVA_OPTS Spark master和worker镜像进程使用的JVM配置,默认是空
SPARK_PUBLIC_DNS Spark master和worker机器的公共的DNS主机名,默认是空

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

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

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

相关的文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容