翻译:http://spark.apache.org/docs/latest/spark-standalone.html#standby-masters-with-zookeeper

将Spark Standalone安装到群集

1.编译源码


2.直接下载



手动启动集群


启动master节点



./sbin/start-master.sh



一旦开始, master 将输出 spark://HOST:PORT URL为它自己, which you can use to connect workers to it, or pass as the “master” argument to SparkContext. You can also find this URL on the master’s web UI, which is http://localhost:8080 by default.


启动子节点


类似地,您可以启动一个或多个工作程序,并通过以下方式将它们连接到主服务器:

./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).



master and worker常用配置


Argument

Meaning

-h HOST--host HOST

要监听的主机名

-i HOST--ip HOST

要监听的主机名(已弃用,使用-h或--host)

-p PORT--port PORT

服务端口监听(默认值:master7077,worker随机)

--webui-port PORT

用于Web UI的端口(默认值:master为8080,worker为8081)

-c CORES--cores CORES

允许Spark应用程序在机器上使用的总CPU内核(默认值:全部可用);仅对工作节点有效

-m MEM--memory MEM


-d DIR--work-dir DIR

仅对工作节点有效

--properties-file FILE

要加载的自定义Spark属性文件的路径(默认值:conf / spark-defaults.conf)


集群启动脚本


在spark 目录下新建 conf/slaves 文件,它必须包含您打算启动Spark worker的所有计算机的主机名,每行一个,如果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  - 停止通过bin / start-master.sh脚本启动的主服务器。

sbin / stop-slaves.sh  - 停止在conf / slaves文件中指定的机器上的所有从实例。

sbin / stop-all.sh  - 停止主机和从机,如上所述。




请注意,这些脚本必须在要运行Spark主机的计算机上执行,而不是本地计算机。您可以选择通过在conf / spark-env.sh中设置环境变量来进一步配置集群。通过从conf / spark-env.sh.template开始创建此文件,并将其复制到所有工作计算机以使设置生效。以下设置可用:



master 绑定到特定的主机名或IP地址,例如公用主机。用于Spark中“scratch”空间的目录,包括映射输出文件和存储在磁盘上的RDD。这应该在您的系统中的快速本地磁盘上。它也可以是不同磁盘上的多个目录的逗号分隔列表允许Spark应用程序在计算机上使用的内存总量,例如1000m,2g(默认值:总内存减1 GB);请注意,每个应用程序的单独内存都使用其spark.executor.memory属性配置。在特定端口上启动Spark worker(默认值:random)。


Environment Variable

Meaning

SPARK_MASTER_HOST

将master绑定到特定的主机名或IP地址,例如公用主机

SPARK_MASTER_PORT

master 端口 (默认: 7077).

SPARK_MASTER_WEBUI_PORT

master Web UI的端口(默认值:8080)。

SPARK_MASTER_OPTS

仅适用于主机的配置属性,格式为“-Dx = y”(默认值:none)。请参阅下面的可能选项列表。

SPARK_LOCAL_DIRS

用于Spark中“scratch”空间的目录,包括映射输出文件和存储在磁盘上的RDD。这应该在您的系统中的快速本地磁盘上。它也可以是不同磁盘上的多个目录的逗号分隔列表。

SPARK_WORKER_CORES

允许Spark应用程序在机器上使用的内核总数(默认值:所有可用内核)。

SPARK_WORKER_MEMORY

允许Spark应用程序在计算机上使用的内存总量,例如1000m,2g(默认值:总内存减1 GB);请注意,每个应用程序的单独内存都使用其spark.executor.memory属性配置。

SPARK_WORKER_PORT

工作节点端口(默认值:随机)。

SPARK_WORKER_WEBUI_PORT

工作节点Web UI的端口(默认值:8081)。

SPARK_WORKER_DIR

运行应用程序的目录,其中将包括日志和临时空间(默认值:SPARK_HOME / work)。

SPARK_WORKER_OPTS

仅适用于工作程序的配置属性,格式为“-Dx = y”(默认值:none)。请参阅下面的可能选项列表。

