Spark Standalone Mode
- Security
- Installing Spark Standalone to a Cluster
- Starting a Cluster Manually
- Cluster Launch Scripts
- Connecting an Application to the Cluster
- Launching Spark Applications
- Resource Scheduling
- Executors Scheduling
- Monitoring and Logging
- Running Alongside Hadoop
- Configuring Ports for Network Security
- High Availability
除了在Mesos或YARN集群管理器上运行之外,Spark还提供了一种简单的独立部署模式. 您可以通过手动启动主服务器和辅助服务器来手动启动独立集群,也可以使用我们提供的启动脚本 . 也可以在一台机器上运行这些守护程序进行测试.
Security
默认情况下,Spark中的安全性处于关闭状态. 这可能意味着您默认情况下容易受到攻击. 在运行Spark之前,请参阅Spark Security和本文档中的特定安全性部分.
Installing Spark Standalone to a Cluster
要安装Spark Standalone模式,只需在集群的每个节点上放置一个Spark版本即可. 您可以在每个发行版中获取Spark的预构建版本, 也可以自己构建 .
Starting a Cluster Manually
You can start a standalone master server by executing:
./sbin/start-master.sh
启动后,主服务器将自行打印出spark://HOST:PORT
URL,您可以使用该URL将工作人员连接到该URL,或将其作为" master"参数传递给SparkContext
. 您还可以在主机的Web UI上找到此URL,默认情况下为http:// localhost:8080 .
同样,您可以启动一个或多个工作人员,并通过以下方式将其连接到主节点:
./sbin/start-slave.sh <master-spark-URL>
Once you have started a worker, look at the master’s web UI (http://localhost:8080 by default). You should see the new node listed there, along with its number of CPUs and memory (minus one gigabyte left for the OS).
最后,可以将以下配置选项传递给主服务器和工作服务器:
Argument | Meaning |
---|---|
-h HOST , --host HOST |
侦听的主机名 |
-i HOST , --ip HOST |
要监听的主机名(不建议使用,请使用-h或--host) |
-p PORT , --port PORT |
用于侦听的服务端口(默认值:主服务器为7077,工作人员为随机) |
--webui-port PORT |
Web UI的端口(默认值:主用户8080,工作人员8081) |
-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) |
Cluster Launch Scripts
要使用启动脚本启动Spark独立集群,您应该在Spark目录中创建一个名为conf / slaves的文件,该文件必须包含要启动Spark Worker的所有计算机的主机名,每行一个. 如果conf / slaves不存在,则启动脚本默认为单台计算机(localhost),这对于测试非常有用. 注意,主计算机通过ssh访问每个工作计算机. 默认情况下,ssh是并行运行的,并且需要设置无密码(使用私钥)访问权限. 如果您没有无密码设置,则可以设置环境变量SPARK_SSH_FOREGROUND并为每个工作线程依次提供一个密码.
设置完该文件后,您可以基于Hadoop的部署脚本并使用SPARK_HOME/sbin
的以下shell脚本来启动或停止集群:
sbin/start-master.sh
-sbin/start-master.sh
在执行脚本的计算机上启动主实例.sbin/start-slaves.sh
-sbin/start-slaves.sh
在conf/slaves
文件中指定的每台计算机上启动一个从属实例.sbin/start-slave.sh
-sbin/start-slave.sh
在执行脚本的计算机上启动一个从属实例.sbin/start-all.sh
-sbin/start-all.sh
,同时启动一个主服务器和多个从属服务器.sbin/stop-master.sh
-sbin/stop-master.sh
停止通过sbin/start-master.sh
脚本启动的主机.sbin/stop-slaves.sh
-sbin/stop-slaves.sh
停止在conf/slaves
文件中指定的计算机上的所有从属实例.sbin/stop-all.sh
-sbin/stop-all.sh
,同时停止主机和从机.
请注意,这些脚本必须在要在其上运行Spark master的计算机上执行,而不是在本地计算机上执行.
您可以选择通过在conf/spark-env.sh
设置环境变量来进一步配置集群. 首先从conf/spark-env.sh.template
创建该文件,然后将其复制到所有辅助计算机上,以使设置生效. 可以使用以下设置:
环境变量 | Meaning |
---|---|
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 |
允许Spark应用程序在机器上使用的内存总量,例如1000m , 2g (默认值:总内存减去1 GB); memory is configured using its spark.executor.memory property. 请注意,每个应用程序的内存都是使用其spark.executor.memory 属性配置的. |
SPARK_WORKER_PORT |
在特定端口上启动Spark worker(默认:随机). |
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和worker.
SPARK_MASTER_OPTS支持以下系统属性:
物业名称 | Default | Meaning |
---|---|---|
spark.deploy.retainedApplications |
200 |
显示的已完成申请的最大数量. 较旧的应用程序将从UI中删除,以保持此限制. |
spark.deploy.retainedDrivers |
200 |
要显示的已完成驱动程序的最大数量. 较旧的驱动程序将从UI删除,以保持此限制. |
spark.deploy.spreadOut |
true |
独立集群管理器是应将应用程序分布在各个节点上,还是应将它们合并到尽可能少的节点上. 对于HDFS中的数据局部性而言,扩展通常更好,但对于计算密集型工作负载而言,整合更有效. |
spark.deploy.defaultCores |
(infinite) |
如果未设置spark.cores.max Spark独立模式提供给应用程序的默认内核数. 如果未设置,除非应用程序自行配置spark.cores.max 否则它们始终会获得所有可用的内核. 在共享群集上将此值设置得较低,以防止用户默认情况下抓取整个群集. |
spark.deploy.maxExecutorRetries |
10 |
对独立集群管理器删除有故障的应用程序之前可能发生的最大背对背执行器故障数的限制. 如果应用程序具有正在运行的执行程序,则永远不会将其删除. 如果应用程序连续经历多个spark.deploy.maxExecutorRetries 故障,则在这些故障之间没有执行程序成功开始运行,并且该应用程序没有运行的执行程序,则独立集群管理器将删除该应用程序并将其标记为失败. 要禁用此自动删除,请将spark.deploy.maxExecutorRetries 设置为-1 . |
spark.worker.timeout |
60 | 如果独立部署主服务器未接收到心跳信号,则该秒数之后该秒数将其视为丢失. |
SPARK_WORKER_OPTS支持以下系统属性:
物业名称 | Default | Meaning |
---|---|---|
spark.worker.cleanup.enabled |
false | 启用定期清除worker /应用程序目录. 请注意,这仅影响独立模式,因为YARN的工作原理不同. 仅清除已停止的应用程序的目录. |
spark.worker.cleanup.interval |
1800(30分钟) | 控制工人清理本地计算机上旧的应用程序工作目录的时间间隔(以秒为单位). |
spark.worker.cleanup.appDataTtl |
604800(7天,7 * 24 * 3600) | 在每个工作程序上保留应用程序工作目录的秒数. 这是生存时间,应取决于您拥有的可用磁盘空间量. 应用程序日志和jars被下载到每个应用程序工作目录. 随着时间的推移,工作目录会迅速填满磁盘空间,尤其是如果您非常频繁地运行作业时. |
spark.storage.cleanupFilesAfterExecutorExit |
true | Enable cleanup non-shuffle files(such as temp. shuffle blocks, cached RDD/broadcast blocks, spill files, etc) of worker directories following executor exits. Note that this doesn't overlap with `spark.worker.cleanup.enabled`, as this enables cleanup of non-shuffle files in local directories of a dead executor, while `spark.worker.cleanup.enabled` enables cleanup of all files/subdirectories of a stopped and timeout application. This only affects Standalone mode, support of other cluster manangers can be added in the future. |
spark.worker.ui.compressedLogFileLengthCacheSize |
100 | 对于压缩日志文件,只能通过解压缩文件来计算未压缩文件. Spark缓存压缩日志文件的未压缩文件大小. 此属性控制缓存大小. |
Connecting an Application to the Cluster
要在Spark集群上运行应用程序,只需将master的spark://IP:PORT
URL传递给SparkContext
构造函数 .
要针对集群运行交互式Spark Shell,请运行以下命令:
./bin/spark-shell --master spark://IP:PORT
您还可以传递--total-executor-cores <numCores>
以控制spark-shell在群集上使用的内核数.
Launching Spark Applications
spark-submit
脚本提供了将已编译的Spark应用程序提交到集群的最直接的方法. 对于独立集群,Spark当前支持两种部署模式. 在client
模式下,驱动程序以与提交应用程序的客户端相同的过程启动. 但是,在cluster
模式下,驱动程序是从群集内的一个Worker进程中启动的,并且客户端进程在履行其提交应用程序的职责而无需等待应用程序完成时立即退出.
如果您的应用程序是通过Spark提交启动的,则应用程序jar将自动分发到所有工作节点. 对于您的应用程序依赖的其他jar,您应通过--jars
标志使用逗号作为分隔符来指定它们(例如--jars jar1,jar2
). 要控制应用程序的配置或执行环境,请参见Spark配置 .
此外,独立cluster
模式支持使用非零退出代码退出的应用程序自动重新启动. 要使用此功能,您可以在启动应用程序时传入--supervise
标志以进行spark-submit
. 然后,如果您希望终止反复失败的应用程序,则可以通过以下方法进行:
./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>
您可以通过独立的Master Web UI(位于http://<master url>:8080
找到驱动程序ID.
Resource Scheduling
独立群集模式当前仅支持跨应用程序的简单FIFO调度程序. 但是,要允许多个并发用户,您可以控制每个应用程序将使用的最大资源数量. 默认情况下,它将获取群集中的所有内核,这仅在您一次只运行一个应用程序时才有意义. 您可以通过在SparkConf中设置spark.cores.max
来限制内核数量. 例如:
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>"
这在用户可能未单独配置最大核心数的共享群集上很有用.
Executors Scheduling
分配给每个执行程序的内核数是可配置的. 显式设置spark.executor.cores
,如果工作程序具有足够的核心和内存,则可以在同一工作程序上启动来自同一应用程序的多个执行程序. 否则,默认情况下,每个执行程序都将获取工作程序上所有可用的内核,在这种情况下,在单个调度迭代中,每个应用程序上只能在每个工作程序上启动一个执行程序.
Monitoring and Logging
Spark的独立模式提供基于Web的用户界面来监视集群. 主服务器和每个工作人员都有自己的Web UI,该Web UI显示群集和作业统计信息. 默认情况下,您可以在端口8080上访问主服务器的Web UI.可以在配置文件中或通过命令行选项更改端口.
此外,每个作业的详细日志输出也将写入每个从属节点的工作目录(默认为SPARK_HOME/work
). 您将看到每个作业的两个文件stdout
和stderr
,并将其所有输出写入控制台.
Running Alongside Hadoop
您可以通过将Spark作为单独的服务在同一台计算机上启动,将其与现有Hadoop集群一起运行. 要从Spark访问Hadoop数据,只需使用hdfs:// URL(通常为hdfs://<namenode>:9000/path
,但您可以在Hadoop Namenode的Web UI上找到正确的URL). 另外,您可以为Spark设置一个单独的群集,但仍然可以通过网络访问HDFS; 这将比磁盘本地访问慢,但是如果您仍在同一局域网中运行(例如,在装有Hadoop的每个机架上放置几台Spark机器),则可能不必担心.
Configuring Ports for Network Security
一般来说,Spark集群及其服务未部署在公共互联网上. 它们通常是私有服务,并且只能在部署Spark的组织网络内访问. 对Spark服务使用的主机和端口的访问应仅限于需要访问服务的原始主机.
这对于使用独立资源管理器的群集特别重要,因为它们不支持其他资源管理器所支持的细粒度访问控制.
有关要配置的端口的完整列表,请参阅安全性页面 .
High Availability
默认情况下,独立的调度群集可以抵抗Worker的故障(Spark本身可以通过将其转移到其他Worker上来抵抗丢失的工作). 但是,调度程序使用主服务器来制定调度决策,这(默认情况下)会造成单点故障:如果主服务器崩溃,则无法创建新的应用程序. 为了避免这种情况,我们有两个高可用性方案,下面将详细介绍.
Standby Masters with ZooKeeper
Overview
利用ZooKeeper提供领导者选举和一些状态存储,您可以在连接到同一ZooKeeper实例的群集中启动多个Master. 其中一位将当选为"领导人",其他人将保持待机状态. 如果当前领导者去世,将选出另一位主人,恢复原主人的状态,然后恢复计划. 整个恢复过程(从第一个领导者下台起)应花费1-2分钟. 请注意,此延迟仅影响计划新应用程序-主故障转移期间已在运行的应用程序不受影响.
在此处了解有关ZooKeeper入门的更多信息.
Configuration
为了启用此恢复模式,您可以通过配置spark.deploy.recoveryMode
和相关的spark.deploy.zookeeper.*配置在spark-env中设置SPARK_DAEMON_JAVA_OPTS. 有关这些配置的更多信息,请参阅配置文档
可能的陷阱:如果您的集群中有多个Master,但未能正确配置Master以使用ZooKeeper,则Master将无法彼此发现并认为他们都是领导者. 这不会导致群集状态正常(因为所有Master都将独立调度).
Details
设置ZooKeeper群集后,启用高可用性非常简单. 只需在具有相同ZooKeeper配置(ZooKeeper URL和目录)的不同节点上启动多个主进程. 母版可以随时添加和删除.
为了安排新的应用程序或将Worker添加到群集,他们需要知道当前领导者的IP地址. 这可以通过简单地传递过去曾经传递过的大师列表来实现. 例如,您可以启动SparkContext指向spark://host1:port1,host2:port2
. 这将导致您的SparkContext尝试向两个Master进行注册-如果host1
出现故障,此配置仍将是正确的,因为我们会找到新的领导者host2
.
在"向主机注册"和正常操作之间有一个重要的区别. 在启动时,应用程序或工作程序需要能够找到当前的主管理员并进行注册. 但是,一旦成功注册,它就会"在系统中"(即存储在ZooKeeper中). 如果发生故障转移,新领导者将与所有先前注册的应用程序和工作人员联系,以通知他们领导力的变化,因此他们甚至不需要在启动时就知道新主服务器的存在.
由于具有此属性,可以随时创建新的Master,而您唯一需要担心的是, 新应用程序和Workers可以找到它进行注册,以防它成为领导者. 注册后,您将得到照顾.
Single-Node Recovery with Local File System
Overview
ZooKeeper是实现生产级高可用性的最佳方法,但是如果您只想在主服务器出现故障时能够重新启动它,则FILESYSTEM模式可以解决这一问题. 当应用程序和工作程序注册时,它们具有足够的状态写入提供的目录,以便在重新启动主进程时可以将其恢复.
Configuration
为了启用此恢复模式,可以使用以下配置在spark-env中设置SPARK_DAEMON_JAVA_OPTS:
系统属性 | Meaning |
---|---|
spark.deploy.recoveryMode |
设置为FILESYSTEM以启用单节点恢复模式(默认值:NONE). |
spark.deploy.recoveryDirectory |
从主服务器的角度来看,Spark将存储恢复状态的目录. |
Details
- 该解决方案可以与进程监视器/管理器(如monit)一起使用 ,或者仅用于通过重新启动进行手动恢复.
- 尽管文件系统恢复似乎比根本不进行任何恢复都直接好,但是对于某些开发或实验目的,此模式可能不是最佳的. 特别是,通过stop-master.sh杀死主服务器不会清除其恢复状态,因此,每当您启动新的主服务器时,它将进入恢复模式. 如果需要等待所有先前注册的Worker /客户端超时,这可能会使启动时间最多增加1分钟.
- 虽然它不受官方支持,但您可以将NFS目录挂载为恢复目录. 如果原始的Master节点完全死亡,则可以在其他节点上启动Master,这样可以正确恢复所有先前注册的Worker /应用程序(等同于ZooKeeper恢复). 但是,将来的应用程序必须能够找到新的Master,才能进行注册.