1.standalone 模式
以 standalone 的方式提交 spark 任务,需要搭建 saprk 集群。
standalone 模式执行原理图解:
执行流程
- 通过 spark-submit 命令将 Application 提交到集群,此时 spark 会通过反射的方式,创建和构造一个 DriverActor 进程出来(scala 中的 actor 类似 java 的多线程)。
(1)如果是 standalone-client 模式,则在提交 Application 的机器启动 driver.
(2)如果是 standalone-cluster 模式,则会先向 master 申请在集群中启动 driver。
- Driver 进程会执行我们提交的 Application 应用程序,首先构造 SparkConf,再构造 SparkContext。
- SparkContext 在初始化的时候,最主要的做的就是构造 DAGScheduler 和 TaskScheduler。
- TaskScheduler 会通过它对应的一个后台进程去连接 Master,向 Master 注册 Application。
- Master 接收到 Application 的注册请求后,会使用自己的资源调度算法(基于调度器 standalone,Yarn,Mesos 等都有不同的调度算法),在 Spark 集群的 Worker 上为这个 Application 启动 Executor。
- Master 通知 worker 启动 Executor 后,Worker 会为 Application 启动 Executor 进程。
- Executor 启动之后,会将自己反向注册到 TaskScheduler 上去。
- 当所有 Executor 都反向注册到 Driver 上之后,Driver 结束 SparkContext 的初始化,会继续执行我们自己编写的代码。
- 接下来,每执行到一个 action,就会创建一个 job,然后提交给 DAGScheduler。
- DAGScheduler 会使用 stage 划分算法,把 job 划分为多个 stage,然后每个 stage 创建一个 TaskSet,提交给 TaskScheduler。
- TaskScheduler 会把 TaskSet 里面的每一个 task 提交到 Executor 上面执行(通过 task 分配算法)。
- Executor 每接收到一个 task,都会用 TaskRunner 来封装 task,然后从线程池中取出一个线程来执行这个 task。
- TaskRunner:将我们编写的代码,也就是要执行的算子以及函数,拷贝,反序列化,然后执行 task。
- Task 有两种,ShuffleMapTask 和 ResultTask,只有最后一个 stage 是 ResultTask,之前的 stage 都是 ShuffleMapTask。
- 最后,整个 spark 程序的执行,就是 stage 分批次作为 taskset 提交到 executor 执行,每个 task 针对 RDD 的一个 partition,执行我们定义的算子和函数,如此往复,知道所有操作都执行完成,真个 spark 程序就执行完成了。
总结
- client 模式适用于测试调试程序。Driver 进程是在客户端启动的,这里的客户端就是指提交应用程序的当前节点。在 Driver 端可以看到 task 执行的情况。生产环境下不能使用 client 模式,是因为:假设要提交 100 个 application 到集群运行,Driver 每次都会在 client 端启动,那么就会导致客户端 100 次网卡流量暴增的问题。(因为要监控 task 的运行情况,会占用很多端口,如上图的结果图)客户端网卡通信,都被 task 监控信息占用。
- 当在客户端提交多个 application 时,Driver 会在 Woker 节点上随机启动,这种模式会将单节点的网卡流量激增问题分散到集群中。在客户端看不到 task 执行情况和结果。要去 webui 中看。cluster 模式适用于生产环境
- Driver 作用
(1)Driver 负责应用程序资源的申请
(2)任务的分发。
(3)结果的回收。
(4)监控 task 执行情况。
2.yarn-client 模式
yarn-client 模式执行原理图解:
执行流程
- 客户端提交一个 Application,在客户端启动一个 Driver 进程。
- Driver 进程会向 RS(ResourceManager)发送请求,启动 AM(ApplicationMaster)的资源。
- RS 收到请求,随机选择一台 NM(NodeManager)启动 AM。这里的 NM 相当于 Standalone 中的 Worker 节点。
- AM 启动后,会向 RS 请求一批 container 资源,用于启动 Executor.
- RS 会找到一批 NM 返回给 AM,用于启动 Executor。
- AM 会向 NM 发送命令启动 Executor。
- Executor 启动后,会反向注册给 Driver,Driver 发送 task 到 Executor,执行情况和结果返回给 Driver 端。
总结
1、Yarn-client 模式同样是适用于测试,因为 Driver 运行在本地,Driver 会与 yarn 集群中的 Executor 进行大量的通信,会造成客户机网卡流量的大量增加.
2、 ApplicationMaster 的作用:
(1)为当前的 Application 申请资源;
(2)给 NodeManager 发送消息启动 Executor;
注意:ApplicationMaster 有 launchExecutor 和申请资源的功能,并没有作业调度的功能。
3.yarn-cluster 模式
yarn-cluster 模式执行原理图解:
执行流程
- 客户机提交 Application 应用程序,发送请求到 RS(ResourceManager),请求启动 AM(ApplicationMaster)。
- RS 收到请求后随机在一台 NM(NodeManager)上启动 AM(相当于 Driver 端)。
- AM 启动,AM 发送请求到 RS,请求一批 container 用于启动 Executor。
- RS 返回一批 NM 节点给 AM。
- AM 连接到 NM,发送请求到 NM 启动 Executor。
- Executor 反向注册到 AM 所在的节点的 Driver。Driver 发送 task 到 Executor。
总结
- Yarn-Cluster 主要用于生产环境中,因为 Driver 运行在 Yarn 集群中某一台 nodeManager 中,每次提交任务的 Driver 所在的机器都是随机的,不会产生某一台机器网卡流量激增的现象,缺点是任务提交后不能看到日志。只能通过 yarn 查看日志。
- ApplicationMaster 的作用:
(1)为当前的 Application 申请资源。
(2)给 nodemanager 发送消息 启动 Excutor。
(3)任务调度。(这里和 client 模式的区别是 AM 具有调度能力,因为其就是 Driver 端,包含 Driver 进程) - 停止集群任务命令:yarn application -kill applicationID
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于