SPARK_DAEMON_MEMORY

要分配给Spark主节点和工作程序守护程序本身的内存(默认值:1g)。

SPARK_DAEMON_JAVA_OPTS

Spark主节点和工作节点守护程序本身的JVM选项的形式为“-Dx = y”(默认值:无)。

SPARK_PUBLIC_DNS

Spark主机和工作线程的公共DNS名称(默认值:none)。



注意:启动脚本目前不支持Windows。要在Windows上运行Spark集群,请手动启动master和worker。

SPARK_MASTER_OPTS支持以下系统属性:

限制在独立集群管理器删除故障应用程序之前可能发生的背靠背执行程序故障的最大数量。如果应用程序有任何正在运行的执行器,则永远不会被删除。如果应用程序在一行中遇到多于spark.deploy.maxExecutorRetries故障,则没有执行程序成功地在这些故障之间运行,并且应用程序没有运行的执行程序,则独立集群管理器将删除该应用程序并将其标记为失败。要禁用此自动删除,请将spark.deploy.maxExecutorRetries设置为-1。

Property Name

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

1

 

spark.worker.timeout

60

秒数,在此秒数之后,独立部署主节点在没有接收到心跳的情况下认为工作节点丢失。

SPARK_WORKER_OPTS支持以下系统属性:




Property Name

Default

Meaning

spark.worker.cleanup.enabled

false

worker / application目录。请注意,这只影响独立模式,因为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-cores <numCores>以控制spark-shell在群集上使用的核心数。








启动Spark应用程序


sparkspark-submit脚本提供了一种最直接的方式来将已编译的Spark应用程序提交到集群。


对于独立集群,Spark当前支持两种部署模式。在客户端模式下,驱动程序在与提交应用程序的客户端相同的进程中启动。然而,在集群模式下,驱动程序从集群中的一个Worker进程启动,并且客户端进程在履行其提交应用程序的职责后立即退出,而不等待应用程序完成。


如果您的应用程序是通过Spark提交启动的,那么应用程序jar将自动分发到所有工作节点。对于您的应用程序依赖的任何其他jar,您应该通过--jars标志使用逗号作为分隔符(例如--jars jar1,jar2)指定它们。要控制应用程序的配置或执行环境,请参阅Spark配置。


此外,独立集群模式支持自动重新启动应用程序,如果它退出与非零退出代码。要使用此功能,您可以在启动应用程序时将--supervise标志传递到spark-submit。然后,如果您希望杀死重复失败的应用程序,您可以通过以下方式:

./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>



您可以通过独立的Master Web UI在http:// <master url>:8080找到驱动程序ID。




资源调度

独立集群模式当前仅支持跨应用程序的简单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设置为小于infinite的应用程序的默认值。通过在conf / spark-env.sh中添加以下内容来实现此目的:


export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"



这在用户可能没有单独配置最大数量的核心的共享集群上很有用


监控和日志


Spark的独立模式提供了一个基于Web的用户界面来监控集群。master和每个worker都有自己的Web UI,显示集群和作业统计信息。默认情况下,您可以访问主机的端口8080的Web UI。可以在配置文件中或通过命令行选项更改端口。此外,每个作业的详细日志输出也写入每个从节点的工作目录(SPARK_HOME /work  默认情况下为工作目录)。您将看到每个作业的两个文件,stdout和stderr,所有输出都写入其控制台。

和Hadoop同时运行


您可以在现有的Hadoop集群上运行Spark,只需在同一台计算机上将其作为单独的服务启动即可。要从Spark访问Hadoop数据,只需使用hdfs:// URL(通常为hdfs:// <namenode>:9000 / path,但您可以在Hadoop Namenode的Web UI上找到正确的URL)。或者,您可以为Spark设置一个单独的集群,仍然可以通过网络访问HDFS;这将比磁盘本地访问慢,但如果您仍然在同一个局域网中运行,可能不是一个问题(例如,您在您的Hadoop上的每个机架上放置一些Spark机器)。

