带你理解并亲手实践 Spark HA 部署配置及运行模式

公众号『数人之道』原创文章,欢迎关注获取更多数据知识、干货、资讯!

文章大纲

由于 Spark 是计算框架,还需要有底层存储系统、资源协调管理、分布式协作管理等框架等进行支撑,因此我们这里使用在《万字+50图,详解 Hadoop HA 完全分布式部署配置及运行调试》中部署的 Hadoop 作为 Spark 的存储及管理系统,在此基础上以 HA 模式来安装部署并运行 Spark 集群。

1.安装 Spark

使用 hadoop 用户将下载的 Spark 压缩包上传到 hadoop100 机器的 /opt/softwares 目录,这里使用的是 3.2.1 最新版本。

官网下载地址:

https://spark.apache.org/downloads.html

若速度太慢,可到国内的镜像站点下载,例如清华的:

https://mirrors.tuna.tsinghua.edu.cn/apache/spark

将 Spark 压缩包解压到 /opt/modules 目录下安装:

tar -zxvf /opt/softwares/spark-3.2.1-bin-without-hadoop.tgz -C /opt/modules/
图1-1:注意选择 Spark 安装包版本及类型

注意按照 Hadoop 的版本来选择 Spark 安装包类型。由于这里用的是之前已经安装好的 Hadoop,因此选择的是不带 Hadoop 的 Spark 安装包。

2.配置 Spark

服务器规划如下:

hadoop100 作为主节点、hadoop101 作为备用主节点及从节点,运行 Master 及 Worker 服务;hadoop102 作为从节点,运行 Worker 服务。

2.1.配置 spark-env.sh

修改 Spark 的 /conf 目录下 spark-env.sh 文件中的参数配置:

cp spark-env.sh.template spark-env.sh
vim spark-env.sh

在文件末尾添加配置内容:

export JAVA_HOME=/opt/modules/jdk1.8.0_301
export HADOOP_HOME=/opt/modules/app/hadoop-2.10.1
export SPARK_DIST_CLASSPATH=$(/opt/modules/app/hadoop-2.10.1/bin/hadoop classpath)
export HADOOP_CONF_DIR=/opt/modules/app/hadoop-2.10.1/etc/hadoop
export YARN_CONF_DIR=/opt/modules/app/hadoop-2.10.1/etc/hadoop
export SPARK_HOME=/opt/modules/spark
export SPARK_MASTER_WEBUI_PORT=8089
export SPARK_WORKER_MEMORY=1g
export SPARK_WORKER_CORES=1
export SPARK_WORKER_INSTANCES=1

参数含义解析:

  • JAVA_HOME:Java 安装目录
  • SCALA_HOME:Scala 安装目录(若没安装,可不配置)
  • HADOOP_HOME:Hadoop 安装目录
  • SPARK_DIST_CLASSPATH:Hadoop 命令所在目录(若安装的为不带 Hadoop 类型的 Spark,则需要进行配置),格式为:(HADOOP_HOME/bin/hadoop classpath)
  • HADOOP_CONF_DIR:Hadoop 集群的配置文件路径(YARN 模式下需要进行配置)
  • YARN_CONF_DIR:YARN 的配置文件路径(YARN 模式下需要进行配置)
  • SPARK_HOME:Spark 安装目录(YARN 模式下需要进行配置)
  • SPARK_MASTER_IP:Spark 集群的 Master 节点的 IP 地址(建议不配置)
  • SPARK_MASTER_PORT:Mater 实例绑定的端口(默认 7077)
  • SPARK_MASTER_WEBUI_PORT:Master Web UI 的端口(默认 8080,由于此端口号太常用,建议修改)
  • SPARK_WORKER_WEBUI_PORT:Worker Web UI 的端口(默认 8081)
  • SPARK_WORKER_PORT:Worker 绑定的端口(默认随机)
  • SPARK_WORKER_MEMORY:每个 Worker 节点能够最大分配给 Executors 的内存上限,如 1000m,2g(默认为本机全部内存减去 1GB)
  • SPARK_WORKER_CORES:每个 Worker 节点所占用本机的 CPU Cores 数目(默认为本机全部 CPU Cores)
  • SPARK_WORKER_INSTANCES:每个节点机器上可启动的 Workers 实例数目(默认为 1 个);注意,若设置的个数大于 1,则需要配置 SPARK_WORKER_CORES 参数,来显式地限制每一个 Worker 实例使用的 CPU Cores 数目,不然默认值下,每一个 Worker 实例都会使用全部的 CPU,造成资源争抢。

