01-Spark环境部署

1 Spark的部署方式介绍

​ Spark部署模式分为Local模式(本地模式)集群模式(集群模式又分为Standalone模式、Yarn模式和Mesos模式)

1.1 Local模式

Local模式常用于本地开发程序与测试,如在idea中

1.2 Standalone模式

​ Standalone模式被称为集群单机模式。Spark与Hadoop1.0版本有点类似,Spark本身自带了完整的资源调度管理服务(但这不是它的强项,因为Spark主要是一个计算框架),可以独立部署到集群中,无须依赖任何其他的资源管理系统,在该模式下,Spark集群架构为主从模式,即一台Master节点与多台Slave节点,Slave节点启动的进程名称为Worker,此时集群会存在单点故障。(单点故障可利用Spark HA 与zookeeper解决)

这种模式下, Driver 和 Worker 是启动在节点上的进程,运行在JVM 中的进程

  • Driver 与集群节点之间有频繁的通信
  • Driver 负责任务(task)的分发和结果的回收 即任务的调度。如果task的计算结果非常大就不要回收了。会造成OOM
  • Worker 是 Standalone 资源调度框架里面资源管理的从节点,也是JVM进程
    • 管理每个节点中的资源状态,启动进程,执行Task任务
  • Master 是 Standalone 资源调度框架里面资源管理的主节点,也是JVM进程
    • 管理所有资源状态

简单来说:

Master类似于 yarn的 RM,Driver类似于 yarn的 AM(ApplicationMaster),Slaves类似于 yarn的 NM

​ Worker、Master是常驻进程、Driver是当有任务来时才会启动

1.3 Yarn模式

​ Yarn模式被称为 Spark on Yarn 模式,即把Spark作为一个客户端,将作业提交给Yarn服务,由于在生产环境中,很多时候要与Hadoop使用同一个集群,因此采用Yarn来管理资源调度,可以有效提高资源利用率

Yarn模式又分为Yarn Cluster模式、Yarn Client模式

  • Yarn Cluster:用于生产环境,所以的资源调度和计算都在集群上运行
  • Yarn Client:用于交互、调试环境

若要基于 yarn 来进行资源调度,必须实现 ApplicationMaster 接口,Spark 实现了这个接口,所以可以基于 Yarn 来进行资源调度

1.4 Mesos模式

​ Mesos模式被称为 Spark on Mesos 模式,Mesos与Yarn同样是一款资源调度管理系统,可以为Spark提供服务,由于Spark与Mesos存在密切的关系,因此在设计Spark框架时充分考虑到了对Mesos的集成,但如果同时运行Hadoop和Spark,从兼容性的角度来看,Spark on Yarn是更好的选择

1.5 小结

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

2 Spark环境部署

2.1 Local模式

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

这种模式最为简单,解压即用不需要进入任何配置

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

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

2)配置文件spark-env.sh

[nhk@kk01 conf]$ pwd
/opt/software/spark-local/conf
[nhk@kk01 conf]$ cp spark-env.sh.template spark-env.sh
[nhk@kk01 conf]$ vim spark-env.sh
# 添加如下配置JAVA_HOME=/opt/software/jdk1.8.0_152
SCALA_HOME=/opt/software/scala-2.13.5HADOOP_CONF_DIR=/opt/software/hadoop-3.1.3/etc/hadoop

3)启动spark shell

命令

spark-shell -master local | local[k]| local[*]   # 建议 k>= 2

其中k表示启动线程数目(CPU Core核数)

Value
localRuns Spark locally with one worker thread. There will be no multiple threads running in parallel
local[k]Runs Spark locally with k number of threads.( K is ideally the number of cores in your machine.)
local[*]Runs Spark locally with a number of worker threads that equals the number of logical cores in your machine.
# 进入解压缩后的路径,执行如下指令
[nhk@kk01 software]$ cd spark-local/
[nhk@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 或 ctrl+d

2、输入Scala指令

:quit

5)提交应用

[nhk@kk01 spark-local]$ 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表示程序的入口参数,用于设定当前应用的任务数量

