除了在 Mesos 或 YARN 集群管理器上运行外,Spark 还提供了一个简单的独立部署模式。您可以手动启动一个独立的集群,通过手动启动主集群和工作集群,或者使用我们提供的启动脚本。也可以在一台机器上运行这些守护进程进行测试。
在集群中安装独立的Spark
要安装 Spark 独立模式,只需在集群的每个节点上放置一个已编译版本的 Spark。您可以在每个版本中获得 Spark 的预构建版本,也可以自己构建它。
手动启动集群
你可以启动一个独立的主服务器执行:
./sbin/start-master.sh
一旦启动,主进程将为自己打印一个 spark://HOST:PORT URL,您可以使用它 将worker 连接到它,或者作为“master”参数传递给 SparkContext。您还可以在主 web UI 上找到这个URL,默认是 http://localhost:8080。
类似地,您可以启动一个或多个 worker,并通过以下方式将它们连接到 master:
./sbin/start-slave.sh <master-spark-URL>
启动一个 worker 之后,查看主 web UI(默认为http://localhost:8080)。您应该会看到这里列出的新节点,以及它的 cpu 和内存数量(操作系统还剩1g)。
最后,以下配置选项可以传递给主和 worker:
Argument | Meaning |
---|---|
-h HOST , --host HOST | 要监听的主机名 |
-i HOST , --ip HOST | 要监听的主机名(不赞成使用-h或——host) |
-p PORT , --port PORT | 服务监听端口(默认:主端口7077,工作者端口随机) |
--webui-port PORT | web UI端口(默认:8080主机,8081 worker) |
-c CORES , --cores CORES | 允许Spark应用程序在机器上使用的总CPU内核(默认:所有可用) only on worker |
-m MEM , --memory MEM | 允许Spark应用程序在机器上使用的内存总量,格式为1000M或2G(默认:机器的总RAM减去1gb); only on worker |
-d DIR , --work-dir DIR | 用于临时空间和作业输出日志的目录(默认:SPARK_HOME/work); only on worker |
--properties-file FILE | 要加载的自定义Spark属性文件的路径(默认:conf/ Spark -default .conf) |
集群启动脚本
要使用启动脚本启动一个 Spark 独立集群,您应该在 Spark 目录中创建一个名为 conf/slaves 的文件,该文件必须包含要启动Spark workers 的所有机器的主机名,每行一个。如果不存在 conf/slave,启动脚本默认为一台机器(本地主机),通常用于测试环境。注意,主机器通过 ssh 访问每个工作机器。默认情况下,ssh 是并行运行的,需要设置无密码(使用私钥)访问。如果没有无密码设置,可以设置环境变量 SPARK_SSH_FOREGROUND,并连续地为每个工作人员提供密码。
一旦您设置了这个文件,您就可以使用以下shell脚本启动或停止您的集群,这些脚本基于Hadoop的部署脚本,并且可以在SPARK_HOME/sbin中使用:
sbin/start-master.sh
- 在执行脚本的机器上启动一个主实例。sbin/start-slaves.sh
- S在conf/从机文件中指定的每台机器上传送一个从实例。sbin/start-slave.sh
- 在执行脚本的机器上启动从属实例。sbin/start-all.sh
- 如上所述,启动一个主服务器和一些从服务器。sbin/stop-master.sh
- 停止通过bin/start-master.sh脚本启动的主进程。sbin/stop-slaves.sh
- 在conf/从机文件中指定的机器上停止所有从机实例。sbin/stop-all.sh
- 如上所述,同时阻止主和从。
请注意,这些脚本必须在希望在其上运行Spark master的机器上执行,而不是在本地机器上。
您可以通过在conf/spark-env.sh中设置环境变量来进一步配置集群。从 conf/spark-env.sh.template 开始创建这个文件。并将其复制到所有工作计算机以使设置生效。以下设置是可用的:
Environment Variable | Meaning |
---|---|
SPARK_MASTER_HOST | 将主机绑定到特定的主机名或IP地址,例如公共地址。 |
SPARK_MASTER_PORT | 在一个不同的端口上启动主服务器(默认:7077)。 |
SPARK_MASTER_WEBUI_PORT | 主web UI的端口(默认值:8080)。 |
SPARK_MASTER_OPTS | 以“-Dx=y”的形式应用于主服务器的配置属性(默认值:none)。参见下面的可能选项列表。 |
SPARK_LOCAL_DIRS | 用于在 Spark 中“擦除”空间的目录,包括映射输出文件和存储在磁盘上的 RDDs。这应该是在一个快速,本地磁盘在您的系统。它也可以是不同磁盘上多个目录的逗号分隔列表. |
SPARK_WORKER_CORES | 允许Spark应用程序在机器上使用的内核总数(默认:所有可用的内核)。 |
SPARK_WORKER_MEMORY | 允许Spark应用程序在机器上使用的内存总量,例如1000m、2g(默认:总内存减去1gb);注意,每个应用程序的独立内存都是使用其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”(默认为none)。 |
SPARK_PUBLIC_DNS | spark 主机和工作者的公共DNS名称(默认:无)。 |
注意:启动脚本目前不支持Windows。要在Windows上运行Spark集群,需要手动启动主服务器和辅助服务器。
SPARK_MASTER_OPTS 支持以下系统属性:
Property Name | Default | Meaning |
---|---|---|
spark.deploy.retainedApplications | 200 | 要显示的已完成应用程序的最大数目。旧的应用程序将从UI中删除以保持这个限制。 |
spark.deploy.retainedDrivers | 200 | 要显示的完成的驱动程序的最大数目。旧的驱动程序将从UI中删除以保持这个限制。 |
spark.deploy.spreadOut | true | 独立集群管理器应该将应用程序分散到各个节点上,还是尝试将它们合并到尽可能少的节点上。对于HDFS中的数据位置,扩展通常更好,如果应用程序在Spark的独立模式下没有设置Spark .core .max,则默认提供给它们的内核数。如果没有设置,应用程序总是获得所有可用的核心,除非它们配置spark.core.max。在共享集群上设置这个较低的值,以防止用户在默认情况下获取整个集群。但是对于计算密集型工作负载,合并更有效。 |
spark.deploy.defaultCores | (infinite) | 如果应用程序在Spark的独立模式下没有设置Spark .core .max,则默认提供给它们的内核数。如果没有设置,应用程序总是获得所有可用的核心,除非它们配置spark.core.max。在共享集群上设置这个较低的值,以防止用户在默认情况下获取整个集群。 |
spark.deploy.maxExecutorRetries | 10 | 限制在独立集群管理器删除错误应用程序之前可能发生的连续执行程序故障的最大数量。如果一个应用程序有任何正在运行的执行者,它就永远不会被删除。如果一个应用程序在一行中经历了超过spark.deploy. maxexecutorretry失败,那么在这些失败之间没有执行器成功启动,并且应用程序没有运行执行器,那么独立集群管理器将删除应用程序并将其标记为失败。若要禁用此自动删除,请将spark.deploy.maxExecutorRetries设置为-1。 |
spark.worker.timeout | 60 | 如果没有心跳,独立部署主服务器认为工作进程丢失的秒数。 |
SPARK_WORKER_OPTS 支持以下系统属性:
Property Name | Default | Meaning |
---|---|---|
spark.worker.cleanup.enabled | false | 允许定期清理工作者/应用程序目录。注意,这只影响单机模式,因为 yarn 的工作方式不同。只有停止的应用程序的目录被清除。 |
spark.worker.cleanup.interval | 1800 (30 minutes) | 控制工人清理本地机器上旧应用程序工作区域的时间间隔(以秒为单位)。 |
spark.worker.cleanup.appDataTtl | 7 * 24 * 3600 (7 days) | 在每个工作者上保留应用程序工作目录的秒数。这是一个生存的时间,应该取决于可用磁盘空间的数量。应用程序日志和jar被下载到每个应用程序工作目录。随着时间的推移,工作目录可以很快地填满磁盘空间,特别是在非常频繁地运行作业的情况下。 |
spark.worker.ui.compressedLogFileLengthCacheSize | 100 | 对于压缩的日志文件,未压缩的文件只能通过解压缩文件来计算。Spark缓存未压缩的日志文件的大小。此属性控制缓存大小。 |
将应用程序连接到集群
要在 Spark 集群上运行应用程序,只需将主服务器的 Spark://IP:PORT URL 传递给 SparkContext 构造函数。
要在集群上运行交互式Spark shell,请运行以下命令:
./bin/spark-shell --master spark://IP:PORT
您还可以传递一个选项 --total-executor-core < numcore >,以控制 spark-shell 在集群上使用的内核数量。
启动spark应用程序
Spark -submit 脚本提供了向集群提交已编译的Spark应用程序的最直接方式。对于独立集群,Spark 目前支持两种部署模式。在客户端模式下,驱动程序在与提交应用程序的客户端相同的进程中启动。然而,在集群模式中,驱动程序从集群内的一个工作进程启动,客户端进程在完成提交应用程序的任务后立即退出,而无需等待应用程序完成。
如果您的应用程序是通过Spark submit启动的,那么应用程序jar将自动分布到所有工作节点。对于您的应用程序所依赖的任何其他jar,您应该通过使用逗号作为分隔符的——jars标志来指定它们(例如——jars jar1,jar2)。要控制应用程序的配置或执行环境,请参阅:Spark Configuration Guide。
另外,如果应用程序使用非零退出代码退出,独立集群模式支持自动重新启动应用程序。要使用此功能,您可以在启动应用程序时 --supervise 标志传递到 spark-submit。然后,如果您希望终止一个不断失败的应用程序,您可以通过以下方式来实现:
./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>
您可以通过 http://< Master url>:8080的独立主 web UI 找到驱动程序ID。
资源调度
独立集群模式目前仅支持跨应用程序的简单FIFO调度器。但是,为了允许多个并发用户,您可以控制每个应用程序将使用的最大资源数量。默认情况下,它将获取集群中的所有核心,这只有在一次只运行一个应用程序时才有意义。可以在 SparkConf 中使用 spark.cores.max 来控制 cores的数量。For example:
val conf = new SparkConf()
.setMaster(...)
.setAppName(...)
.set("spark.cores.max", "10")
val sc = new SparkContext(conf)
此外,您可以在集群主进程上配置spark.deploy. defaultcore,以更改未设置spark.core的应用程序的默认值。最大值小于无穷大。在conf/spark-env.sh中添加以下内容:
export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"
这在共享集群上很有用,因为用户可能没有单独配置最大数量的内核。
监控和日志
Spark的独立模式提供了一个基于web的用户界面来监视集群。主机和每个worker都有自己的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;这将比磁盘本地访问慢一些,但是如果您仍然在相同的局域网中运行(例如,在Hadoop所在的每个机架上放置一些Spark机器),那么这可能不是问题。
为网络安全配置端口
Spark大量使用网络,一些环境对使用严格的防火墙设置有严格的要求。有关要配置的端口的完整列表,请参阅:Spark Security。
高可用
默认情况下,独立调度集群对工人故障有弹性(就Spark本身而言,通过将工作转移给其他工人而丢失工作而言,它也有弹性)。但是,调度器使用一个主程序进行调度决策,这(默认情况下)会创建一个单点故障:如果主程序崩溃,就不能创建新的应用程序。为了避免这种情况,我们有两个高可用性方案,具体如下。
Standby Masters with ZooKeeper
Overview
利用ZooKeeper提供领袖选举和一些状态存储,您可以在集群中启动多个连接到同一个ZooKeeper实例的主机。一个将被选为“领导人”,其他的将保持待机状态。如果当前的领导人去世,将选举另一个Master,恢复旧Master的状态,然后恢复调度。整个恢复过程(从第一个领导者倒下的那一刻开始)应该需要1到2分钟。注意,此延迟只影响调度新应用程序—在主故障转移期间已经运行的应用程序不受影响
Configuration
为了启用这种恢复模式,您可以在 spark-env 中通过配置 spark.deploy.recoveryMode 和相关的 spark.deploy.zookeeper.* 配置来设置 SPARK_DAEMON_JAVA_OPTS。
可能的问题:如果您的集群中有多个 master,但是没有正确地配置它们来使用 ZooKeeper,那么这些master将无法发现彼此,并认为它们都是 leader。这将不会导致一个健康的集群状态(因为所有的主机都将独立调度)。
Details
在设置了ZooKeeper集群之后,启用高可用性就很简单了。只需使用相同的ZooKeeper配置(ZooKeeper URL和目录)在不同节点上启动多个主进程。master 可以随时添加和删除。
为了调度新的应用程序或将工作人员添加到集群中,他们需要知道当前领导的IP地址。这可以通过简单地传递一个master列表来实现,在这个列表中只传递一个master。例如,您可以启动SparkContext,指向spark://host1:port1,host2:port2。这将导致您的SparkContext尝试向两个主机注册—如果host1宕机,这个配置仍然是可用的,因为我们将找到新的主机host2。
在“向管理员注册”和正常操作之间有一个重要的区别。启动时,应用程序或工作程序需要能够找到当前的主用户并向其注册。然而,一旦它成功注册,它就“在系统中”了。,储存于ZooKeeper)。如果发生故障转移,新领导将联系所有以前注册的应用程序和工作人员,通知他们领导层的变化,因此他们甚至不需要在启动时知道新主的存在。
由于这个属性,可以在任何时候创建新的主服务器,您唯一需要担心的是,新的应用程序和工作者可以找到它来注册,以防它成为领导者。
使用本地文件系统进行单节点恢复
Overview
ZooKeeper是实现生产级高可用性的最佳方式,但如果只是想在主服务器宕机时重启,文件系统模式可以解决这个问题。当应用程序和工作者注册时,它们有足够的状态写入到提供的目录中,以便在主进程重新启动时可以恢复它们。
Configuration
为了启用这种恢复模式,您可以使用以下配置在 spark-env 中设置 SPARK_DAEMON_JAVA_OPTS:
System property | Meaning |
---|---|
spark.deploy.recoveryMode | 设置为文件系统以启用单节点恢复模式(默认:无)。 |
spark.deploy.recoveryDirectory | Spark将存储恢复状态的目录,可以从主透视图访问。 |
Details
- 这个解决方案可以与进程监视器/管理器(如monit)一起使用,或者只是通过重启来启用手动恢复。
- 虽然文件系统恢复看起来比根本不做任何恢复要好得多,但是对于某些开发或实验目的来说,这种模式可能不是最优的。特别是,通过stop-master.sh杀死一个主进程不会清除它的恢复状态,所以无论何时启动一个新主进程,它都会进入恢复模式。如果需要等待所有以前注册的工人/客户端超时,这可能会使启动时间最多增加1分钟。
- 虽然官方不支持它,但是可以将NFS目录挂载为恢复目录。如果原始主节点完全死亡,那么您可以在另一个节点上启动一个主节点,它将正确地恢复所有以前注册的Workers/application(相当于ZooKeeper恢复)。然而,为了注册,未来的应用程序必须能够找到新的主程序。
原文地址:http://spark.apache.org/docs/2.1.1/spark-standalone.html