若使用 Zookeeper 对 Standalone 模式下的 Spark 集群进行分布式协作管理,还需要增加 SPARK_DAEMON_JAVA_OPTS(通用 JVM 参数)中的以下选项配置内容,格式为“-Dx=y” (默认为空):

export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=hadoop100:2181,hadoop101:2181,hadoop102:2181 -Dspark.deploy.zookeeper.dir=/spark"

选项说明:

1. spark.deploy.recoveryMode

设置 Spark 集群的恢复模式,这里设置为使用 Zookeeper,即整个集群状态及其恢复是通过 Zookeeper 来进行分布式协作维护的。

就是说用 Zookeeper 做了 Spark Standalone 模式下的 HA 配置。Master(Alive)挂掉的话,Master(Standby)要想成为 Master(Alive),就要参与 Zookeeper 的选举机制,然后恢复所有 Workers、Driver 和 Applications 的状态信息。

2. spark.deploy.zookeeper.url

设置 Zookeeper 的节点机器地址及端口号。

3. spark.deploy.zookeeper.dir

Zookeeper 中保存 spark 的元数据目录,用于存储 Spark 集群的所有状态信息,包括所有的 Workers、Driver 和 Applications 信息及 Spark 的作业运行状态等。默认为 /spark。

图2-1:spark-env.sh 文件配置

注意:若安装的 Spark 为不带 Hadoop 的类型,则必须配置 SPARK_DIST_CLASSPATH 参数,否则启动 Spark 集群会报错。

2.2.配置 workers

在 Spark Standalone 集群模式下,Spark 是通过读取 /conf 目录下的 workers 文件进行所有集群机器服务启动的,因此还需要修改此文件配置。

cp workers.template workers
vim workers

此文件罗列了所有 Worker 节点服务器的主机名,Spark 的运维脚本会依次迭代访问每一行来启动所有的 Worker 节点服务器进程,跟 Hadoop 的 slaves 及 HBase 的 regionservers 配置文件作用类似。

根据规划,添加 Worker 节点服务器的主机名至 workers 配置文件中:

hadoop100
hadoop101
hadoop102

注意:该文件中添加的内容,结尾不允许有空格,且文件中不允许有空行。

2.3.配置 yarn-site.xml

若使用 YARN 模式运行 Spark, 建议修改 Hadoop 下的 yarn-site.xml 文件中以下参数的配置:

1. yarn.nodemanager.vmem-check-enabled

此参数用以设置是否检查 YARN 的 NodeManager(NM) 的虚拟内存,默认为 true,即检查。

这里修改为 false,不进行检查,否则虚拟内存不足时,NM 启动的 Container 会被杀掉,无法运行 Spark 程序。

添加以下内容修改此参数值,设置不检查 NM 使用的虚拟内存:

<property>
  <name>yarn.nodemanager.vmem-check-enabled</name>
  <value>false</value>
</property>

2. yarn.nodemanager.vmem-pmem-ratio

此参数用以指定 YARN 的 NodeManager(NM) 使用的虚拟内存率(虚拟内存大小/物理内存大小),默认为 2.1。

这里设置为 4,即物理内存大小的 4 倍,作为 NM 启动的 Container 的运行虚拟内存上限。

添加以下内容修改此参数值,指定 NM 使用的虚拟内存率:

<property>
  <name>yarn.nodemanager.vmem-pmem-ratio</name>
  <value>4</value>
</property>
图2-2:yarn-site.xml 文件配置

可根据资源及实际使用情况进行合适的参数设置。

