Spark学习_02_运行模式和架构

2 篇文章 0 订阅
2 篇文章 0 订阅

Spark运行环境和架构

1. Spark运行环境

Spark作为一个数据处理框架和计算引擎,它被设计在所有常见的集群环境下运行,目前主流环境是基于Hadoop的Yarn环境,docker环境也在慢慢流行起来

Spark的运行环境目前分为三种模式:local模式、standalone模式和Yarn模式

1.1 local模式

local模式是不需要其他任何节点资源就可以在本地执行Spark程序的环境,一般用于学习、调试等

安装不需要额外配置,解压到你想放的路径即可

· 提交应用

bin/spark-submit \ 
--class org.apache.spark.examples.SparkPi \ 
--master local[2] \ 
./examples/jars/spark-examples_2.12-3.0.0.jar \
10s

注意事项:

  1. –class 表示要执行程序的主类,此处根据自己需要提交的程序更换为自己写的应用程序即可

     			   2. --master local[2] 部署模式,默认为本地模式,数字表示分配的虚拟CPU核数量
     			   3. spark-exam.....jar运行的应用类所在的jar包,**实际使用时,设定为自己打的jar包**
     			   4. 数字10代表程序的入口参数,用于设定当前应用的任务数量
    
1.2 standalone模式

standalone是只使用Spark自身节点运行的集群模式,称为独立部署模式。Spark的standalone模式是经典的master-slave模式

1.2.1 配置文件修改

与local模式不同,standalone需要修改一些配置文件:

将conf/下的spark-env.sh.template修改为spark-env.sh(或者复制一份为好)

在spark-env.sh添加如下配置:

export JAVA_HOME=/opt/module/jdk1.8.0_144  // 配置自己实际的jdk安装目录
SPARK_MASTER_HOST=linux1 		// 主机名需要根据自己的进行修改
SPARK_MASTER_PORT=7077 		// 7077端口,相当于Hadoop3内部通信的8020端口,此处端口需要确认自己的Hadoop配置

注:由于是集群模式,以上命令在从节点主机上也要执行

1.2.2 提交应用
bin/spark-submit \ 
--class org.apache.spark.examples.SparkPi \ 
--master spark://linux1:7077 \ 
examples/jars/spark-examples_2.12-3.0.0.jar \
10

注意事项

  1. –class 表示要执行程序的主类

  2. –master spark://linux1:7077 独立部署模式,连接到Spark 集群

  3. spark-examples_2.12-3.0.0.jar 运行类所在的jar 包

  4. 数字10 表示程序的入口参数,用于设定当前应用的任务数量

1.2.3 提交参数说明
参数解释可选值举例
–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()方法的参数
1.2.4 配置历史服务

由于spark-shell关闭后,集群监控(:4040)页面就看不到历史任务的运行情况了,所以在开发时一般要配置历史服务器记录任务运行情况

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

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

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

    注意:需要启动Hadoop集群,且HDFS上的directory必须已经存在

    sbin/start-dfs.sh 
    hadoop fs -mkdir /directory
    
  3. 修改spark-env.sh 文件, 添加日志配置

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

    · 参数1含义:WEB UI访问的端口号为18080

    · 参数2含义:指定历史服务器日志存储路径

    · 参数3含义:指定保存Application历史纪录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数而非页面显示的应用数。

  4. 将配置文件分发到从节点上

  5. 重启集群和历史服务

    sbin/start-all.sh 
    sbin/start-history-server.sh 
    
  6. 重新执行任务

    bin/spark-submit \ 
    --class org.apache.spark.examples.SparkPi \ 
    --master spark://linux1:7077 \ 
    ./examples/jars/spark-examples_2.12-3.0.0.jar \
    10
    
  7. 查看历史服务:http://linux1:18080

1.3 Yarn模式

standalone模式由Spark自身提供计算资源,这种方式降低了和其他第三方资源框架的耦合性,独立性很强。但是作为一个计算框架,资源调度并不是其强项,yarn模式就是将Spark集成到yarn这个专业的资源调度框架下工作

