概述
之前的文章讲述过Yarn的定位:Yarn相当于一个分布式的操作系统,就好比windows、linux、ios、安卓这样的操作系统,在这个系统上我们可以开发应用程序在其上运行:Yarn上运行Hello World
hadoop官方也提供了一个计算框架MapReduce,就好比spring框架,我们可以基于MapReduce框架快速开发应用程序并运行在yarn之上
当然还有很多知名的第三方程序也是可以运行在yarn上的,例如HBase,Hive等
今天要介绍的Spark同样可以运行在yarn之上,即Spark on Yarn
,它的定位和MapReduce类似,属于一个应用框架,它基于内存的优化使得它的速度高于MapReduce,同时易用性也超越MapReduce,我们可以基于该框架快速开发应用程序
当然Spark自己也很保罗万向,它也有自己的一套资源调度系统,可以脱离Yarn单独运行,在本文不做考虑
环境
-
首先要搭建好hadoop集群,正常运行HDFS和YARN,我使用的版本是Hadoop3.1.3
-
jdk环境(版本jdk1.8.0_271)
-
下载spark程序包(版本spark-3.3.1-bin-hadoop3)
spark包
spark-3.3.1-bin-hadoop3 这个包里有什么呐?
![](https://img.haomeiwen.com/i9112801/8fbf339c13b99a8e.png)
bin目录下有个spark-submit
命令,运行起来就相当于开启了yarn的客户端,负责与yarn服务做交互(与Yarn上运行Hello World文章中自己写的MyYarnClient功能类似)
上面说的程序是什么呐?当然是我们基于spark框架自己写的程序,在spark-3.3.1-bin-hadoop3包中还提供了一个例子程序:spark-examples_2.12-3.3.1.jar
,这个程序是计算圆周率的
基于spark开发的程序和基于MapReduce开发的程序还有些不一样,spark把yarn-client逻辑独立出来了,基于spark写代码完全不用考虑yarn,当然最终的程序需要使用
spark-submit
命令去提交给yarn,而MapReduce程序里面自带yarn-client逻辑,直接hadoop jar xxx.jar
就可以运行了
spark这么做的好处显而易见,spark程序可以运行在yarn、k8s或自己的调度系统中,通过spark-submit与各调度系统做协调,而MapReduce程序只能运行在yarn之上
配置
由于是spark on yarn模式,spark的配置文件spark-env.sh
要配置好jdk路径和hadoop的配置文件路径,这样spark才能知道yarn和hdfs服务在哪里
export JAVA_HOME=/opt/module/jdk1.8.0_271
export HADOOP_CONF_DIR=/opt/module/hadoop-3.1.3/etc/hadoop #hadoop的配置文件路径
架构
其实无论是Spark还是MapReduce,大家都是为了分布式计算,也就是把一个计算任务分给不同的集群节点来执行,就会把一个大任务分成很多子任务,每个子任务再某个节点上以独立进程的方式运行,我们就简单称之为子程序,当然还要有一个主任务来协调所有子任务并统一汇总结果,简称之为主程序,分布式计算就是主程序创建多个子程序,并把子程序的运行结果汇总的过程
看一下spark的架构图
![](https://img.haomeiwen.com/i9112801/00ad70c600c0c252.jpeg)
- Driver就是上面所说的主程序,它负责与分布式集群管理者交互,申请资源创建子程序
- Cluster Manager就是分布式集群管理者,可以使yarn、k8s、mesos等,管理的每个节点在spark中被视为Worker Node
- Executor就是上面所说Driver向Cluster Manager申请并创建的子程序,在spark中一个Executor可以通过多线程的方式运行多个子任务Task
运行模式
spark-submit
命令参数deploy-mode有两个可选值:“cluster”和“client”,默认为“client”
cluster
尝试使用cluster
模式提交spark-examples_2.12-3.3.1.jar程序至yarn跑一下:
./bin/spark-submit --master yarn --deploy-mode cluster --class org.apache.spark.examples.SparkPi examples/jars/spark-examples_2.12-3.3.1.jar 100
这种模式下,spark就相当于yarn客户端,负责与hadoop交互:上传程序至hdfs、与yarn的RM交互申请container运行上传的程序
因而日志也只能打印出一些与RM交互的信息,而程序的Driver是在yarn上充当
ApplicationMaster
角色
![](https://img.haomeiwen.com/i9112801/b241e3c63d905335.png)
所以需要去yarn-web上看一下输出日志
![](https://img.haomeiwen.com/i9112801/2dcba68c2f3c1f3d.png)
![](https://img.haomeiwen.com/i9112801/42cfbf9b498980c1.png)
计算出圆周率3.14819...,结果稍微有点偏差
client
cluster模式的问题显而易见:只能去yarn上查看日志,如何能在执行spark-submit
后直接看到日志中的运行结果呐?
这就要介绍spark的另外一种模式:client
,在这个模式下spark的Driver是在执行spark-submit
这台机器上运行的(不再yarn上运行),而交给yarn的ApplicationMaster
实际上相当于Driver在yarn上的一个代理,更形象点:就是个傀儡,表面上来看它是所有Executor的主程序,实际上,它的所有指令都来自Driver,它对Task的运行结果汇总也要报告给Driver
Driver通过与AM沟通间接向RM申请container,并再其上运行Executor,对Executor的任务监控汇总任务也是通过AM间接做到的
![](https://img.haomeiwen.com/i9112801/1c32990165afe66d.png)
这样就可以在spark-submit
后直接看到运行结果日志,测试一下
./bin/spark-submit --master yarn --deploy-mode client --class org.apache.spark.examples.SparkPi examples/jars/spark-examples_2.12-3.3.1.jar 10
执行后直接输出如下
![](https://img.haomeiwen.com/i9112801/c26b8f01dfc53b12.png)
网友评论