3.分发文件

在 hadoop100 机器上完成 Spark 的安装及配置后,将 Spark 文件分发到另外两台节点机器上,并添加环境变量。

3.1.分发 Spark 文件

使用 scp 安全拷贝的方式,将 hadoop100 上的 Spark 文件分发给另外两台节点机器:

scp -r /opt/modules/spark/ hadoop@hadoop101:/opt/modules/
scp -r /opt/modules/spark/ hadoop@hadoop102:/opt/modules/

使用 scp 安全拷贝的方式,将 hadoop100 上的 yarn-site.xml 配置文件分发给另外两台节点机器:

scp -r /opt/modules/app/hadoop-2.10.1/etc/hadoop/yarn-site.xml hadoop@hadoop101:/opt/modules/app/hadoop-2.10.1/etc/hadoop/
scp -r /opt/modules/app/hadoop-2.10.1/etc/hadoop/yarn-site.xml hadoop@hadoop102:/opt/modules/app/hadoop-2.10.1/etc/hadoop/

分发完成后登录另外两台节点机器进行检查。

3.2.添加 Spark 环境变量

在三台机器上编辑环境变量 /etc/profile 文件,追加 Spark 的环境变量:

##SPARK_HOME
export SPARK_HOME="/opt/modules/spark"
export PATH=$PATH:$SPARK_HOME/bin

执行以下命令使环境变量配置生效:

source /etc/profile

检查环境变量配置是否成功:

图3-1:检查 Spark 环境变量配置

当然也可以使用分发文件的方式,配置 hadoop100 机器上的环境变量后将配置文件分发至其它机器上。

注意:这里不建议将 Spark 的 sbin 目录加入环境变量,因为 Spark 的启动脚本名称是 start-all,会跟很多其他组件的启动脚本名称产生冲突。

4.启动集群

由于这里配置的 Spark 在 Standalone 模式下需要依赖于 Hadoop 的 HDFS 集群作为存储及 Zookeeper 集群进行分布式协作管理;在 YARN 模式下需要依赖于 Hadoop 的 YARN 集群进行资源协调调度管理。

因此在 Standalone 模式下,启动 Spark 集群前需要确保 Hadoop 的 HDFS 集群及 Zookeeper 集群已启动并正常运行;在 YARN 模式下,无需启动 Spark 集群,但需要确保 Hadoop 的 HDFS 集群及 YARN 集群、Zookeeper 集群已启动并正常运行。

4.1.启动 Zookeeper 集群

启动 Zookeeper 集群,确保 Zookeeper 的服务正常运行,若已启动可忽略此步骤。

启动方法详见《万字+50图,详解 Hadoop HA 完全分布式部署配置及运行调试》的 3.4 节“启动 Zookeeper”。

4.2.启动 HDFS 集群

启动 HDFS 集群,确保 HDFS 的服务正常运行,若已启动可忽略此步骤。

启动方法详见《万字+50图,详解 Hadoop HA 完全分布式部署配置及运行调试》的 4.4 节“启动 HDFS 集群”。

4.3.启动 YARN 集群(YARN 模式)

在 Standalone 模式下运行 Spark,不要启动 YARN 集群;在 YARN 模式下运行 Spark,需要启动 YARN 集群。

因为在 YARN 模式下,启动 YARN 集群即可实现资源协调管理功能,若再启用 Spark,YARN 就会跟 Spark 内置的资源管理器(Master)发生资源争抢。

启动方法详见《万字+50图,详解 Hadoop HA 完全分布式部署配置及运行调试》的 5.3 节“启动 YARN 集群”。

4.4.启动 Spark 集群(Standalone 模式)

在 Standalone 的模式下运行 Spark,需要启动 Spark 集群;在 YARN 模式下运行 Spark,不要启动 Spark 集群

原因同上。换句话说,Spark 集群跟 YARN 集群是互斥的,不能同时启动。启动 Spark 集群则使用 Local 或 Standalone 模式运行 Spark;启动 YARN 集群则使用 YARN 模式运行 Spark。

