Spark系列之Spark在不同集群中的架构

246 阅读8分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情

Spark系列之Spark在不同集群中的架构

第十二章 Spark在不同集群中的架构

Spark 注重建立良好的生态系统,它不仅支持多种外部文件存储系统,提供了多种多样的集群运行模式。部署在单台机器上时,既可以用本地(Local)模式运行,也可以使用伪分布式模式来运行;当以分布式集群部署的时候,可以根据自己集群的实际情况选择 Standalone 模式(Spark 自带的模式)、YARN-Client 模式或者 YARN-Cluster模式。Spark 的各种运行模式虽然在启动方式、运行位置、调度策略上各有不同,但它们的目的基本都是一致的,就是在合适的位置安全可靠的根据用户的配置和 Job的需要运行和管理 Task。

12.1 Spark On StandAlone运行过程

Standalone 模式是 Spark 自己实现的资源调度框架,其主要的节点有 Client 节点、Master 节点和Worker 节点。其中 Driver 既可以运行在 Master 节点上中,也可以运行在本地 Client 端。当用 Sparkshell 交互式工具提交 Spark 的 Job 时,Driver 在 Master 节点上运行;当使用 spark-submit.sh 工具提交 Application 或者在 Eclipes、IDEA等开发平台上使用 new SparkConf().setMaster("spark://master:7077") 方式运行 Spark 任务时,Driver 是运行在本地Client 端上的。

运行过程文字说明:

1、我们提交一个任务,任务就叫 Application
​
2、初始化程序的入口SparkContext:
    2.1 初始化DAG Scheduler
    2.2 初始化Task Scheduler3Task Scheduler 向 Master 去进行注册并申请资源(CPU Core 和 Memory)
​
4、Master 根据 SparkContext 的资源申请要求和 Worker 心跳周期内报告的信息决定在哪个 Worker上分配资源,然后在该 Worker 上获取资源,然后启动 StandaloneExecutorBackend;顺便初始化好了一个线程池
​
5、StandaloneExecutorBackend 向 Driver(SparkContext) 注册,这样 Driver 就知道哪些Executor 为他进行服务了。到这个时候其实我们的初始化过程基本完成了,我们开始执行transformation 的代码,但是代码并不会真正的运行,直到我们遇到一个 action 操作。生成一个 job任务,进行 stage 的划分
​
6、SparkContext 将 Applicaiton 代码发送给 StandaloneExecutorBackend;并且SparkContext 解析Applicaiton 代码,构建 DAG 图,并提交给 DAGScheduler 分解成 Stage(当碰到 Action 操作时,就会催生Job;每个 Job 中含有 1 个或多个 Stage,Stage 一般在获取外部数据和 shuffle 之前产生)
​
7、将 Stage(或者称为 TaskSet)提交给 TaskScheduler。TaskScheduler 负责将 Task 分配到相应的 Worker,最后提交给 StandaloneExecutorBackend 执行
​
8、对 task 进行序列化,并根据 task 的分配算法,分配 task
​
9、对接收过来的 task 进行反序列化,把 task 封装成一个线程(TaskRunner)
​
10、开始执行 Task,并向 SparkContext 报告,直至 Task 完成
​
11、资源注销

运行图解:

image-20211129153832583.png

12.2 Spark On YARN运行过程

YARN 是一种统一资源管理机制,在其上面可以运行多套计算框架。目前的大数据技术世界,大多数公司除了使用Spark 来进行数据计算,由于历史原因或者单方面业务处理的性能考虑而使用着其他的计算框架,比如MapReduce、Storm 等计算框架。Spark 基于此种情况开发了 Spark on YARN 的运行模式,由于借助了 YARN 良好的弹性资源管理机制,不仅部署 Application 更加方便,而且用户在 YARN集群中运行的服务和 Application 的资源也完全隔离,更具实践应用价值的是 YARN 可以通过队列的方式,管理同时运行在集群中的多个服务。

Spark on YARN 模式根据 Driver 在集群中的位置分为两种模式: 1、一种是 YARN-Client 模式 启动命令:

spark-shell --master yarn --deploy-mode client

