Spark Standalone Mode

除了在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).

最后,可以将以下配置选项传递给主服务器和工作服务器:

ArgumentMeaning
-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脚本来启动或停止集群:

请注意,这些脚本必须在要在其上运行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应用程序在机器上使用的内存总量,例如1000m2g (默认值:总内存减去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支持以下系统属性:

物业名称DefaultMeaning
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支持以下系统属性:

物业名称DefaultMeaning
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 ). 您将看到每个作业的两个文件stdoutstderr ,并将其所有输出写入控制台.

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

by  ICOPY.SITE