在主节点机器 hadoop100 上执行以下命令:

$SPARK_HOME/sbin/start-all.sh

Spark 会进行集群群起,在 hadoop100 上启动 Master 及 Worker 服务,在 hadoop101 及 hadoop102 上自动启动 Worker 服务。

由于按照服务器规划,hadoop101 还需要作为 Spark 集群的备用主节点,因此还需要到 hadoop101 节点上执行以下命令,启动 Master 服务:

$SPARK_HOME/sbin/start-master.sh

在三台节点机器上使用 jps 检查 Spark 集群启动的情况:

图4-1:检查 Spark 集群启动情况

至此,集群即启动完毕。

5.运行调试

下面我们对 Standalone 模式下的 Spark 集群的 HA 进行验证,并在 Local 单机、Standalone 集群、YARN 集群三种模式下执行 Spark 程序,来进行运行调试。

5.1.查看 Spark 集群的 Web 页面

使用 Master 节点的地址(端口号为 8089)登录 Spark 的 Master Web 客户端页面,可查看 Spark 的状态、Worker 数量、作业运行情况等信息:

图5-1-1:Spark 集群主节点 Web 页面
图5-1-2:Spark 集群备用主节点 Web 页面

可以看到 hadoop100 及 hadoop101 都是 Spark 集群的主节点,运行 Master 服务,前者为 ALIVE 状态,后者为 STANDBY 状态。

5.2.验证 Spark 集群的 HA

验证 Spark 集群在 Standalone 模式下的 HA 是否可用:

1. 将 hadoop100 节点上的 Master 进程杀掉:

在 hadoop100 机器上执行 jps 命令查看 Master 的进程 pid:

图5-2-1:查看 Master 进程 pid

执行 kill 命令强制杀掉 Master 进程:

kill -9 6714

2. 观察 hadoop100 节点上的 Spark 是否已经无法访问:

图5-2-2:杀掉主节点 Master 进程后无法访问

3. 等待 1-2 分钟后,在 Web 页面上查看 hadoop101 节点上的 Spark 是否是 ALIVE 状态:

图5-2-3:备用主节点成功切换为 ALIVE 状态

可以看到 hadoop101 节点上的 Spark 已经自动切换到 ALIVE 状态,表明故障自动切换成功,Spark 集群的 HA 可用

5.3.Local 模式下执行 Spark 程序

在 hadoop100 节点上运行以下 spark-submit 命令,使用 Local 单机模式执行 Spark 程序:

spark-submit --class org.apache.spark.examples.SparkPi \\
--master local[2] \\
--jars /opt/modules/spark/examples/jars/spark-examples_2.12-3.2.1.jar \\
100

参数含义解析:

  • --master:master 的地址,表示提交任务到哪里执行,如 local[2] 为提交到本地执行,spark://host:port 为提交到 Spark 集群执行,yarn 为提交到 YARN 集群执行(local 后的数字表示用本地多少个线程来模拟集群运行,设置为 * 表示使用本地所有线程数量)
  • --class:应用程序的主类,仅针对 Java 或 Scala 应用
  • --jars:执行的 jar 包,多个的时候用逗号分隔,这些传入的 jar 包将包含在 Driver 和 Executor 的 classpath 下
  • 1000:SparkPi 类中可传入的参数,数字越大,结果越准确
图5-3-1:Local 模式运行 spark-submit 命令
图5-3-2:查看命令运行结果

Spark 程序执行的过程及结果可在本地查看。

5.4.Standalone 模式下执行 Spark 程序

在 hadoop101 节点上运行以下 spark-submit 命令,使用 Standalone 集群模式执行 Spark 程序:

spark-submit --class org.apache.spark.examples.SparkPi \\
--master spark://hadoop101:7077 \\
--executor-memory 500m \\
--total-executor-cores 1 \\
--jars /opt/modules/spark/examples/jars/spark-examples_2.12-3.2.1.jar \\
1000

