Spark独立模式
除了在Mesos或YARN集群管理器上运行外,Spark还提供了一种简单的独立部署模式。您可以手动启动独立群集,方法是手动启动主服务器,也可以使用我们提供的启动脚本。也可以在一台机器上运行这些守护进程进行测试。
将Spark Standalone安装到群集
要安装Spark Standalone模式,只需在集群上的每个节点上放置已编译的Spark版本即可。您可以在每个版本中获得预构建的Spark版本,也可以自行构建。
手动启动群集
您可以通过执行以下命令来启动独立主服务器:
./sbin/start-master.sh
一旦启动,主人将打印出一个spark://HOST:PORT
自己的URL,您可以使用该URL将工作者连接到它,或者作为“主”参数传递给SparkContext
。您还可以在master的Web UI上找到此URL,默认情况下为http:// localhost:8080。
同样,您可以启动一个或多个工作人员并通过以下方式将他们连接到主人:
./sbin/start-slave.sh <master-spark-URL>
启动工作程序后,查看master的Web UI(默认情况下为http:// localhost:8080)。您应该看到其中列出的新节点,以及CPU和内存的数量(减去操作系统剩余的1 GB)。
最后,可以将以下配置选项传递给master和worker:
论据 |
含义 |
---|
-h HOST ,--host HOST |
要收听的主机名 |
-i HOST ,--ip HOST |
要监听的主机名(不建议使用,请使用-h或--host) |
-p PORT ,--port PORT |
要监听的服务端口(默认值:7077用于主服务器,随机用于工作服务) |
--webui-port PORT |
Web UI端口(默认值:8080为master,8081为worker) |
-c CORES ,--cores CORES |
允许Spark应用程序在计算机上使用的总CPU核心数(默认值:全部可用);只对工人 |
-m MEM ,--memory MEM |
允许Spark应用程序在机器上使用的内存总量,格式为1000M或2G(默认值:机器的总RAM减去1 GB);只对工人 |
-d DIR ,--work-dir DIR |
用于临时空间和作业输出日志的目录(默认值:SPARK_HOME / work);只对工人 |
--properties-file FILE |
要加载的自定义Spark属性文件的路径(默认值:conf / spark-defaults.conf) |
群集启动脚本
要使用启动脚本启动Spark独立群集,您应该在Spark目录中创建一个名为conf / slaves的文件,该文件必须包含要启动Spark工作的所有计算机的主机名,每行一个。如果conf / slaves不存在,则启动脚本默认为单个计算机(localhost),这对测试很有用。注意,主机通过ssh访问每个工作机器。默认情况下,ssh是并行运行的,需要设置无密码(使用私钥)访问。如果您没有无密码设置,则可以设置环境变量SPARK_SSH_FOREGROUND并为每个工作人员连续提供密码。
设置此文件后,您可以使用以下shell脚本启动或停止群集,这些脚本基于Hadoop的部署脚本,并在SPARK_HOME/sbin
以下位置提供:
sbin/start-master.sh
- 在执行脚本的机器上启动主实例。
sbin/start-slaves.sh
- 在conf/slaves
文件中指定的每台计算机上启动从属实例。
sbin/start-slave.sh
- 在执行脚本的机器上启动从属实例。
sbin/start-all.sh
- 如上所述,启动主设备和多个从设备。
sbin/stop-master.sh
- 停止通过sbin/start-master.sh
脚本启动的主服务器。
sbin/stop-slaves.sh
- 停止conf/slaves
文件中指定的计算机上的所有从属实例。
sbin/stop-all.sh
- 如上所述停止主站和从站。
请注意,必须在要运行Spark主服务器的计算机上执行这些脚本,而不是本地计算机。
您可以选择通过设置环境变量来进一步配置群集conf/spark-env.sh
。通过以?开头创建此文件conf/spark-env.sh.template
,并将其复制到所有工作计算机以使设置生效。可以使用以下设置:
环境变量 |
含义 |
---|
SPARK_MASTER_HOST |
将主服务器绑定到特定的主机名或IP地址,例如公共主机名或IP地址。 |
SPARK_MASTER_PORT |
在另一个端口上启动主服务器(默认值:7077)。 |
SPARK_MASTER_WEBUI_PORT |
主Web UI的端口(默认值:8080)。 |
SPARK_MASTER_OPTS |
仅以“-Dx = y”形式应用于主服务器的配置属性(默认值:无)。请参阅下面的可能选项列表。 |
SPARK_LOCAL_DIRS |
用于Spark中“临时”空间的目录,包括映射输出文件和存储在磁盘上的RDD。这应该位于系统中的快速本地磁盘上。它也可以是不同磁盘上多个目录的逗号分隔列表。 |
SPARK_WORKER_CORES |
允许Spark应用程序在计算机上使用的核心总数(默认值:所有可用核心)。 |
SPARK_WORKER_MEMORY |
的存储器总量以允许火花应用程序在计算机上,例如使用1000m ,2g (默认值:总内存减去1 GB);请注意,每个应用程序的单个内存都使用其spark.executor.memory 属性进行配置。 |
SPARK_WORKER_PORT |
在特定端口上启动Spark worker(默认值:random)。 |
SPARK_WORKER_WEBUI_PORT |
工作者Web UI的端口(默认值:8081)。 |
SPARK_WORKER_DIR |
用于运行应用程序的目录,其中包括日志和暂存空间(默认值:SPARK_HOME / work)。 |
SPARK_WORKER_OPTS |
仅适用于“-Dx = y”形式的工作线程的配置属性(默认值:无)。请参阅下面的可能选项列表。 |
SPARK_DAEMON_MEMORY |
要分配给Spark主服务器和工作服务器守护程序的内存(默认值:1g)。 |
SPARK_DAEMON_JAVA_OPTS |
Spark主服务器和工作服务器守护程序本身的JVM选项,格式为“-Dx = y”(默认值:无)。 |
SPARK_DAEMON_CLASSPATH |
Spark主服务器和工作服务器守护程序本身的类路径(默认值:无)。 |
SPARK_PUBLIC_DNS |
Spark主服务器和工作服务器的公有DNS名称(默认值:无)。 |
注意:启动脚本目前不支持Windows。要在Windows上运行Spark群集,请手动启动master和workers。
SPARK_MASTER_OPTS支持以下系统属性:
物业名称 |
默认 |
含义 |
---|
spark.deploy.retainedApplications |
200 |
要显示的已完成应用程序的最大数量。较旧的应用程序将从UI中删除以维持此限制。 |
spark.deploy.retainedDrivers |
200 |
要显示的已完成驱动程序的最大数量。较旧的驱动程序将从UI中删除以维持此限制。 |
spark.deploy.spreadOut |
真正 |
独立集群管理器是应该跨节点扩展应用程序还是尝试将它们合并到尽可能少的节点上。对于HDFS中的数据位置,扩展通常更好,但对于计算密集型工作负载,整合更有效。 |
spark.deploy.defaultCores |
(无穷) |
如果未设置,则在Spark的独立模式下为应用程序提供的默认核心数spark.cores.max 。如果未设置,应用程序始终会获得所有可用内核,除非它们spark.cores.max 自行配置在共享群集上将此值设置得较低,以防止用户默认抓取整个群集。 |
spark.deploy.maxExecutorRetries |
10 |
限制独立集群管理器删除故障应用程序之前可能发生的最大背靠背执行程序故障数。如果应用程序有任何正在运行的执行程序,则永远不会删除它。如果某个应用程序spark.deploy.maxExecutorRetries 连续遇到多个故障,那么没有执行程序成功开始在这些故障之间运行,并且该应用程序没有正在运行的执行程序,那么独立集群管理器将删除该应用程序并将其标记为失败。要禁用此自动删除,请设置spark.deploy.maxExecutorRetries 为-1 。 |
spark.worker.timeout |
60 |
独立部署主服务器在没有收到心跳时认为工作程序丢失的秒数。 |
SPARK_WORKER_OPTS支持以下系统属性:
物业名称 |
默认 |
含义 |
---|
spark.worker.cleanup.enabled |
假 |
启用定期清理worker / application目录。请注意,这仅影响独立模式,因为YARN的工作方式不同。仅清除已停止的应用程序的目录。 |
spark.worker.cleanup.interval |
1800(30分钟) |
控制工作人员在本地计算机上清理旧应用程序工作目录的时间间隔(以秒为单位)。 |
spark.worker.cleanup.appDataTtl |
604800(7天,7 * 24 * 3600) |
在每个worker上保留应用程序工作目录的秒数。这是一个生存时间,应该取决于您拥有的可用磁盘空间量。应用程序日志和jar将下载到每个应用程序工作目录。随着时间的推移,工作目录可以快速填满磁盘空间,特别是如果您经常运行作业。 |
spark.worker.ui.compressedLogFileLengthCacheSize |
100 |
对于压缩日志文件,只能通过解压缩文件来计算未压缩文件。Spark缓存压缩日志文件的未压缩文件大小。此属性控制缓存大小。 |
将应用程序连接到群集
要在Spark集群上运行应用程序,只需将spark://IP:PORT
master的URL传递给SparkContext
构造函数即可。
要针对群集运行交互式Spark shell,请运行以下命令:
./bin/spark-shell --master spark://IP:PORT
您还可以传递一个选项--total-executor-cores <numCores>
来控制spark-shell在群集上使用的核心数。
启动Spark应用程序
该spark-submit
脚本提供了将编译的Spark应用程序提交到群集的最直接方法。对于独立群集,Spark目前支持两种部署模式。在client
模式下,驱动程序在与提交应用程序的客户端相同的进程中启动。cluster
但是,在模式下,驱动程序从集群内的一个工作进程启动,客户端进程一旦履行其提交应用程序的职责就退出,而无需等待应用程序完成。
如果您的应用程序是通过Spark submit启动的,那么应用程序jar会自动分发到所有工作节点。对于您的应用程序所依赖的任何其他jar,您应该--jars
使用逗号作为分隔符(例如--jars jar1,jar2
)通过标志指定它们。要控制应用程序的配置或执行环境,请参阅Spark配置。
此外,独立cluster
模式支持在退出非零退出代码时自动重新启动应用程序。要使用此功能,您可以在启动应用程序时传递--supervise
标记spark-submit
。然后,如果您希望杀死重复失败的应用程序,您可以通过以下方式执行此操作:
./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>
您可以通过独立的主Web UI在以下位置找到驱动程序IDhttp://<master url>:8080
。
资源调度
独立群集模式目前仅支持跨应用程序的简单FIFO调度程序。但是,要允许多个并发用户,您可以控制每个应用程序将使用的最大资源数。默认情况下,它将获取群集中的所有核心,这只有在您一次只运行一个应用程序时才有意义。您可以通过spark.cores.max
在SparkConf中设置来限制核心数量。例如:
val conf = new SparkConf()
.setMaster(...)
.setAppName(...)
.set("spark.cores.max", "10")
val sc = new SparkContext(conf)
此外,您可以spark.deploy.defaultCores
在群集主进程上配置以更改未设置spark.cores.max
为小于无限的应用程序的默认值。通过添加以下内容来执行此操作conf/spark-env.sh
:
export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"
这在用户可能未单独配置最大核心数的共享群集上很有用。
执行者调度
分配给每个执行程序的核心数是可配置的。当spark.executor.cores
显式设置时,如果工作者具有足够的内核和内存,则可以在同一工作程序上启动来自同一应用程序的多个执行程序。否则,默认情况下,每个执行程序都会获取该工作程序上可用的所有核心,在这种情况下,在一个单一的计划迭代期间,每个工作程序只能启动一个执行程序。
监控和记录
Spark的独立模式提供基于Web的用户界面来监控集群。主服务器和每个工作者都有自己的Web UI,显示集群和作业统计信息。默认情况下,您可以在端口8080访问主服务器的Web UI。可以在配置文件中或通过命令行选项更改端口。
此外,每个作业的详细日志输出也会写入每个从属节点的工作目录(SPARK_HOME/work
默认情况下)。您将看到每个作业的两个文件,stdout
并且stderr
所有输出都写入其控制台。
与Hadoop一起运行
您可以将Spark与现有Hadoop集群一起运行,只需在同一台计算机上将其作为单独的服务启动即可。要从Spark访问Hadoop数据,只需使用hdfs:// URL(通常hdfs://<namenode>:9000/path
,您可以在Hadoop Namenode的Web UI上找到正确的URL)。或者,您可以为Spark设置单独的群集,并且仍然可以通过网络访问HDFS;这将比磁盘本地访问慢,但如果您仍然在同一局域网中运行,则可能不会引起关注(例如,您在每个机架上放置了几台Spark机器,您已启用Hadoop)。
配置网络安全端口
Spark大量使用网络,某些环境对使用严密的防火墙设置有严格的要求。有关要配置的端口的完整列表,请参阅安全性页面。
高可用性
默认情况下,独立调度集群对工作人员故障具有弹性(因为Spark本身可以通过将其移动到其他工作人员而失去工作的弹性)。但是,调度程序使用Master来做出调度决策,这(默认情况下)会创建单点故障:如果Master崩溃,则不能创建新的应用程序。为了避免这种情况,我们有两个高可用性方案,详述如下。
与ZooKeeper的待机大师
概观
利用ZooKeeper提供领导者选举和一些状态存储,您可以在连接到同一ZooKeeper实例的群集中启动多个Masters。一个将被选为“领导者”,其他人将保持待命模式。如果当前领导者死亡,将选出另一个主人,恢复旧主人的状态,然后恢复安排。整个恢复过程(从第一个领导者关闭时起)应该需要1到2分钟。请注意,此延迟仅影响计划新应用程序 - 在主故障转移期间已运行的应用程序不受影响。
在此处了解有关开始使用ZooKeeper的更多信息。
组态
要启用此恢复模式,可以通过配置spark.deploy.recoveryMode
和相关的spark.deploy.zookeeper。*配置在spark-env中设置SPARK_DAEMON_JAVA_OPTS。有关这些配置的更多信息,请参阅配置文档
可能的问题:如果您的群集中有多个Masters但未能正确配置Masters以使用ZooKeeper,那么Masters将无法发现彼此并认为他们都是领导者。这不会导致健康的集群状态(因为所有Masters将独立安排)。
细节
设置ZooKeeper集群后,启用高可用性非常简单。只需使用相同的ZooKeeper配置(ZooKeeper URL和目录)在不同节点上启动多个Master进程。可以随时添加和删除大师。
为了安排新应用程序或将Worker添加到群集,他们需要知道当前领导者的IP地址。这可以通过简单地传入您曾经传入一个Masters的Masters列表来完成。例如,您可以启动指向的SparkContextspark://host1:port1,host2:port2
。这会导致你的SparkContext尝试注册两个Masters - 如果host1
发生故障,这个配置仍然是正确的,因为我们找到了新的领导者,host2
。
“注册大师”与正常操作之间存在重要区别。启动时,应用程序或工作人员需要能够找到并注册当前的主要主管。但是,一旦它成功注册,它就是“在系统中”(即存储在ZooKeeper中)。如果发生故障转移,新领导将联系所有先前注册的应用程序和工作人员,告知他们领导层的变化,因此他们甚至不需要知道新的Master在启动时是否存在。
由于这个属性,可以随时创建新的Masters,您唯一需要担心的是新应用程序和Worker可以找到它以便注册以防它成为领导者。一旦注册,你就得到了照顾。
使用本地文件系统进行单节点恢复
概观
ZooKeeper是获得生产级别高可用性的最佳方式,但如果您只是希望能够在Master关闭时重新启动Master,则FILESYSTEM模式可以处理它。当应用程序和工作人员注册时,他们有足够的状态写入提供的目录,以便在重新启动主进程时可以恢复它们。
组态
要启用此恢复模式,您可以使用以下配置在spark-env中设置SPARK_DAEMON_JAVA_OPTS:
系统属性 |
含义 |
---|
spark.deploy.recoveryMode |
设置为FILESYSTEM以启用单节点恢复模式(默认值:NONE)。 |
spark.deploy.recoveryDirectory |
Spark将存储恢复状态的目录,可从Master的角度访问。 |
细节
- 此解决方案可以与monit等进程监视器/管理器一起使用,或者只是通过重新启动来启用手动恢复。
- 虽然文件系统恢复似乎比完全不进行任何恢复要好,但这种模式对于某些开发或实验目的可能不是最理想的。特别是,通过stop-master.sh查杀主服务器不会清除其恢复状态,因此无论何时启动新主服务器,它都将进入恢复模式。如果需要等待所有先前注册的Workers /客户端超时,这可能会将启动时间增加最多1分钟。
- 虽然它没有得到官方支持,但您可以将NFS目录挂载为恢复目录。如果原始主节点完全死亡,则可以在另一个节点上启动主节点,这将正确恢复所有先前注册的工作人员/应用程序(相当于ZooKeeper恢复)。然而,未来的应用程序必须能够找到新的Master才能注册