您现在的位置是:首页 >技术交流 >spark环境部署(local、standalone、yarn)网站首页技术交流

spark环境部署(local、standalone、yarn)

书香恋仁心 2023-05-29 00:00:03
简介spark环境部署(local、standalone、yarn)

Spark运行环境

Spark作为一个数据处理框架和计算引擎,被设计在所有常见的集群环境中运行, 在国内工作中主流的环境为Yarn,不过逐渐容器式环境也慢慢流行起来。接下来,我们就分别看看不同环境下Spark的运行

Local模式

Local模式,就是不需要其他任何节点资源就可以在本地执行Spark代码的环境,一般用于教学,调试,演示等

1)将压缩包上传至Linux并解压到指定目录

[root@kk01 opt]# tar -zxvf spark-3.2.0-bin-hadoop3.2-scala2.13.tgz -C /opt/software/
[root@kk01 opt]# cd /opt/software/
[root@kk01 software]# mv spark-3.2.0-bin-hadoop3.2-scala2.13 spark-local

2)启动Local环境

# 进入解压缩后的路径,执行如下指令
[root@kk01 software]# cd spark-local/
[root@kk01 spark-local]# bin/spark-shell
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _ / _ / _ `/ __/  '_/
   /___/ .__/_,_/_/ /_/_   version 3.2.0
      /_/
         
Using Scala version 2.13.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_152)
Type in expressions to have them evaluated.
Type :help for more information.
23/04/13 07:08:48 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Spark context Web UI available at http://kk01:4040
Spark context available as 'sc' (master = local[*], app id = local-1681384129891).
Spark session available as 'spark'.

scala> 

3)输入网址进入web ui监控页面访问

http://kk01:4040   # 注意,这里的kk01是在hosts文件配置了ip地址映射,如果没有,默认填写ip

4)退出Local本地模式

两种方式:

1、直接按ctrl+c

2、输入Scala指令

:quit

5)提交应用

[root@kk01 bin]# ./spark-submit 
--class org.apache.spark.examples.SparkPi 
--master local[2] 
./examples/jars/spark-examples_2.13-3.2.0.jar 
10

# --class 表示要执行的程序的主类(可以可以根据我们自己编写的程序做出相应修改)
# --master local[2] 部署模式,默认为本地模式,数字表示分配的虚拟cpu核数量
# spark-examples_2.13-3.2.0.jar 运行的应用类所在的jar包(实际使用时可设定为我们自己打的jar报)
# 数字10表示程序的入口参数,用于设定当前应用的任务数量

Standalone模式

真实工作中还是要将应用提交到对应的集群中去执行,这里我们来看看只使用Spark自身节点运行的集群模式,也就是我们所谓的独立部署(Standalone)模式。Spark的Standalone模式体现了经典的master-slave模式

集群规划

kk01	Worker Master

kk02	Worker

kk03	worker

1)将压缩包上传至Linux并解压到指定目录

[root@kk01 opt]# tar -zxvf spark-3.2.0-bin-hadoop3.2-scala2.13.tgz -C /opt/software/
[root@kk01 opt]# cd /opt/software/
[root@kk01 software]# mv spark-3.2.0-bin-hadoop3.2-scala2.13 spark-standalone

2)修改配置文件

  • 进入spark-standalone/conf目录,修改workers.template文件名为workes
[root@kk01 software]# cd spark-standalone/conf/
[root@kk01 conf]# mv workers.template workers

  • 修改workes文件,添加worker节点
[root@kk01 conf]# vim workers
# 将文件内容替换为如下

kk01
kk02
kk03
  • 修改spark-env.sh.template文件名为spark-env.sh
[root@kk01 software]# cd /opt/software/spark-standalone/conf/
[root@kk01 software]# mv spark-env.sh.template spark-env.sh
  • 修改spark-env.sh文件,添加JAVA_HOME环境变量和集群对应的master节点
[root@kk01 conf]# vim spark-env.sh 
# 在文件末尾添加如下内容

export JAVA_HOME=/opt/software/jdk1.8.0_152
SPARK_MASTER_HOST=kk01
SPARK_MASTER_PORT=7077

# 注意:7077端口,相当于hadoop3内部通信的8020端口,此处的端口需要确认自己的Hadoop

3)分发spark-standalone目录

# 使用scp或rsync分发,scp或rsync区别在于 scp是完全拷贝 rsync只对差异文件进行拷贝
# 由于是第一次配置standalone模式,因此这里使用scp
[root@kk01 software]# scp -r /opt/software/spark-standalone/ root@kk02: /opt/software/spark-standalone/
[root@kk01 software]# scp -r /opt/software/spark-standalone/ root@kk02: /opt/software/spark-standalone/

# 如果定义了分发脚本 xsync ,则使用自定义脚本
[root@kk01 software]# xsync spark-standalone

4)启动集群

[root@kk01 spark-standalone]# sbin/start-all.sh 

5)查看服务器进程

[root@kk01 spark-standalone]# jps
2480 Master
2695 Jps
2586 Worker

[root@kk02 ~]# jps
2497 Jps
2414 Worker

[root@kk03 ~]# jps
2416 Worker
2499 Jps

6)查看Master资源监控Web UI界面

http://kk02:8080     # kk01这里默认是填写服务器ip,但是我们在hosts文件里映射了ip,因此填主机名也可以

7)提交应用

[root@kk01 spark-standalone]# bin/spark-submit 
--class org.apache.spark.examples.SparkPi 
--master spark://kk01:7077 
./examples/jars/spark-examples_2.13-3.2.0.jar 
10


# --class 表示要执行的程序的主类(可以可以根据我们自己编写的程序做出相应修改)
# --master spark://kk01:7077 独立部署模式,连接到Spark集群
# spark-examples_2.13-3.2.0.jar 运行的应用类所在的jar包
# 数字10表示程序的入口参数,用于设定当前应用的任务数量

  • 执行任务时,会产生多个Java进程

    ​ CoarseGrainedExecutorBackend 执行节点进程

    ​ SparkSumbit 提交节点进程

  • 执行任务时,默认采用服务器集群节点的总核数,每个节点内存1024M。

提交参数说明

在提交应用中,一般会同时一些提交参数

bin/spark-submit 
--class <main-class>
--master <master-url> 
... # other options
<application-jar> 
[application-arguments]

参数解释可选值举例
–classSpark程序中包含主函数的类
–masterSpark程序运行的模式(环境)模式:local[*]spark://linux1:7077、Yarn
–executor-memory 1G指定每个executor可用内存为1G
–total-executor-cores 2指定所有executor使用的cpu核数为2个
–executor-cores指定每个executor使用的cpu核数
application-jar打包好的应用jar,包含依赖。这个URL在集群中全局可见。 比如hdfs:// 共享存储系统,如果是file://path,那么所有的节点的path都包含同样的jar
application-arguments传给main()方法的参数

配置历史服务器

由于spark-shell停止掉后,集群监控kk01:4040页面就看不到历史任务的运行情况,所以开发时都配置历史服务器记录任务运行情况。

1)修改spark-defaults.conf.template文件名为spark-defaults.conf

[root@kk01 conf]# cd /opt/software/spark-standalone/conf/
[root@kk01 conf]# mv spark-defaults.conf.template spark-defaults.conf

2)修改spark-default.conf文件,配置日志存储路径

[root@kk01 conf]# vim spark-defaults.conf 
# 在文件末尾加入如下内容

spark.eventLog.enabled          true
spark.eventLog.dir               hdfs://kk01:8020/directory

注意:

​ 需要启动hadoop集群,HDFS上的directory目录需要提前存在。

3)在创建HDFS上的directory目录

[root@kk01 conf]# start-dfs.sh   # Hadoop配置了环境变量,脚本全局可用
[root@kk01 conf]# hadoop fs -mkdir /directory

4)修改spark-env.sh文件, 添加日志配置

[root@kk01 conf]# pwd
/opt/software/spark-standalone/conf
[root@kk01 conf]# vim spark-env.sh 

# 在文件中添加如下内容
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 
-Dspark.history.fs.logDirectory=hdfs://kk01:8020/directory 
-Dspark.history.retainedApplications=30"

# 参数说明
#	参数1含义:WEB UI访问的端口号为18080
#	参数2含义:指定历史服务器日志存储路径
#	参数3含义:指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数

5)分发配置文件

# 使用rsync命名更新差异文件    
# 因为我们只更改了conf目录下的文件,因此只分发conf目录即可
[root@kk01 spark-standalone]# rsync -av /opt/software/spark-standalone/conf/ root@kk02:/opt/software/spark-standalone/conf/

[root@kk01 spark-standalone]# rsync -av /opt/software/spark-standalone/conf/ root@kk02:/opt/software/spark-standalone/conf/

# 参数说明
#	-a 归档拷贝
#	-v 显示拷贝过程

6)重新启动集群和历史服务

# 先确保hdfs集群、spark集群关闭
[root@kk01 spark-standalone]# stop-dfs.sh 
[root@kk01 spark-standalone]# sbin/stop-all.sh 

# 重启
[root@kk01 spark-standalone]# start-dfs.sh 
[root@kk01 spark-standalone]# sbin/start-all.sh 
[root@kk01 spark-standalone]# sbin/start-history-server.sh

7)查看进程

[root@kk01 spark-standalone]# jps
5921 Master
6052 Worker
5558 DataNode
5371 NameNode
6235 Jps
6174 HistoryServer

3716 SecondaryNameNode
3816 Worker
3577 DataNode
3915 Jps

[root@kk03 ~]# jps
3344 DataNode
3476 Worker
3575 Jps

8)重新执行任务

[root@kk01 spark-standalone]# bin/spark-submit 
--class org.apache.spark.examples.SparkPi 
--master spark://linux1:7077 
./examples/jars/spark-examples_2.13-3.2.0.jar 
10

9)查看历史服务

确保历史服务可用

http://kk01:18080/

配置高可用(HA)

当前集群中的Master节点只有一个,所以会存在单点故障问题。所以为了解决单点故障问题,需要在集群中配置多个Master节点,一旦处于活动状态的Master发生故障时,由备用Master提供服务,保证作业可以继续执行。这里的高可用一般采用Zookeeper设置

集群规划

kk01	Worker ZooKeeper Master

kk02	Worker ZooKeeper Master

kk03	Worker ZooKeeper 

1)停止集群(可选)

在确保hdfs集群、spark集群停止的情况下,才开始配置HA

[root@kk01 spark-standalone]# sbin/stop-all.sh 
[root@kk01 spark-standalone]# stop-dfs.sh 

2)启动Zookeeper集群

[root@kk01 spark-standalone]# zkServer.sh start
[root@kk02 ~]# zkServer.sh start
[root@kk03 ~]# zkServer.sh start

# 也可以使用自定义脚本启动集群(如果你定义了的话)
[root@kk01 spark-standalone]# xzk.sh start

3)修改spark-env.sh文件添加如下配置

[root@kk01 conf]# pwd
/opt/software/spark-standalone/conf
[root@kk01 conf]# vim spark-env.sh 

注释如下内容:
#SPARK_MASTER_HOST=linux1
#SPARK_MASTER_PORT=7077

添加如下内容:
#Master监控页面默认访问端口为8080,但是可能会和Zookeeper冲突,所以改成8989,也可以自定义,访问UI监控页面时请注意
SPARK_MASTER_WEBUI_PORT=8989

export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER 
-Dspark.deploy.zookeeper.url=kk01,kk02,kk03 
-Dspark.deploy.zookeeper.dir=/spark"

参考配置文件如下

export JAVA_HOME=/opt/software/jdk1.8.0_152
#SPARK_MASTER_HOST=kk01
#SPARK_MASTER_PORT=7077

export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 
-Dspark.history.fs.logDirectory=hdfs://kk01:8020/directory 
-Dspark.history.retainedApplications=30"

#Master监控页面默认访问端口为8080,但是可能会和Zookeeper冲突,所以改成8989,也可以自定义,访问UI监控页面时请注意
SPARK_MASTER_WEBUI_PORT=8989

export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER 
-Dspark.deploy.zookeeper.url=kk01,kk02,kk03 
-Dspark.deploy.zookeeper.dir=/spark"

4)分发配置文件

[root@kk01 conf]# rsync -av /opt/software/spark-standalone/conf/ root@kk02:/opt/software/spark-standalone/conf/
[root@kk01 conf]# rsync -av /opt/software/spark-standalone/conf/ root@kk02:/opt/software/spark-standalone/conf/

5)启动集群

启动spark集群前先启动hdfs集群,确定历史服务器正常,当然也需要确保zookeeper集群正常启动

[root@kk01 conf]# start-dfs.sh  # 启动hdfs集群
[root@kk01 spark-standalone]# pwd
/opt/software/spark-standalone
[root@kk01 spark-standalone]# sbin/start-all.sh 

[root@kk01 spark-standalone]# sbin/start-history-server.sh 		# 启动历史服务进程

6) 启动kk02的单独Master节点,此时kk02节点Master状态处于备用状态

[root@kk02 ~]# cd /opt/software/spark-standalone/
[root@kk02 spark-standalone]# sbin/start-master.sh 

7)查看进程

[root@kk01 spark-standalone]# jps
7697 NameNode
8385 Worker
8504 Jps
7289 QuorumPeerMain
8250 Master
7884 DataNode
6174 HistoryServer   # 历史服务器进程

[root@kk02 spark-standalone]# jps
4688 SecondaryNameNode
4546 DataNode
4315 QuorumPeerMain
5003 Jps
4909 Master   # 备份master
4798 Worker

[root@kk03 ~]# jps
4256 Worker
4347 Jps
3884 QuorumPeerMain
4111 DataNode

8)提交应用到高可用集群

[root@kk01 spark-standalone]# bin/spark-submit 
--class org.apache.spark.examples.SparkPi 
--master spark://kk01:7077,kk02:7077 
./examples/jars/spark-examples_2.13-3.2.0.jar 
10

9)查看kk01的Master 资源监控Web UI

http://kk01:8989/ 

发现状态为 Status: ALIVE

10)手动停止kk01的Master资源监控进程

[root@kk01 spark-standalone]# jps
7697 NameNode
8385 Worker
7289 QuorumPeerMain
8250 Master
7884 DataNode
6174 HistoryServer
8910 Jps
[root@kk01 spark-standalone]# kill -9 8250

11) 查看kk02的Master 资源监控Web UI,稍等一段时间后,kk02节点的Master状态提升为活动状态

http://kk02:8989/   

状态变化

​ Status:STANDBY ====> Status: ALIVE

Yarn模式

独立部署(Standalone)模式由Spark自身提供计算资源,无需其他框架提供资源。这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。但是你也要记住,**Spark主要是计算框架,而不是资源调度框架,所以本身提供的资源调度并不是它的强项,所以还是和其他专业的资源调度框架集成会更靠谱一些。**所以接下来我们来学习在强大的Yarn环境下Spark是如何工作的(其实是因为在国内工作中,Yarn使用的非常多)。

1)上传并解压缩文件

将spark-3.2.0-bin-hadoop3.2-scala2.13.tgz文件上传到linux并解压缩,放置在指定位置。

[root@kk01 ~]# cd /opt/software/
[root@kk01 software]# rz

[root@kk01 software]# tar -zxvf spark-3.2.0-bin-hadoop3.2-scala2.13.tgz -C /opt/software/

2)重命名

[root@kk01 software]# mv spark-3.2.0-bin-hadoop3.2-scala2.13/ spark-yarn

3)修改配置文件
修改hadoop配置文件/opt/software/hadoop-3.2.2/etc/hadoop/yarn-site.xml

[root@kk01 hadoop]# pwd
/opt/software/hadoop-3.2.2/etc/hadoop
[root@kk01 hadoop]# vim yarn-site.xml 

# 添加如下内容
 <!-- 是否将对容器实施物理内存限制 生产中可产生改配置-->
<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
     <name>yarn.nodemanager.pmem-check-enabled</name>
     <value>false</value>
</property>
 <!-- 是否将对容器实施虚拟内存限制 生产中可产生改配置-->
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
     <name>yarn.nodemanager.vmem-check-enabled</name>
     <value>false</value>
</property>

4)同步修改的文件至所有服务器

[root@kk01 hadoop]# rsync -av /opt/software/hadoop-3.2.2/etc/hadoop/ root@kk02:/opt/software/hadoop-3.2.2/etc/hadoop/

[root@kk01 hadoop]# rsync -av /opt/software/hadoop-3.2.2/etc/hadoop/ root@kk03:/opt/software/hadoop-3.2.2/etc/hadoop/

5) 修改conf/spark-env.sh,添加JAVA_HOME和YARN_CONF_DIR配置

[root@kk01 hadoop]# cd /opt/software/spark-yarn/conf/
[root@kk01 conf]# mv spark-env.sh.template spark-env.sh
# 添加如下内容
export JAVA_HOME=/opt/software/jdk1.8.0_152
YARN_CONF_DIR=/opt/software/hadoop-3.2.2/etc/hadoop

6)启动HDFS集群、YARN集群

# 我们配置过Hadoop环境变量,因此可以直接使用脚本一键启动
[root@kk01 conf]# start-dfs.sh 
[root@kk01 conf]# start-yarn.sh 

7)提交应用

[root@kk01 spark-yarn]# pwd
/opt/software/spark-yarn
[root@kk01 spark-yarn]# bin/spark-submit 
--class org.apache.spark.examples.SparkPi 
--master yarn 
--deploy-mode cluster 
./examples/jars/spark-examples_2.13-3.2.0.jar 
10

查看http://kk01:8088页面,查看历史页面,查看任务调度情况,点击History,查看历史页面

配置历史服务器

1)修改spark-defaults.conf.template文件名为spark-defaults.conf

[root@kk01 spark-yarn]# cd conf/
[root@kk01 conf]# pwd
/opt/software/spark-yarn/conf
[root@kk01 conf]# mv spark-defaults.conf.template spark-defaults.conf

2)修改spark-default.conf文件**,配置日志存储路径**

[root@kk01 conf]# vim spark-defaults.conf 
# 在文件末尾加入如下内容

spark.eventLog.enabled          true
spark.eventLog.dir               hdfs://kk01:8020/directory

注意:

​ 需要启动hadoop集群,HDFS上的directory目录需要提前存在。

3)在创建HDFS上的directory目录

[root@kk01 conf]# start-dfs.sh   # Hadoop配置了环境变量,脚本全局可用
[root@kk01 conf]# hadoop fs -mkdir /directory

4)修改spark-env.sh文件, 添加日志配置

[root@kk01 conf]# pwd
/opt/software/spark-standalone/conf
[root@kk01 conf]# vim spark-env.sh 

# 在文件中添加如下内容
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 
-Dspark.history.fs.logDirectory=hdfs://kk01:8020/directory 
-Dspark.history.retainedApplications=30"

# 参数说明
#	参数1含义:WEB UI访问的端口号为18080
#	参数2含义:指定历史服务器日志存储路径
#	参数3含义:指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数

5)修改spark-defaults.conf

[root@kk01 conf]# vim spark-defaults.conf 

	
spark.yarn.historyServer.address=kk01:18080
spark.history.ui.port=18080

6)启动历史服务器

[root@kk01 conf]# cd ..
[root@kk01 spark-yarn]# sbin/start-history-server.sh 

7)重新提交应用

[root@kk01 spark-yarn]# bin/spark-submit 
--class org.apache.spark.examples.SparkPi 
--master yarn 
--deploy-mode client 
./examples/jars/spark-examples_2.13-3.2.0.jar 
10

8)Web页面查看日志

http://kk01:8088/cluster

http://kk01:18080/

部署模式对比

模式Spark安装机器数需启动的进程所属者应用场景
Local1Spark测试
Standalone3Master及WorkerSpark单独部署
Yarn1Yarn及HDFSHadoop混合部署

端口号

  • Spark查看当前Spark-shell运行任务情况端口号:4040(计算)

  • Spark Master内部通信服务端口号:7077

  • Standalone模式下,Spark Master Web端口号:8080(资源)

  • Spark历史服务器端口号:18080

  • Hadoop YARN任务运行情况查看端口号:8088

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。