2.2 Standalone模式

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

Spark的 Standalone 模式体现了经典的master-slave模式

注意:

​ 搭建集群之前需要确认 jdk版本为8

0)集群规划

kk01kk02kk03
Worker MasterWorkerWorker

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

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

2)修改配置文件

  • 进入spark-standalone/conf目录,修改workers.template文件名为workes(保守做法可以选择复制)
[nhk@kk01 software]$ cd spark-standalone/conf/
[nhk@kk01 conf]$ cp workers.template workers
  • 修改workes文件,添加worker节点
[nhk@kk01 conf]$ vim workers
# 将文件内容替换为如下kk01
kk02
kk03
  • 修改spark-env.sh.template文件名为spark-env.sh (保守做法可以选择复制)
[nhk@kk01 conf]$ cd /opt/software/spark-standalone/conf/
[nhk@kk01 conf]$ cp spark-env.sh.template spark-env.sh
  • 修改spark-env.sh文件,添加JAVA_HOME环境变量和集群对应的master节点
[nhk@kk01 conf]$ vim spark-env.sh 
# 在文件末尾添加如下内容# 配置 jdk 环境
export JAVA_HOME=/opt/software/jdk1.8.0_152
# 配置 Master 的 IP 端口
export SPARK_MASTER_HOST=kk01
export SPARK_MASTER_PORT=7077# 注意:7077端口,相当于kk01内部通信的8020端口(此处的端口需要确认自己的Hadoop)

3)分发spark-standalone目录

# 使用scp或rsync分发,scp或rsync区别在于 scp是完全拷贝 rsync只对差异文件进行拷贝# 由于是第一次配置standalone模式,因此这里使用scp
[nhk@kk01 software]$ scp -r /opt/software/spark-standalone/ kk02:/opt/software/spark-standalone/
[nhk@kk01 software]$ scp -r /opt/software/spark-standalone/ kk03:/opt/software/spark-standalone/# 如果定义了分发脚本 xsync ,则使用自定义脚本
[nhk@kk01 software]$ xsync spark-standalone

4)启动集群

[nhk@kk01 spark-standalone]$ sbin/start-all.sh 

5)查看服务器进程

[nhk@kk01 spark-standalone]$ jps
2480 Master
2695 Jps
2586 Worker[nhk@kk02 ~]$ jps
2497 Jps
2414 Worker[nhk@kk03 ~]$ jps
2416 Worker
2499 Jps

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

http://kk01:8080

注意:

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

7)提交应用(client模式)

[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 提交节点进程

    [nhk@kk01 ~]$ jps
    2611 DataNode
    3027 ResourceManager
    3171 NodeManager
    3687 Master
    3783 Worker
    2473 NameNode
    3581 JobHistoryServer
    4205 Jps
    3998 SparkSubmit
    
  • 执行任务时,默认采用服务器集群节点的总核数,每个节点内存1024M。

任务执行流程

  1. client 模式提交任务后,会在客户端启动 Driver进程
  2. Driver 回向 Master 申请启动 Application 启动的资源
  3. 资源申请成功,Driver 端将 task 分发到worker 端执行,启动 executor进程(任务的分发)
  4. Worker 端(executor进程) 将task 执行结果返回到 Driver 端(任务结果的回收)

提交参数说明

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

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()方法的参数

总结:

​ **client模式适用于测试调试程序。**Driver进程是在客户端启动的,这里的客户端指的是提交应用程序的当前节点。在Driver端可以看到 task执行的情况

​ **生成环境中不能使用client模式。**因为:假设要提交100个application 到集群运行,Driver每次都会在 client端启动,那么就会导致客户端100网卡流量暴增的问题。

8)提交应用(cluster模式)

[nhk@kk01 spark-standalone]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://kk01:7077 \
--deploy-mode cluster \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10

2.3 standalone配置历史服务器

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

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

[nhk@kk01 conf]$ cd /opt/software/spark-standalone/conf/
[nhk@kk01 conf]$ cp spark-defaults.conf.template spark-defaults.conf

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