1.3.1 配置文件修改

修改Hadoop配置文件/etc/hadoop/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> 

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

cp spark-env.sh.template spark-env.sh 
export JAVA_HOME=/opt/module/jdk1.8.0_144 
YARN_CONF_DIR=/opt/module/hadoop/etc/hadoop 
1.3.2 提交应用
bin/spark-submit \ 
--class org.apache.spark.examples.SparkPi \ 
--master yarn \ 
--deploy-mode cluster \ 
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
1.4 三种部署模式的对比
模式Spark节点数需要启动的进程所属者应用场景
Local1Spark测试、学习
Standalone3(1master+2slaves)Master && WorkerSpark单独部署
Spark on Yarn1Yarn && HDFSHadoop混合部署
1.5 端口号
· Spark 查看当前Spark-shell 运行任务情况端口号:4040(计算)
· Spark Master 内部通信服务端口号:7077
· Standalone 模式下,Spark Master Web 端口号:8080(资源)
· Spark 历史服务器端口号:18080
· Hadoop YARN 任务运行情况查看端口号:8088

2. Spark运行架构

2.1 运行架构

Spark框架的核心是计算引擎,它整体上采用了标准的Master-Slave结构

下图为Spark应用程序执行时的基本结构,Driver表示Master,负责管理整个集群中的作业任务调度。Executor则是slave,负责实际执行任务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fCJawubZ-1619178532758)(C:\Users\Lee\AppData\Roaming\Typora\typora-user-images\image-20210423162147459.png)]

2.2 核心组件

Spark框架有两个核心组件

2.2.1 Driver

driver是Spark的驱动器节点,用于执行Spark任务中的main方法,负责实际代码的执行工作。

driver在Spark作业执行时主要负责:

	1. 将用户程序转化为job(作业)
	2. 在executor间调度task(任务)
	3. 跟踪executor的执行情况
	4. 通过UI展示查询运行情况

关于driver类其实没有精确的定义,在整个编程过程中我们也没有看到任何有关driver的描述

简单理解,我们认为所谓的driver其实就是驱使整个应用运行的程序,也叫driver类

2.2.2 executor

Spark executor是集群中worker节点中的一个JVM进程,负责在Spark job中运行具体的task,且task之间彼此是相互独立的。Spark 应用程序启动时,executor节点也被同时启动,并且始终伴随着整个Spark应用的生命周期而存在。如果executor节点发生故障或崩溃,Spark应用也可以继续执行,它会将出错节点上的task调度到其他executor节点上继续执行

executor的两个核心功能:

​ · 负责运行组成Spark应用的task,并将结果反馈给driver进程

​ · 通过自身的block manager(块管理器)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在executor进程里的,因此任务可以在运行时充分利用缓存数据加速计算

2.2.3 Master & Worker

Spark集群的standalone部署环境中,不需要依赖于其他的资源调度框架,自身就实现了资源调度的功能,所以在该环境中还有其他两个核心组件:Master和Worker。

这里的master是一个进程,主要负责资源的调度和分配,并进行集群的监控等职责,类似于yarn环境中的ResourceManager

而worker,也是进程,一个worker运行在集群中的一台服务器上,由master分配资源对数据进行并行的处理和计算,类似于yarn环境中的NodeManager

2.2.4 ApplicationMaster

Hadoop用户向yarn集群提交应用时,提交程序中应该包含ApplicationMaster,用于向资源调度器申请执行任务的资源容器container,运行用户自己的程序任务job,监控整个任务的执行,跟踪整个任务的状态,处理任务失败等异常情况

简而言之,RM(资源)和drive(计算)之间的解耦靠的就是AM

2.3 核心概念
2.3.1 executor和core

Spark executor是集群中worker节点中的一个JVM进程,是整个集群中专门用于计算的节点。在提交应用时,可以提供参数指定计算节点的个数,以及对应的资源。这里的资源一般指的是工作节点executor的内存大小和使用的CPU核心数量(core)

应用程序启动相关参数如下:

