Spark作为一个数据处理框架和计算引擎,它被设计在所有常见的集群环境下运行,目前主流环境是基于Hadoop的Yarn环境,docker环境也在慢慢流行起来
Spark的运行环境目前分为三种模式:local模式、standalone模式和Yarn模式
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
注意事项:
–class 表示要执行程序的主类,此处根据自己需要提交的程序更换为自己写的应用程序即可
2. --master local[2] 部署模式,默认为本地模式,数字表示分配的虚拟CPU核数量
3. spark-exam.....jar运行的应用类所在的jar包,**实际使用时,设定为自己打的jar包**
4. 数字10代表程序的入口参数,用于设定当前应用的任务数量
standalone是只使用Spark自身节点运行的集群模式,称为独立部署模式。Spark的standalone模式是经典的master-slave模式
与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配置
注:由于是集群模式,以上命令在从节点主机上也要执行
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://linux1:7077 \
examples/jars/spark-examples_2.12-3.0.0.jar \
10
注意事项
–class 表示要执行程序的主类
–master spark://linux1:7077 独立部署模式,连接到Spark 集群
spark-examples_2.12-3.0.0.jar 运行类所在的jar 包
数字10 表示程序的入口参数,用于设定当前应用的任务数量
参数 | 解释 | 可选值举例 |
---|---|---|
–class | Spark程序中包含主函数的类 | |
–master | Spark 程序运行的模式(环境) | 模式: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关闭后,集群监控(:4040)页面就看不到历史任务的运行情况了,所以在开发时一般要配置历史服务器记录任务运行情况
修改spark-defaults.conf.template文件名为spark-defaults.conf
mv spark-defaults.conf.template spark-defaults.conf
修改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
修改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历史纪录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数而非页面显示的应用数。
将配置文件分发到从节点上
重启集群和历史服务
sbin/start-all.sh
sbin/start-history-server.sh
重新执行任务
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://linux1:7077 \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
查看历史服务:http://linux1:18080
standalone模式由Spark自身提供计算资源,这种方式降低了和其他第三方资源框架的耦合性,独立性很强。但是作为一个计算框架,资源调度并不是其强项,yarn模式就是将Spark集成到yarn这个专业的资源调度框架下工作
修改Hadoop配置文件/etc/hadoop/yarn-site.xml, 并分发到各从节点
yarn.nodemanager.pmem-check-enabled
false
yarn.nodemanager.vmem-check-enabled
false
修改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
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
模式 | Spark节点数 | 需要启动的进程 | 所属者 | 应用场景 |
---|---|---|---|---|
Local | 1 | 无 | Spark | 测试、学习 |
Standalone | 3(1master+2slaves) | Master && Worker | Spark | 单独部署 |
Spark on Yarn | 1 | Yarn && HDFS | Hadoop | 混合部署 |
· Spark 查看当前Spark-shell 运行任务情况端口号:4040(计算)
· Spark Master 内部通信服务端口号:7077
· Standalone 模式下,Spark Master Web 端口号:8080(资源)
· Spark 历史服务器端口号:18080
· Hadoop YARN 任务运行情况查看端口号:8088
Spark框架的核心是计算引擎,它整体上采用了标准的Master-Slave结构
下图为Spark应用程序执行时的基本结构,Driver表示Master,负责管理整个集群中的作业任务调度。Executor则是slave,负责实际执行任务
Spark框架有两个核心组件
driver是Spark的驱动器节点,用于执行Spark任务中的main方法,负责实际代码的执行工作。
driver在Spark作业执行时主要负责:
1. 将用户程序转化为job(作业)
2. 在executor间调度task(任务)
3. 跟踪executor的执行情况
4. 通过UI展示查询运行情况
关于driver类其实没有精确的定义,在整个编程过程中我们也没有看到任何有关driver的描述
简单理解,我们认为所谓的driver其实就是驱使整个应用运行的程序,也叫driver类
Spark executor是集群中worker节点中的一个JVM进程,负责在Spark job中运行具体的task,且task之间彼此是相互独立的。Spark 应用程序启动时,executor节点也被同时启动,并且始终伴随着整个Spark应用的生命周期而存在。如果executor节点发生故障或崩溃,Spark应用也可以继续执行,它会将出错节点上的task调度到其他executor节点上继续执行
executor的两个核心功能:
· 负责运行组成Spark应用的task,并将结果反馈给driver进程
· 通过自身的block manager(块管理器)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在executor进程里的,因此任务可以在运行时充分利用缓存数据加速计算
Spark集群的standalone部署环境中,不需要依赖于其他的资源调度框架,自身就实现了资源调度的功能,所以在该环境中还有其他两个核心组件:Master和Worker。
这里的master是一个进程,主要负责资源的调度和分配,并进行集群的监控等职责,类似于yarn环境中的ResourceManager
而worker,也是进程,一个worker运行在集群中的一台服务器上,由master分配资源对数据进行并行的处理和计算,类似于yarn环境中的NodeManager
Hadoop用户向yarn集群提交应用时,提交程序中应该包含ApplicationMaster,用于向资源调度器申请执行任务的资源容器container,运行用户自己的程序任务job,监控整个任务的执行,跟踪整个任务的状态,处理任务失败等异常情况
简而言之,RM(资源)和drive(计算)之间的解耦靠的就是AM
Spark executor是集群中worker节点中的一个JVM进程,是整个集群中专门用于计算的节点。在提交应用时,可以提供参数指定计算节点的个数,以及对应的资源。这里的资源一般指的是工作节点executor的内存大小和使用的CPU核心数量(core)
应用程序启动相关参数如下:
名称 | 说明 |
---|---|
–num-executors | 配置Executor的数量 |
–executor-memory | 配置每个Executor的内存大小 |
–executor-cores | 配置每个Executor的虚拟CPU core数量 |
在分布式计算框架中,一般都是多个task同时执行,由于任务分布在不同的计算节点进行计算,所以能够真正地实现多任务并行执行。这里是并行而不是并发。我们将整个集群并行执行人物的数量称之为并行度。
一个作业的并行度是多少取决于框架的默认配置,应用程序也可以在运行过程中动态修改。
有向无环图是由点和线组成的拓扑图形,有方向,不闭环
第一代计算引擎:MapReduce:将计算分为map和reduce两个阶段,对于上层应用来说就不得不拆分算法,甚至是多个job地串联已完成一个完整地算法,例如迭代计算
第二代计算引擎:支持DAG地计算引擎,如tez和Oozie
第三代:以Spark为代表,主要特点是job内部的DAG支持(不跨越job),以及实时计算
这里的DAG并不是指真正意义上的图形,而是由Spark程序直接映射成的数据流的高级抽象模型。
这里的提交流程指的是开发人员根据需求写的应用程序通过Spark客户端提交给Spark运行环境执行计算的流程。
Spark应用程序提交到yarn环境中执行时,一般有两种部署执行的方式:client和cluster
两种模式的主要区别在于:driver程序运行的节点位置不同
Client 模式将用于监控和调度的Driver 模块在客户端执行,而不是在Yarn 中,所以一般用于测试。
Cluster 模式将用于监控和调度的 Driver 模块启动在Yarn 集群资源中执行。一般应用于实际生产环境。
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 上执行。