配置网络安全的端口


Spark大量使用网络,一些环境对使用严格的防火墙设置有严格的要求。有关要配置的端口的完整列表,请参阅安全性页面

高可用性

默认情况下,独立调度集群对于Worker失败是有弹性的(只要Spark本身能够通过将其移动到其他worker来恢复工作)。然而,调度程序使用主机进行调度决策,这(默认情况下)创建单点故障:如果主机崩溃,则不能创建新的应用程序。为了规避这一点,我们有两个高可用性方案,详细如下

支持 Masters with ZooKeeper



概述利用ZooKeeper提供领导选举和一些状态存储,您可以在连接到同一个ZooKeeper实例的集群中启动多个主服务器。一个人将被选为“领导者”,其他人将保持在待机模式。如果当前领导者死亡,则选择另一个主人,恢复旧主人的状态,然后恢复调度。整个恢复过程(从第一个领导者失效的时间)应该需要1到2分钟。请注意,此延迟仅影响调度新应用程序 - 在主故障切换期间已在运行的应用程序不受影响。
配置为了启用此恢复模式,您可以通过配置spark.deploy.recoveryMode和相关的spark.deploy.zookeeper。*配置在spark-env中设置SPARK_DAEMON_JAVA_OPTS。有关这些配置的详细信息,请参阅配置文档,可能的问题:如果您的群集中有多个 Masters ,但无法正确配置 Masters 使用ZooKeeper, Masters 将无法发现彼此,并认为他们都是领导者。这不会导致健康的集群状态(因为所有Masters 将独立调度)。

细节

在您设置了ZooKeeper群集后,启用高可用性非常简单。只需在具有相同ZooKeeper配置(ZooKeeper URL和目录)的不同节点上启动多个主进程。 Masters可以随时添加和删除。

为了调度新应用程序或将Worker添加到集群,他们需要知道当前leader的IP地址。这可以通过简单地传递一个 Masters 列表,你曾经在一个单一的传递。例如,您可以将SparkContext指向spark:// host1:port1,host2:port2。这将导致您的SparkContext尝试注册两个 Masters - 如果host1宕机,这个配置仍然是正确的,因为我们会找到新的领导者,host2。



Master 将联系所有以前注册的应用程序和工人,以通知他们 Master 的变化,因此他们甚至不需要在启动时知道新主的存在

由于这个属性,可以在任何时候创建新的

Master ,唯一需要担心的是,新的应用程序和工人可以找到它注册,万一它成为领导者。一旦注册,你得到照顾。


使用本地文件系统的单节点恢复


ZooKeeper是生产级别高可用性的最佳方式,但如果你只是想要能够重新启动Master,如果它下来,FILESYSTEM模式可以照顾它。当applications and Workers时,它们有足够的状态写入提供的目录,以便在重新启动主进程时可以恢复它们。
为了启用此恢复模式,您可以使用此配置在spark-env中设置SPARK_DAEMON_JAVA_OPTS:

System property

Meaning

spark.deploy.recoveryMode

设置为FILESYSTEM以启用单节点恢复模式

spark.deploy.recoveryDirectory

Spark将存储恢复状态的目录,可从Master's角度访问。

细节1.这个解决方案可以与一个进程监视器/管理器一起使用,如monit,或只是通过重新启动手动恢复。2.虽然文件系统恢复似乎直接比完全不做任何恢复,这种模式可能是次优的某些开发或实验目的。特别是,通过stop-master.sh杀死主机不会清除它的恢复状态,所以每当你启动一个新的主机,它将进入恢复模式。如果需要等待所有先前注册的Worker /客户端超时,这可能会将启动时间增加1分钟。虽然它没有正式支持,您可以挂载一个NFS目录作为恢复目录。如果原始主节点完全死机,您可以在不同的节点上启动主服务器,这将正确恢复所有先前注册的工作程序/应用程序(等效于ZooKeeper恢复)。未来的应用程序将必须能够找到新的

Master,但是,为了注册。