名称说明
–num-executors配置Executor的数量
–executor-memory配置每个Executor的内存大小
–executor-cores配置每个Executor的虚拟CPU core数量
2.3.2 并行度Parallelism

在分布式计算框架中,一般都是多个task同时执行,由于任务分布在不同的计算节点进行计算,所以能够真正地实现多任务并行执行。这里是并行而不是并发。我们将整个集群并行执行人物的数量称之为并行度

一个作业的并行度是多少取决于框架的默认配置,应用程序也可以在运行过程中动态修改。

2.3.3 有向无环图DAG(Directed Acyclic Graph)

有向无环图是由点和线组成的拓扑图形,有方向,不闭环

第一代计算引擎:MapReduce:将计算分为map和reduce两个阶段,对于上层应用来说就不得不拆分算法,甚至是多个job地串联已完成一个完整地算法,例如迭代计算

第二代计算引擎:支持DAG地计算引擎,如tez和Oozie

第三代:以Spark为代表,主要特点是job内部的DAG支持(不跨越job),以及实时计算

这里的DAG并不是指真正意义上的图形,而是由Spark程序直接映射成的数据流的高级抽象模型。

2.3.4 提交流程

这里的提交流程指的是开发人员根据需求写的应用程序通过Spark客户端提交给Spark运行环境执行计算的流程。

Spark应用程序提交到yarn环境中执行时,一般有两种部署执行的方式:client和cluster

两种模式的主要区别在于:driver程序运行的节点位置不同

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Mbyr9MH-1619178532761)(C:\Users\Lee\AppData\Roaming\Typora\typora-user-images\image-20210423191413497.png)]

2.3.4.1 yarn client模式

Client 模式将用于监控和调度的Driver 模块在客户端执行,而不是在Yarn 中,所以一般用于测试。

  1. Driver 在任务提交的本地机器上运行
  2. Driver 启动后会和ResourceManager 通讯申请启动ApplicationMaster
  3. ResourceManager 分配container,在合适的NodeManager 上启动ApplicationMaster,负责向ResourceManager 申请Executor 内存
  4. ResourceManager 接到ApplicationMaster 的资源申请后会分配 container,然后ApplicationMaster 在资源分配指定的NodeManager 上启动Executor 进程
  5. Executor 进程启动后会向Driver 反向注册,Executor 全部注册完成后Driver 开始执行main 函数
  6. 之后执行到Action 算子时,触发一个Job,并根据宽依赖开始划分 stage,每个stage 生成对应的TaskSet,之后将task 分发到各个Executor 上执行。
2.3.4.2 yarn cluster模式

Cluster 模式将用于监控和调度的 Driver 模块启动在Yarn 集群资源中执行。一般应用于实际生产环境。

  1. 在YARN Cluster 模式下,任务提交后会和ResourceManager 通讯申请启动ApplicationMaster,
  2. 随后ResourceManager 分配container,在合适的NodeManager 上启动ApplicationMaster,此时的ApplicationMaster 就是Driver。
  3. Driver 启动后向ResourceManager 申请Executor 内存,ResourceManager 接到ApplicationMaster 的资源申请后会分配container,然后在合适的NodeManager 上启动Executor 进程
  4. Executor 进程启动后会向Driver 反向注册,Executor 全部注册完成后Driver 开始执行main 函数,
  5. 之后执行到Action 算子时,触发一个Job,并根据宽依赖开始划分 stage,每个stage 生成对应的TaskSet,之后将task 分发到各个Executor 上执行。

pplicationMaster 就是Driver。
3. Driver 启动后向ResourceManager 申请Executor 内存,ResourceManager 接到ApplicationMaster 的资源申请后会分配container,然后在合适的NodeManager 上启动Executor 进程
4. Executor 进程启动后会向Driver 反向注册,Executor 全部注册完成后Driver 开始执行main 函数,
5. 之后执行到Action 算子时,触发一个Job,并根据宽依赖开始划分 stage,每个stage 生成对应的TaskSet,之后将task 分发到各个Executor 上执行。

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值