[nhk@kk01 conf]$ vim spark-defaults.conf 
# 在文件末尾加入如下内容spark.eventLog.enabled          true
spark.eventLog.dir               hdfs://kk01:8020/spark-history 

注意:

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

3)在创建HDFS上的spark-history 目录

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

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

[nhk@kk01 conf]$ pwd
/opt/software/spark-standalone/conf
[nhk@kk01 conf]$ vim spark-env.sh # 在文件中添加如下内容
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 
-Dspark.history.fs.logDirectory=hdfs://kk01:8020/spark-history
-Dspark.history.retainedApplications=30"# 参数说明
#	参数1含义:WEB UI访问的端口号为18080
#	参数2含义:指定历史服务器日志存储路径
#	参数3含义:指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数

5)分发配置文件

# 使用rsync命名更新差异文件  # 因为我们只更改了conf目录下的文件,因此只分发conf目录即可
[nhk@kk01 spark-standalone]$ rsync -av /opt/software/spark-standalone/conf/ kk02:/opt/software/spark-standalone/conf/[nhk@kk01 spark-standalone]$ rsync -av /opt/software/spark-standalone/conf/ kk02:/opt/software/spark-standalone/conf/# 参数说明
#	-a 归档拷贝
#	-v 显示拷贝过程

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

# 先确保hdfs集群、spark集群关闭
[nhk@kk01 spark-standalone]$  stop-dfs.sh 
[nhk@kk01 spark-standalone]$  sbin/stop-all.sh # 重启
[nhk@kk01 spark-standalone]$ start-dfs.sh 
[nhk@kk01 spark-standalone]$ sbin/start-all.sh 
[nhk@kk01 spark-standalone]$ sbin/start-history-server.sh

7)查看进程

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

8)重新执行任务

[nhk@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

9)查看历史服务

确保历史服务可用

http://kk01:18080/

2.4 standalone配置高可用(HA)基于Zookeeper

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

集群规划

kk01	Worker ZooKeeper Masterkk02	Worker ZooKeeper Masterkk03	Worker ZooKeeper 

1)停止集群(可选)

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

[nhk@kk01 spark-standalone]$ sbin/stop-all.sh 
[nhk@kk01 spark-standalone]$ stop-dfs.sh 

2)启动Zookeeper集群

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

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

[nhk@kk01 conf]$ pwd
/opt/software/spark-standalone/conf
[nhk@kk01 conf]$ vim spark-env.sh注释如下内容:
#SPARK_MASTER_HOST=kk01
#SPARK_MASTER_PORT=7077添加如下内容:
#Master监控页面默认访问端口为8080,但是可能会和Zookeeper冲突,所以改成8989,也可以自定义,访问UI监控页面时请注意
SPARK_MASTER_WEBUI_PORT=8989export 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=7077export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 
-Dspark.history.fs.logDirectory=hdfs://kk01:8020/spark-history 
-Dspark.history.retainedApplications=30"#Master监控页面默认访问端口为8080,但是可能会和Zookeeper冲突,所以改成8989,也可以自定义,访问UI监控页面时请注意
SPARK_MASTER_WEBUI_PORT=8989export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER 
-Dspark.deploy.zookeeper.url=kk01,kk02,kk03 
-Dspark.deploy.zookeeper.dir=/spark"

4)分发配置文件

[nhk@kk01 conf]$ rsync -av /opt/software/spark-standalone/conf/ kk02:/opt/software/spark-standalone/conf/[nhk@kk01 conf]$ rsync -av /opt/software/spark-standalone/conf/ kk03:/opt/software/spark-standalone/conf/

5)启动集群

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

[nhk@kk01 conf]$ start-dfs.sh  # 启动hdfs集群[nhk@kk01 spark-standalone]$ pwd
/opt/software/spark-standalone
[nhk@kk01 spark-standalone]$ sbin/start-all.sh [nhk@kk01 spark-standalone]$ sbin/start-history-server.sh 	# 启动历史服务进程

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

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

7)查看进程

