Spark独立模式

Spark独立模式

除了在Mesos或YARN集群管理器上运行之外,Spark还提供了一种简单的独立部署模式。您可以通过手动启动管理员和工人来手动启动独立集群,也可以使用我们提供的启动脚本。也可以在一台机器上运行这些守护程序进行测试。

安全

默认情况下,Spark中的安全性处于关闭状态。这可能意味着您默认情况下容易受到攻击。在运行Spark之前,请参阅Spark安全性和本文档中的特定安全性部分。

将Spark Standalone安装到集群

要安装Spark Standalone模式,只需在集群的每个节点上放置一个Spark版本即可。您可以在每个发行版中获取Spark的预构建版本,也可以自己构建

手动启动集群

您可以通过执行以下操作来启动独立的主服务器:

./sbin/start-master.sh

一旦启动,母版服务器将spark://HOST:PORT自行打印出一个URL,您可以使用该URL将工作人员连接到该URL,或者作为“母版”参数传递给SparkContext。您也可以在主机的Web UI上找到此URL ,默认情况下为http:// localhost:8080

同样,您可以启动一个或多个工作人员,并通过以下方式将其连接到主节点:

./sbin/start-slave.sh <master-spark-URL>

一旦开始工作,请查看主服务器的Web UI(默认为http:// localhost:8080)。您应该看到那里列出了新节点,以及它的CPU和内存数量(操作系统还剩下1 GB)。

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

争论

含义

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

群集启动脚本

要使用启动脚本启动Spark独立集群,您应该在Spark目录中创建一个名为conf / slaves的文件,该文件必须包含要启动Spark Worker的所有计算机的主机名,每行一个。如果conf / slaves不存在,则启动脚本默认为单台计算机(localhost),这对于测试非常有用。请注意,主计算机通过ssh访问每个工作计算机。默认情况下,ssh是并行运行的,并且需要设置无密码(使用私钥)访问权限。如果没有无密码设置,则可以设置环境变量SPARK_SSH_FOREGROUND并为每个工作线程依次提供一个密码。

设置此文件后,您可以基于Hadoop的部署脚本,使用以下shell脚本启动或停止集群,该脚本可在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 master的计算机上执行,而不是在本地计算机上执行。

您可以选择通过在中设置环境变量来进一步配置集群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

允许Spark应用程序在计算机上使用的内存总量,例如1000m2g(默认值:总内存减去1 GB);请注意,每个应用程序的单独内存都是使用其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支持以下系统属性:

物业名称

默认

含义

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 /应用程序目录。请注意,这仅影响独立模式,因为YARN的工作原理不同。仅清除已停止应用程序的目录。

spark.worker.cleanup.interval

1800(30分钟)

控制工人清理本地计算机上旧的应用程序工作目录的时间间隔(以秒为单位)。

spark.worker.cleanup.appDataTtl

604800(7天,7 * 24 * 3600)

在每个工作程序上保留应用程序工作目录的秒数。这是生存时间,应取决于您拥有的可用磁盘空间量。应用程序日志和jar将下载到每个应用程序工作目录。随着时间的推移,工作目录会迅速填满磁盘空间,尤其是如果您非常频繁地运行作业时。

spark.storage.cleanupFilesAfterExecutorExit

真正

在执行程序退出后,启用工作目录的清理非混洗文件(例如临时混洗块,缓存的RDD /广播块,溢出文件等)。请注意,这与`spark.worker.cleanup.enabled`不重叠,因为这可以清除死掉执行者的本地目录中的非随机文件,而`spark.worker.cleanup.enabled`则可以清除所有文件。 /子目录的停止和超时应用程序。这仅影响独立模式,将来可以添加对其他集群管理员的支持。

spark.worker.ui.compressedLogFileLengthCacheSize

100

对于压缩日志文件,只能通过解压缩文件来计算未压缩文件。Spark缓存压缩日志文件的未压缩文件大小。此属性控制缓存大小。

将应用程序连接到集群

要在Spark集群上运行应用程序,只需将spark://IP:PORTmaster 的URL 传递给SparkContext Constructor

要针对集群运行交互式Spark Shell,请运行以下命令:

./bin/spark-shell --master spark://IP:PORT

您还可以传递一个选项--total-executor-cores <numCores>来控制spark-shell在集群上使用的核心数量。

启动Spark应用程序

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在上找到驱动程序ID http://<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,该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的组织网络内访问。对Spark服务使用的主机和端口的访问应仅限于需要访问服务的原始主机。

这对于使用独立资源管理器的群集尤为重要,因为它们不支持其他资源管理器所支持的细粒度访问控制。

有关要配置的端口的完整列表,请参阅 安全性页面

高可用性

默认情况下,独立的调度集群可以抵抗Worker的故障(Spark本身可以通过将其转移到其他Worker上来抵抗丢失的工作)。但是,调度程序使用主服务器来制定调度决策,并且这(默认情况下)会造成单点故障:如果主服务器崩溃,则无法创建新的应用程序。为了避免这种情况,我们有两种高可用性方案,下面将详细介绍。

ZooKeeper的备用大师

总览

利用ZooKeeper提供领导者选举和一些状态存储,您可以在连接到同一ZooKeeper实例的群集中启动多个Master。其中一位将当选为“领导人”,其他人将保持待机状态。如果当前领导者去世,将选出另一位大师,恢复原大师的状态,然后恢复计划。整个恢复过程(从第一个领导者下台起)应花费1-2分钟。请注意,此延迟仅影响计划应用程序–主故障转移期间已在运行的应用程序不受影响。

在此处了解有关ZooKeeper入门的更多信息。

组态

为了启用此恢复模式,您可以通过配置spark.deploy.recoveryMode及相关的spark.deploy.zookeeper。*配置在spark-env中设置SPARK_DAEMON_JAVA_OPTS 。有关这些配置的更多信息,请参阅配置文档

可能的陷阱:如果您的群集中有多个Master,但未能正确配置Master以使用ZooKeeper,则Master将无法发现彼此并认为他们都是领导者。这不会导致群集状态正常(因为所有Master都将独立调度)。

细节

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

为了安排新的应用程序或将Worker添加到群集,他们需要知道当前领导者的IP地址。这可以通过简单地传递一个您过去曾经传递过的大师列表来实现。例如,您可以将SparkContext指向spark://host1:port1,host2:port2。这将导致您的SparkContext尝试向两个Master进行注册-如果host1出现故障,此配置仍然是正确的,因为我们会找到新的Leader host2

在“向主机注册”和正常操作之间有一个重要的区别。启动时,应用程序或工作程序需要能够找到当前的主管理员并进行注册。但是,一旦成功注册,它就会“在系统中”(即存储在ZooKeeper中)。如果发生故障转移,新领导者将与所有先前注册的应用程序和工作人员联系,以通知他们领导能力的变化,因此他们甚至不需要在启动时就知道新主服务器的存在。

由于具有此属性,因此可以随时创建新的Master,而您唯一需要担心的是,应用程序和Workers可以找到它进行注册,以防它成为领导者。注册后,您将得到照顾。

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

总览

ZooKeeper是实现生产级高可用性的最佳方法,但是如果您只想在主服务器出现故障时能够重新启动它,则FILESYSTEM模式可以解决这一问题。当应用程序和工作程序注册时,它们具有足够的状态写入提供的目录,以便可以在重新启动主进程时恢复它们。

组态

为了启用此恢复模式,可以使用以下配置在spark-env中设置SPARK_DAEMON_JAVA_OPTS:

系统属性

含义

spark.deploy.recoveryMode

设置为FILESYSTEM以启用单节点恢复模式(默认值:NONE)。

spark.deploy.recoveryDirectory

从主服务器的角度来看,Spark将存储恢复状态的目录。

细节

  • 该解决方案可以与进程监视器/管理器(例如monit)一起使用,或者仅用于通过重新启动来进行手动恢复。
  • 尽管文件系统恢复似乎比根本不进行任何恢复要好得多,但是对于某些开发或实验目的,此模式可能不是最佳的。特别是,通过stop-master.sh杀死主服务器不会清理其恢复状态,因此,每当您启动一个新的主服务器时,它将进入恢复模式。如果需要等待所有先前注册的Worker /客户端超时,这可能会使启动时间最多增加1分钟。
  • 虽然它不受官方支持,但您可以将NFS目录挂载为恢复目录。如果原始的Master节点完全死亡,则可以在其他节点上启动Master,这样可以正确恢复所有先前注册的Worker /应用程序(等同于ZooKeeper恢复)。但是,将来的应用程序必须能够找到新的Master,才能进行注册。

备注:

1、打开网络

vi /etc/sysconfig/network-scripts/ifcfg-ens33

将ONBOOT=no改为ONBOOT=yes

sudo service network restart

sudo yum install ssh
sudo yum install pdsh

ip addr

2、安装JDK

cd /usr
mkdir java
cd java
tar zxvf jdk-8u212-linux-x64.tar.gz

vi /etc/profile

# Java
export JAVA_HOME=/usr/java/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin

source /etc/profile

java -version

3、安装Scala

cd /usr
mkdir scala
cd scala

tar zxvf scala-2.13.1.tgz

vi /etc/profile

4、安装Hadoop

cd /usr
mkdir hadoop
cd hadoop

tar zxvf hadoop-3.2.1.tar.gz

vi /etc/profile

# Hadoop
export HADOOP_HOME=/usr/hadoop/hadoop-3.2.1
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

source /etc/profile

hadoop version

5、安装Scala

cd /usr
mkdir scala
cd scala

# Scala
export SCALA_HOME=/usr/scala/scala-2.13.1
export PATH=$PATH:$SCALA_HOME/bin

source /etc/profile

scala -version

6、关闭防火墙

systemctl stop firewalld.service

7、安装Spark

cd /usr
mkdir spark
cd spark

tar zxvf spark-3.0.0-preview2-bin-hadoop3.2.tgz

mv spark-3.0.0-preview2-bin-hadoop3.2 spark-3.0.0

vi /etc/profile

# Spark
export SPARK_HOME=/usr/spark/spark-3.0.0
export PATH=$PATH:$SPARK_HOME/bin
export PATH=$PATH:$SPARK_HOME/sbin

source /etc/profile

vi  /usr/spark/spark-3.0.0/conf/slaves
localhost.localdomain

vi  /usr/spark/spark-3.0.0/conf/spark-defaults.conf
spark.master                     spark://localhost.localdomain:7077

vi  /usr/spark/spark-3.0.0/conf/spark-env.sh

# export JAVA_HOME=/usr/java/jdk1.8.0_212
# export SCALA_HOME=/usr/scala/scala-2.13.1
# export SPARK_HOME=/usr/spark/spark-3.0.0

JAVA_HOME=/usr/java/jdk1.8.0_212
SCALA_HOME=/usr/scala/scala-2.13.1
SPARK_HOME=/usr/spark/spark-3.0.0

HADOOP_CONF_DIR=/usr/hadoop/hadoop-3.2.1/etc/hadoop

SPARK_MASTER_HOST=localhost.localdomain
SPARK_MASTER_PORT=7077
SPARK_MASTER_WEBUI_PORT=8080
SPARK_WORKER_CORES=1
SPARK_WORKER_MEMORY=1000m
SPARK_WORKER_PORT=7078
SPARK_WORKER_WEBUI_PORT=8081

8、重启虚拟机

9、启动Hadoop
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode

10、启动Spark
start-master.sh
start-all.sh

发布了377 篇原创文章 · 获赞 127 · 访问量 64万+

猜你喜欢

转载自blog.csdn.net/daqiang012/article/details/104125021