参数含义解析:

  • --executor-memory:每个 Executor 使用的内存大小上限,默认为 1g,这里修改限定为 500m
  • --total-executor-cores:所有 Executors 使用的 CPU 总 Cores 数上限,仅在 Standalone 或 Mesos 模式下适用
图5-4-1:Standalone 模式运行 spark-submit 命令
图5-4-2:Spark Web 页面查看命令运行过程
图5-4-3:Spark Web 页面查看命令运行输出

默认使用 Client 模式运行 Spark 程序,执行的过程及结果可在本地或 Spark 集群的 Web 页面查看。

5.5.YARN 模式下执行 Spark 程序

在 hadoop100 节点上执行以下命令停止 Spark 集群:

$SPARK_HOME/sbin/stop-all.sh

再到 hadoop101 节点上执行以下命令停止 Master 服务:

$SPARK_HOME/sbin/stop-master.sh

按照《万字+50图,详解 Hadoop HA 完全分布式部署配置及运行调试》的 5.3 节的方法启动 YARN 集群。

在 hadoop101 节点上运行以下 spark-submit 命令,使用 YARN 集群模式执行 Spark 程序:

spark-submit --class org.apache.spark.examples.SparkPi \\
--master yarn \\
--deploy-mode cluster \\
--driver-memory 500m \\
--executor-memory 500m \\
--num-executors 2 \\
/opt/modules/spark/examples/jars/spark-examples_2.12-3.2.1.jar

参数含义解析:

  • --deploy-mode:在哪里启动 Spark 的 Driver,默认为 client,即在本地启动,这里设置为 cluster,即在 cluster 上启动
  • --driver-memory:Driver 使用的内存大小上限,默认为 1g,这里修改限定为 500m
  • --num-executors:启动的 Executors 数量,默认为 2,仅在 YARN 模式下适用
图5-5-1:YARN 模式运行 spark-submit 命令

执行过程中可以看到,需要执行的 jar 包被上传到 HDFS 中。

图5-5-2:YARN Web 页面查看命令运行过程
图5-5-3:YARN Web 页面查看命令运行输出

由于使用 Cluster 模式运行 Spark 程序,执行的过程及结果需要在 YARN 集群的 Web 页面查看。

在 YARN 模式下,Spark 作业的运行流程

图5-5-4:YARN-Cluster 模式下 Spark 作业运行流程

ResourceManager 取代了 Spark 中的 Master,实现资源协调分配功能,告知 Spark 中的 Driver 哪里有空闲资源(NodeManager)来执行 Tasks;

然后 NodeManager 取代了 Spark 中的 Worker,将 Driver 作为一个 ApplicationMaster 在 YARN 集群中启动,并向 ResourceManager 申请资源;

接着 NodeManager 会在 Container 中启动 Executor 来执行 ApplicationMaster 分配的 Tasks 并监控运行状态;

运行完成后,ApplicationMaster 会向 ResourceManager 申请注销并关闭自己。

YARN-Client 与 YARN-Cluster 的区别

从深层次的含义来说,YARN-Client 和 YARN-Cluster 模式的区别其实就是 ApplicationMaster 进程运行的区别

图5-5-5:YARN-Client 模式
图5-5-6:YARN-Cluster 模式
  • 在 YARN-Client 模式下,Spark 的 Driver 运行在 Client Application 中,作为 ApplicationMaster 向 ResourceManager 请求 Executor,Client 会和请求的 Container 通信来调度他们工作,也就是说 Client 不能离开
  • 在 YARN-Cluster 模式下,Spark 的 Driver 运行在 ApplicationMaster 中,负责向 ResourceManager 申请资源(NodeManager),并监督作业的运行状况,当用户提交了作业之后,就可以关掉 Client,作业会继续在 YARN 上运行,因而 YARN-Cluster 模式不适合运行交互类型的作业。
本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
带你理解并亲手实践 Spark HA 部署配置及运行模式
由于 Spark 是计算框架,还需要有底层存储系统、资源协调管理、分布式协作管理等框架等进行支撑,因此我们这里使用在《万字+50图,详解 Hadoop HA 完...
<<上一篇
下一篇>>