[nhk@kk01 spark-standalone]$ jps
7697 NameNode
8385 Worker
8504 Jps
7289 QuorumPeerMain
8250 Master
7884 DataNode
6174 HistoryServer   # 历史服务器进程[nhk@kk02 spark-standalone]$ jps
4546 DataNode
4315 QuorumPeerMain
5003 Jps
4909 Master   # 备份master
4798 Worker[nhk@kk03 ~]$ jps
4688 SecondaryNameNode
4256 Worker
4347 Jps
3884 QuorumPeerMain
4111 DataNodes

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

[nhk@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资源监控进程

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

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

http://kk02:8989/

状态变化

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

2.5 Yarn模式

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

注意:

Spark on Yarn 不需要单独开启spark相关的进程

Spark On Yarn的本质

  • Master 角色由YARN的 ResourceManager 担任
  • Worker 角色由YARN的 NodeManager 担任
  • Driver 角色运行在YARN容器内 或 提交任务的客户端进程
  • 真正干活的Executor运行在YARN提供的容器

1)上传并解压缩文件

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

[nhk@kk01 ~]$ cd /opt/software/
[nhk@kk01 software]$ rz[nhk@kk01 software]$ tar -zxvf spark-3.2.0-bin-hadoop3.2-scala2.13.tgz -C /opt/software/

2)重命名

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

3)修改配置文件yarn-site.xml

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

修改这个配置文件的原因是因为:

[nhk@kk01 hadoop]$ pwd
/opt/software/hadoop-3.1.3/etc/hadoop
[nhk@kk01 hadoop]$ vim yarn-site.xml 
# 添加如下内容<!-- 是否将对容器实施物理内存限制 生产中可产生改配置-->
<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property><name>yarn.nodemanager.pmem-check-enabled</name><value>true</value>
</property><!-- 是否将对容器实施虚拟内存限制 生产中可产生改配置-->
<property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value>
</property><!-- 开启日志聚集-->
<property><name>yarn.log-aggregation-enable</name><value>true</value>
</property>
<!-- 设置yarn历史服务器地址-->
<property><name>yarn.log.server.url</name><value>http://kk01:19888/jobhistory/logs</value>
</property><property><name>yarn.nodemanager.remote-app-log-dir</name><value>/tmp/logs</value>
</property>	
<!-- 历史日志保存的时间 7天-->
<property><name>yarn.log-aggregation.retain-seconds</name><value>604800</value>
</property>

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

[nhk@kk01 hadoop]$ rsync -av /opt/software/hadoop-3.1.3/etc/hadoop/ kk02:/opt/software/hadoop-3.1.3/etc/hadoop/[nhk@kk01 hadoop]$ rsync -av /opt/software/hadoop-3.1.3/etc/hadoop/ kk03:/opt/software/hadoop-3.1.3/etc/hadoop/

5) 修改conf/spark-env.sh

当Spark Application连接到yarn集群上运行时,需要设置环境变量HADOOP_CONF_DIR指向Hadoop配置目录,以获取集群信息

在 $SPARK_HOME/conf/spark-env.sh 文件中

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

[nhk@kk01 hadoop]$ cd /opt/software/spark-yarn/conf/
[nhk@kk01 conf]$ cp spark-env.sh.template spark-env.sh
[nhk@kk01 conf]$ vim spark-env.sh
# 添加如下内容export JAVA_HOME=/opt/software/jdk1.8.0_152HADOOP_CONF_DIR=/opt/software/hadoop-3.1.3/etc/hadoop
# 下面这个也可以不配,因为和上面一样
YARN_CONF_DIR=/opt/software/hadoop-3.1.3/etc/hadoop

6)启动HDFS集群、YARN集群

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

7)提交应用(cluster模式)