2、一种是 YARN-Cluster(或称为 YARN-Standalone 模式),不过不能启动到 Spark-shell,只能在spark-submit 提交任务的时候才能使用

$SPARK_HOME/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--driver-memory 512M \
--executor-memory 512M \
--total-executor-cores 1 \
$SPARK_HOME/examples/jars/spark-examples_2.12-3.1.2.jar \
100

12.2.1 YARN-Client

Yarn-Client 模式中,Driver 在客户端本地运行,这种模式可以使得 Spark Application 和客户端进行交互,因为Driver 在客户端,所以可以通过 WebUI 访问 Driver 的状态,默认是 http://hadoop10:4040访问,而 YARN 通过http://hadoop10:8088 访问。

YARN-Client 的工作流程分为以下几个步骤

文字说明:

1、Spark Yarn Client向YARN的ResourceManager申请启动Application Master。同时在SparkContent初始化中将创建DAGScheduler和TASKScheduler等,由于我们选择的是Yarn-Client模式,程序会选择YarnClientClusterScheduler和YarnClientSchedulerBackend;
​
2、ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,与YARN-Cluster区别的是在该ApplicationMaster不运行SparkContext,只与SparkContext进行联系进行资源的分派;
​
3Client中的SparkContext初始化完毕后,与ApplicationMaster建立通讯,向ResourceManager注册,根据任务信息向ResourceManager申请资源(Container);
​
4、一旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向Client中的SparkContext注册并申请Task;
​
5Client中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向Driver汇报运行的状态和进度,以让Client随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;
​
6、应用程序运行完成后,Client的SparkContext向ResourceManager申请注销并关闭自己。

图解:

image-20211129155455541.png

12.2.2 YARN-Cluster

在 YARN-Cluster 模式中,当用户向 YARN 中提交一个应用程序后,YARN 将分两个阶段运行该应用程 序:

第一个阶段是把 Spark 的 Driver 作为一个 ApplicationMaster 在 YARN 集群中先启动;
​
第二个阶段是由ApplicationMaster 创建应用程序,然后为它向 ResourceManager 申请资源,并启动Executor 来运行 Task,同时监控它的整个运行过程,直到运行完成。

YARN-Cluster 的工作流程分为以下几个步骤:

文字说明:

1、Spark Yarn Client向YARN中提交应用程序,包括ApplicationMaster程序、启动ApplicationMaster的命令、需要在Executor中运行的程序等;
​
2、ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,其中ApplicationMaster进行SparkContext等的初始化;
​
3、ApplicationMaster向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将采用轮询的方式通过RPC协议为各个任务申请资源,并监控它们的运行状态直到运行结束;
​
4、一旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向ApplicationMaster中的SparkContext注册并申请Task。这一点和Standalone模式一样,只不过SparkContext在Spark Application中初始化时,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler进行任务的调度,其中YarnClusterScheduler只是对TaskSchedulerImpl的一个简单包装,增加了对Executor的等待逻辑等;
​
5、ApplicationMaster中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向ApplicationMaster汇报运行的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;
​
6、应用程序运行完成后,ApplicationMaster向ResourceManager申请注销并关闭自己。

图解:

image-20211129155928026.png

12.2.3 YARN-Client 和 YARN-Cluster 区别

理解 YARN-Client 和 YARN-Cluster 深层次的区别之前先清楚一个概念:ApplicationMaster。在 YARN中,每个Application 实例都有一个 ApplicationMaster 进程,它是 Application 启动的第一个容器。它负责和ResourceManager 打交道并请求资源,获取资源之后告诉 NodeManager 为其启动Container。从深层次的含义讲YARN-Cluster 和 YARN-Client 模式的区别其实就是 ApplicationMaster进程的区别。

1、YARN-Cluster模式下,Driver运行在AM(Application Master)中,它负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行,因而YARNCluster模式不适合运行交互类型的作业;
​
2、YARN-Client模式下,ApplicationMaster仅仅向YARN请求Executor,Client会和请求的Container通信来调度他们工作,也就是说Client不能离开。

图解:

image-20211129160354370.png

image-20211129160922053.png

image-20211129161229067.png

image-20211129161312106.png



声明:
        文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。

        落叶飘雪