本节使用centos01、centos02和centos03这三个节点讲解Spark的两种集群运行模式:Spark Standalone模式和Spark On YARN模式的集群搭建。Standalone模式需要启动Spark集群,而Spark On YARN模式不需要启动Spark集群,只需要启动YARN集群即可。
由于Spark本身是用Scala语言写的,运行在JVM上,因此在搭建Spark集群环境之前需要先安装好JDK,建议JDK的版本在1.8以上。JDK的安装此处不做讲解。
Spark Standalone模式的集群搭建需要在集群的每个节点都安装Spark,集群角色分配如表2-1所示。
表2-1 Spark集群角色分配
集群搭建的操作步骤如下:
访问Spark官网(http://spark.apache.org/downloads.html)下载预编译的Spark安装包,选择Spark版本为3.2.1,包类型为Pre-built for Apache Hadoop 3.3 and later(Hadoop 3.3及以后的预编译版本)。
将下载的安装包spark-3.2.1-bin-hadoop3.2.tgz上传到centos01节点的/opt/softwares目录,然后进入该目录,执行以下命令,将其解压到目录/opt/modules中:
$ tar -zxvf spark-3.2.1-bin-hadoop3.2.tgz -C /opt/modules/
然后进入目录/opt/modules/中,重命名Spark安装目录:
$ mv spark-3.2.1-bin-hadoop3.2/ spark
Spark的配置文件都存放于安装目录下的conf目录,进入该目录,执行以下操作:
(1)修改workers文件
workers文件必须包含所有需要启动的Worker节点的主机名,且每个主机名占一行。
执行以下命令,复制workers.template文件为workers文件:
$ cp workers.template workers
然后修改workers文件,将其中默认的localhost改为以下内容:
centos02 centos03
上述配置表示将centos02和centos03节点设置为集群的从节点(Worker节点)。
(2)修改spark-env.sh文件
执行以下命令,复制spark-env.sh.template文件为spark-env.sh文件:
$ cp spark-env.sh.template spark-env.sh
然后修改spark-env.sh文件,添加以下内容:
export JAVA_HOME=/opt/modules/jdk1.8.0_144 export SPARK_MASTER_HOST=centos01 export SPARK_MASTER_PORT=7077
上述配置属性解析如下:
· JAVA_HOME:指定JAVA_HOME的路径。若集群中每个节点在/etc/profile文件中都配置了JAVA_HOME,则该选项可以省略,Spark集群启动时会自动读取。为了防止出错,建议此处将该选项配置上。
· SPARK_MASTER_HOST:指定集群主节点(Master)的主机名,此处为centos01。
· SPARK_MASTER_PORT:指定Master节点的访问端口,默认为7077。
在centos01节点中执行以下命令,将Spark安装文件复制到其他节点:
$ scp -r /opt/modules/spark/ hadoop@centos02:/opt/modules/ $ scp -r /opt/modules/spark/ hadoop@centos03:/opt/modules/
在centos01节点上进入Spark安装目录,执行以下命令,启动Spark集群:
$ sbin/start-all.sh
查看start-all.sh的源码,其中有以下两条命令:
# Start Master "${SPARK_HOME}/sbin"/start-master.sh # Start Workers "${SPARK_HOME}/sbin"/start-workers.sh
可以看到,当执行start-all.sh命令时,会分别执行start-master.sh命令启动Master,执行start-workers.sh命令启动Worker。
注意,若spark-evn.sh中配置了SPARK_MASTER_HOST属性,则必须在该属性指定的主机上启动Spark集群,否则会启动不成功;若没有配置SPARK_MASTER_HOST属性,则可以在任意节点上启动Spark集群,当前执行启动命令的节点即为Master节点。
启动完毕后,分别在各节点执行jps命令,查看启动的Java进程。若在centos01节点存在Master进程,centos02节点存在Worker进程,centos03节点存在Worker进程,则说明集群启动成功。
此时可以在浏览器中访问网址http://centos01:8080,查看Spark的WebUI,如图2-10所示。
图2-10 查看Spark的WebUI
Spark On YARN模式的搭建比较简单,仅需要在YARN集群的一个节点上安装Spark即可,该节点可作为提交Spark应用程序到YARN集群的客户端。Spark本身的Master节点和Worker节点不需要启动。
使用此模式需要修改Spark配置文件$SPARK_HOME/conf/spark-env.sh,添加Hadoop相关属性,指定Hadoop与配置文件所在目录,内容如下:
export HADOOP_HOME=/opt/modules/hadoop-3.3.1 export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
修改完毕后,即可运行Spark应用程序。例如,运行Spark自带的求圆周率的例子(注意提前将Hadoop HDFS和YARN启动),并且以Spark On YARN的cluster模式运行,命令如下:
$ bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode cluster \ /opt/modules/spark/examples/jars/spark-examples_2.12-3.2.1.jar
程序执行过程中,可在YARN的ResourceManager对应的WebUI中查看应用程序执行的详细信息,如图2-11所示。
图2-11 查看应用程序运行状态
Spark On YARN的cluster模式运行该例子的输出结果不会打印到控制台中,可以在图2-11的WebUI中单击ID列中的超链接,在Application详情页面的最下方单击Logs超链接,然后在新页面中单击stdout所属超链接,即可显示输出日志,而运行结果则在日志中,整个查看日志的过程如图2-12、图2-13所示。
图2-12 查看应用程序输出日志步骤1
可看到输出结果如下:
Pi is roughly 3.144715723578618
图2-13 查看应用程序输出日志步骤2
Spark Standalone和大部分Master/Slave模式一样,都存在Master单点故障问题,其解决方式是基于ZooKeeper实现两个Master无缝切换,类似HDFS的NameNode HA(High Availability,高可用)或YARN的ResourceManager HA。
Spark可以在集群中启动多个Master,并使它们都向ZooKeeper注册,ZooKeeper利用自身的选举机制保证同一时间只有一个Master是活动状态(Active)的,其他的都是备用状态(Standby)的。
当活动状态的Master出现故障时,ZooKeeper会从其他备用状态的Master选出一台成为活动Master,整个恢复过程大约在1分钟之内。对于恢复期间正在运行的应用程序,由于应用程序在运行前已经向Master申请了资源,运行时Driver负责与Executor进行通信,管理整个应用程序,因此Master的故障对应用程序的运行不会产生影响,但是会影响新应用程序的提交。
以Spark Standalone模式的client提交方式为例,其HA的架构如图2-14所示。
下面接着2.5.1节搭建好的Spark Standalone集群继续进行Spark HA的搭建,搭建前的角色分配如表2-2所示。
图2-14 Spark HA架构图
表2-2 Spark HA集群角色分配
具体搭建步骤如下:
步骤01 停止Spark集群。命令如下:
$ sbin/stop-all.sh
步骤02 修改配置文件。在centos01节点中修改Spark配置文件spark-env.sh,删除其中的SPARK_MASTER_IP属性配置,添加以下配置:
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=centos01:2181,centos02:2181,centos03:2181 -Dspark.deploy.zookeeper.dir=/spark"
上述配置参数解析如下:
· spark.deploy.zookeeper.url:指定ZooKeeper集群各节点的主机名与端口。
· spark.deploy.zookeeper.dir:指定Spark在ZooKeeper中注册的znode节点名称。
然后同步修改后的配置文件到集群其他节点,命令如下:
$ scp conf/spark-env.sh hadoop@centos02:/opt/modules/spark/conf/ $ scp conf/spark-env.sh hadoop@centos03:/opt/modules/spark/conf/
步骤03 启动ZooKeeper集群。
步骤04 启动Spark集群。在centos01节点上进入Spark安装目录,启动Spark集群,命令如下:
$ sbin/start-all.sh
需要注意的是,在哪个节点上启动的Spark集群,活动状态的Master就存在于哪个节点上。
在centos02节点上进入Spark安装目录,启动第二个Master(备用状态Master),命令如下:
$ sbin/start-master.sh
步骤05 查看各节点的进程。在各节点执行jps命令查看启动的Java进程。
centos01节点:
$ jps 5825 QuorumPeerMain 6105 Master 6185 Jps
centos02节点:
$ jps 6115 Jps 5701 QuorumPeerMain 5974 Worker 6056 Master
centos03节点:
$ jps 5990 Jps 5913 Worker 5645 QuorumPeerMain
步骤06 测试Spark HA。可以进入Spark Web界面查看两个Master的状态。默认Master的Web界面访问端口为8080,若与其他程序端口冲突(例如8080端口可能与ZooKeeper冲突),可以在Spark的配置文件spark-env.sh中添加以下内容,更改Master的Web界面访问端口(例如更改为8070):
SPARK_MASTER_WEBUI_PORT=8070
若更改了Web界面的访问端口,需重新启动Spark集群。
此时centos01节点Master的状态为ALIVE(即Active,活动状态),如图2-15所示。
图2-15 centos01节点的Master状态
centos02节点Master的状态为STANDBY(备用状态),如图2-16所示。
图2-16 centos02节点的Master状态
使用kill -9命令杀掉centos01节点的Master进程,稍等几秒后多次刷新centos02节点的Web界面,发现Master的状态由STANDBY首先变为RECOVERING(恢复,该状态持续时间非常短暂),最后变为ALIVE,如图2-17和图2-18所示。
图2-17 RECOVERING状态的Master
图2-18 ALIVE状态的Master
到此,Spark HA搭建完成。
此时,若需要连接Spark集群执行操作,--master参数的连接地址需改为spark://centos02:7077,例如以下代码:
$ bin/spark-shell \ --master spark://centos02:7077