[nhk@kk01 spark-yarn]$ pwd
/opt/software/spark-yarn
[nhk@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# 或者[nhk@kk01 spark-yarn]$ pwd
/opt/software/spark-yarn
[nhk@kk01 spark-yarn]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn-cluster \
./examples/jars/spark-examples_2.13-3.2.0.jar \
10

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

yarn client 任务执行流程

  1. 客户端提交一个 Application,在客户端会启动一个 Driver进程
  2. 应用程序启动后会向 RM(ResourceMananger)(相当于 standalone模式下的master进程)发送请求,启动AM(ApplicationMaster)
  3. RM收到请求,随机选择一台 NM(NodeManager)启动AM。这里的NM相当于standalone中的Worker进程
  4. AM启动后,会向 RM 请求一批 container资源,用于启动Executor
  5. RM会找到一批 NM(包含container)返回给AM,用于启动Executor
  6. AM 会向 NM发送命令启动 Executor
  7. Executor启动后,会方向注册给 Driver,Driver发送 task 到 Executor ,执行情况和结果返回给Driver端

总结:

yarn-client模式同样是适用于测试,因为Driver 运行在本地,Driver会与yarn集群中的Executor 进行大量的通信,提交的 application 过多同样会造成客户机网卡流量的大量增加

​ ApplicationMaster(executorLauncher)在次模式中的作用:

  • 为当前的 Application 申请资源
  • 给 NodeManager 发送消息启动 Executor

注意:ApplicationMaster 在此模式下有 launchExecutor和申请资源的功能,没有作业调度的功能

2.6 Yarn配置历史服务器

配置了 historyServer,停止程序后,可以在web ui 中 Completed Application 对应的 ApplicationID 中能查看history

1)spark-defaults.conf

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

[nhk@kk01 spark-yarn]$ cd conf/
[nhk@kk01 conf]$ pwd
/opt/software/spark-yarn/conf
[nhk@kk01 conf]$ cp spark-defaults.conf.template spark-defaults.conf

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

[nhk@kk01 conf]$  vim spark-defaults.conf 
# 在文件末尾加入如下内容# 开启记录事件日志的功能
spark.eventLog.enabled          true
# 设置事件日志存储的路径
spark.eventLog.dir               hdfs://kk01:8020/spark-history 
spark.history.fs.logDirectory    hdfs://kk01:8020/spark-history # 日志优化选项,压缩日志
spark.eventLog.compress 		true

注意:

​ 需要启动hadoop集群,HDFS上的spark-history 目录需要提前存在

3)在创建HDFS上的directory目录

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

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

[nhk@kk01 conf]$  pwd
/opt/software/spark-yarn/conf
[nhk@kk01 conf]$  vim spark-env.sh # 在文件中添加如下内容
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 
-Dspark.history.fs.logDirectory=hdfs://kk01:8020/spark-history 
-Dspark.history.retainedApplications=30"# 参数说明
#	参数1含义:WEB UI访问的端口号为18080
#	参数2含义:指定历史服务器日志存储路径
#	参数3含义:指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数

5)修改spark-defaults.conf配置SparkHistoryServer

[nhk@kk01 conf]$ vim spark-defaults.conf
# 添加如下配置spark.yarn.historyServer.address=kk01:18080
spark.history.ui.port=18080

6)启动历史服务器

[nhk@kk01 conf]$ cd ..
[nhk@kk01 spark-yarn]$ sbin/start-history-server.sh 
starting org.apache.spark.deploy.history.HistoryServer, logging to /opt/software/spark-yarn/logs/spark-nhk-org.apache.spark.deploy.history.HistoryServer-1-kk
01.out[nhk@kk01 spark-yarn]$ jps
2627 NameNode
2771 DataNode
3331 JobHistoryServer	# 这个是Hadoop的历史服务器
4677 Jps
4605 HistoryServer		# 这个是Spark的历史服务器
3134 NodeManager

7)重新提交应用(client模式)

