spark 提交任务的几种模式

本贴最后更新于 2108 天前,其中的信息可能已经时移世异

1.standalone 模式

以 standalone 的方式提交 spark 任务,需要搭建 saprk 集群。

standalone 模式执行原理图解:

imagepng

执行流程

  1. 通过 spark-submit 命令将 Application 提交到集群,此时 spark 会通过反射的方式,创建和构造一个 DriverActor 进程出来(scala 中的 actor 类似 java 的多线程)。
    (1)如果是 standalone-client 模式,则在提交 Application 的机器启动 driver.
    (2)如果是 standalone-cluster 模式,则会先向 master 申请在集群中启动 driver。

  1. Driver 进程会执行我们提交的 Application 应用程序,首先构造 SparkConf,再构造 SparkContext。
  2. SparkContext 在初始化的时候,最主要的做的就是构造 DAGScheduler 和 TaskScheduler。
  3. TaskScheduler 会通过它对应的一个后台进程去连接 Master,向 Master 注册 Application。
  4. Master 接收到 Application 的注册请求后,会使用自己的资源调度算法(基于调度器 standalone,Yarn,Mesos 等都有不同的调度算法),在 Spark 集群的 Worker 上为这个 Application 启动 Executor。
  5. Master 通知 worker 启动 Executor 后,Worker 会为 Application 启动 Executor 进程。
  6. Executor 启动之后,会将自己反向注册到 TaskScheduler 上去。
  7. 当所有 Executor 都反向注册到 Driver 上之后,Driver 结束 SparkContext 的初始化,会继续执行我们自己编写的代码。
  8. 接下来,每执行到一个 action,就会创建一个 job,然后提交给 DAGScheduler。
  9. DAGScheduler 会使用 stage 划分算法,把 job 划分为多个 stage,然后每个 stage 创建一个 TaskSet,提交给 TaskScheduler。
  10. TaskScheduler 会把 TaskSet 里面的每一个 task 提交到 Executor 上面执行(通过 task 分配算法)。
  11. Executor 每接收到一个 task,都会用 TaskRunner 来封装 task,然后从线程池中取出一个线程来执行这个 task。
  12. TaskRunner:将我们编写的代码,也就是要执行的算子以及函数,拷贝,反序列化,然后执行 task。
  13. Task 有两种,ShuffleMapTask 和 ResultTask,只有最后一个 stage 是 ResultTask,之前的 stage 都是 ShuffleMapTask。
  14. 最后,整个 spark 程序的执行,就是 stage 分批次作为 taskset 提交到 executor 执行,每个 task 针对 RDD 的一个 partition,执行我们定义的算子和函数,如此往复,知道所有操作都执行完成,真个 spark 程序就执行完成了。

总结

  1. client 模式适用于测试调试程序。Driver 进程是在客户端启动的,这里的客户端就是指提交应用程序的当前节点。在 Driver 端可以看到 task 执行的情况。生产环境下不能使用 client 模式,是因为:假设要提交 100 个 application 到集群运行,Driver 每次都会在 client 端启动,那么就会导致客户端 100 次网卡流量暴增的问题。(因为要监控 task 的运行情况,会占用很多端口,如上图的结果图)客户端网卡通信,都被 task 监控信息占用。

  1. 当在客户端提交多个 application 时,Driver 会在 Woker 节点上随机启动,这种模式会将单节点的网卡流量激增问题分散到集群中。在客户端看不到 task 执行情况和结果。要去 webui 中看。cluster 模式适用于生产环境

  1. Driver 作用
    (1)Driver 负责应用程序资源的申请
    (2)任务的分发。
    (3)结果的回收。
    (4)监控 task 执行情况。

2.yarn-client 模式

yarn-client 模式执行原理图解:

imagepng

执行流程

  1. 客户端提交一个 Application,在客户端启动一个 Driver 进程。
  2. Driver 进程会向 RS(ResourceManager)发送请求,启动 AM(ApplicationMaster)的资源。
  3. RS 收到请求,随机选择一台 NM(NodeManager)启动 AM。这里的 NM 相当于 Standalone 中的 Worker 节点。
  4. AM 启动后,会向 RS 请求一批 container 资源,用于启动 Executor.
  5. RS 会找到一批 NM 返回给 AM,用于启动 Executor。
  6. AM 会向 NM 发送命令启动 Executor。
  7. 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 模式执行原理图解:

imagepng

执行流程

  1. 客户机提交 Application 应用程序,发送请求到 RS(ResourceManager),请求启动 AM(ApplicationMaster)。
  2. RS 收到请求后随机在一台 NM(NodeManager)上启动 AM(相当于 Driver 端)。
  3. AM 启动,AM 发送请求到 RS,请求一批 container 用于启动 Executor。
  4. RS 返回一批 NM 节点给 AM。
  5. AM 连接到 NM,发送请求到 NM 启动 Executor。
  6. Executor 反向注册到 AM 所在的节点的 Driver。Driver 发送 task 到 Executor。

总结

  1. Yarn-Cluster 主要用于生产环境中,因为 Driver 运行在 Yarn 集群中某一台 nodeManager 中,每次提交任务的 Driver 所在的机器都是随机的,不会产生某一台机器网卡流量激增的现象,缺点是任务提交后不能看到日志。只能通过 yarn 查看日志。
  2. ApplicationMaster 的作用:
    (1)为当前的 Application 申请资源。
    (2)给 nodemanager 发送消息 启动 Excutor。
    (3)任务调度。(这里和 client 模式的区别是 AM 具有调度能力,因为其就是 Driver 端,包含 Driver 进程)
  3. 停止集群任务命令:yarn application -kill applicationID
本文章参考文章:https://blog.csdn.net/lhworldblog/article/details/79300050
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 552 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...