[nhk@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:18080/

配置依赖Spark jar包(优化配置)

当Spark Application应用提交运行在YARN上时,默认情况下,每次提交应用都需要将Spark相关jar包上传到YARN集群上,为了节省提交时间和存储空间,将Spark相关jar包上传到HDFS目录,设置属性告知Spark Application应用

说明:

​ 该项配置属于优化配置,可酌情考虑配置与否

上传Spark jar包前需要确保HDFS集群开启

# 在HDFS上创建目录,用于存放jar包
[nhk@kk01 ~]$ hadoop fs -mkdir sparkjars# 上传$SPARK_HOME/jars中所有的jar包
[nhk@kk01 ~]$ hadoop fs -put /opt/software/spark-yarn/jars/* /sparkjars

在$SPARK_HOME/conf/spark-defaults.conf文件增加spark 相关jar包存储在HDFS上的位置信息

[nhk@kk01 ~]$ vim /opt/software/spark-yarn/conf/spark-defaults.conf
# 添加如下配置spark.yarn.jars hdfs://kk01:8020/sparkjars/*

同步配置到所有节点

[nhk@kk01 ~]$ sudo /home/nhk/bin/xsync /opt/software/spark-yarn/

3 部署模式对比

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

4 常见端口号

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PAT 1039 Course List for Student

个人学习记录&#xff0c;代码难免不尽人意。 Zhejiang University has 40000 students and provides 2500 courses. Now given the student name lists of all the courses, you are supposed to output the registered course list for each student who comes for a query. …

netty学习分享 二

操作系统IO模型与实现原理 阻塞IO 模型 应用程序调用一个IO函数&#xff0c;导致应用程序阻塞&#xff0c;等待数据准备好。如果数据没有准备好&#xff0c;一直等待….数据准备好了&#xff0c;从内核拷贝到用户空间,IO函数返回成功指示。 当调用recv()函数时&#xff0c;系…

釉面陶瓷器皿SOR/2016-175标准上架亚马逊加拿大站

亲爱的釉面陶瓷器皿和玻璃器皿制造商和卖家&#xff0c;亚马逊加拿大站将执行SOR/2016-175法规。这是一份新的法规&#xff0c;规定了含有铅和镉的釉面陶瓷器和玻璃器皿需要满足的要求。让我们一起来看一看&#xff0c;为什么要实行SOR/2016-175法规&#xff1f;这是一个保护消…

yolo源码注释3——模型配置文件

代码基于yolov5 v6.0 目录&#xff1a; yolo源码注释1——文件结构yolo源码注释2——数据集配置文件yolo源码注释3——模型配置文件yolo源码注释4——yolo-py 模型配置文件一般放在 models 文件夹下的 XXX.yaml 文件中&#xff0c;以 yolov5s.yaml 为例&#xff1a; # YOLOv…

使用SpringAop切面编程通过Spel表达式实现Controller权限控制

目录 参考一、概念SpEL表达式 二、开发引入包定义注解定义切面定义用户上下文 三、测试新建Service在方法上注解新建Service在类上注解运行 参考 SpringBoot&#xff1a;SpEL让复杂权限控制变得很简单 一、概念 对于在Springboot中&#xff0c;利用自定义注解切面来实现接口…

opencv实战项目 手势识别-手势音量控制(opencv)

本项目是使用了谷歌开源的框架mediapipe&#xff0c;里面有非常多的模型提供给我们使用&#xff0c;例如面部检测&#xff0c;身体检测&#xff0c;手部检测等。 手势识别系列文章 1.opencv实现手部追踪&#xff08;定位手部关键点&#xff09; 2.opencv实战项目 实现手势跟踪…

8月14日,每日信息差

1、FF正式交付首辆FF 91 2.0 Futurist Alliance给塔尖用户 2、消息称iPhone SE 4设计基于iPhone 14&#xff0c;但仍是后置单摄像头 3、阿联酋力推电动汽车发展。该政策将作为一个监管框架&#xff0c;明确电动汽车充电站等基础设施建设的标准&#xff0c;并推动全国标准统一…

Jay17 2023.8.12日报

8.12 今天做了2题&#xff0c;CTFshow 红包挑战8&#xff08;PHP create_function()&#xff09;和BUU [RoarCTF 2019]Easy Java&#xff08;web.xml泄露&#xff09;。 此外一直在打NepCTF&#xff0c;出了一题&#xff08;ez_java_checkin&#xff09;简单了解了java中shri…

Kafka消息队列学习(一)

文章目录 概述核心概念生产者示例同步 / 异步发送消息生产者参数配置ack-确认机制retries - 重试次数compression_type - 消息压缩类型 分区机制分区策略 消费者消息有序性提交和偏移量偏移量提交方式手动提交 高可用设计 SpringBoot集成Kafka基本使用传递对象消息 概述 核心概…

HTTP之cookie基础学习

目录 Cookie 什么是Cookie Cookie分类 Cookie版本 Cookie工作原理 Cookie详解 创建cookie cookie编码 cookie过期时间选项 Cookie流程 Cookie使用 会话管理 个性化信息 记录用户的行为 Cookie属性 domain选项 path选项 secure选项 cookie…

带着问题学习分布式系统

写在前面 听过很多道理&#xff0c;却依然过不好这一生。 看过很多关于学习的技巧、方法&#xff0c;却没应用到自己的学习中。 随着年纪变大&#xff0c;记忆力越来越差&#xff0c;整块的时间也越来越少&#xff0c;于是&#xff0c;越来越希望能够更高效的学习。学习是一种习…

香港大学余涛组推出开源XLANG Agent!支持三种Agent模式

作者 |小戏、ZenMoore 一个新的未来又逐渐开始从理论走向现实走到我们身边了。 语言的意义在于使用&#xff0c;而从 ChatGPT 以来这些大规模语言模型的意义&#xff0c;也必然绝不止于 Chat&#xff0c;在四个月前&#xff0c;我们介绍了清华大学关于工具学习的综述《清华发布…

Python-OpenCV中的图像处理-图像特征

Python-OpenCV中的图像处理-图像特征 图像特征Harris角点检测亚像素级精度的角点检测Shi-Tomasi角点检测SIFT(Scale-Invariant Feature Transfrom)SURF(Speeded-Up Robust Features) 图像特征 特征理解特征检测特征描述 Harris角点检测 cv2.cornerHarris(img, blockSize, ks…

海格里斯HEGERLS四向穿梭车仓储解决方案在电子商务行业中的应用

随着现代物流&#xff0c;尤其是智能化物流的飞速发展&#xff0c;河北沃克金属制品有限公司看到了智能物流领域背后的巨大价值和市场空间&#xff0c;深知物流与供应链对企业发展的重要性。于是&#xff0c;引进了先进的高科技智能技术—HEGERLS四向穿梭车技术&#xff0c;并迅…

【日常积累】Linux下文件乱码解决

linux下删除乱码文件、目录 由于编码原因&#xff0c;在linux服务器上上传、创建中文文件或目录时&#xff0c;会产生乱码&#xff0c;如果想删除它&#xff0c;有时候发现用rm命令是删除不了的 这种情况下&#xff0c;用find命令可以删除乱码的文件或目录。 首先进入乱码文件…

docker 网络访问诊断

本地docker开启nginx服务等&#xff0c; 发现linux系统重启之后&#xff0c;无法访问&#xff0c; 进入容器内部&#xff0c;发现可以访问 但是容器外部&#xff0c;映射端口无法访问&#xff1b; 诊断之前&#xff0c;发现docker0没有IP绑定 rootbook:/etc/docker# ip addr …

自制手写机器人

写字机器人模拟在画图板上写字效果 写了一套写字机器人代码&#xff0c;有多种字体可供选择&#xff0c;需要的朋友私信获取代码和软件

Spring5学习笔记— 工厂高级特性

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…

创建型模式-原型模式

文章目录 一、原型模式1. 概述2. 结构3. 实现4. 案例1.5 使用场景1.6 扩展&#xff08;深克隆&#xff09; 一、原型模式 1. 概述 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 2. 结构 原型模式包含如下角色&#xff1a; …

微服务架构和分布式架构的区别

微服务架构和分布式架构的区别 有&#xff1a;1、含义不同&#xff1b;2、概念层面不同&#xff1b;3、解决问题不同&#xff1b;4、部署方式不同&#xff1b;5、耦合度不同。其中&#xff0c;含义不同指微服务架构是一种将一个单一应用程序开发为一组小型服务的方法&#xff…