spark

Table of Contents

1 Spark Running Mode

spark整体架构如下图:

spark-cluster-overview.png

  • driver progam # 客户端. 在这里创建sparkcontext, 然后提交任务到cluster上
  • cluster manager # master节点. 当然这里也可能包括其他资源管理系统比如mesos或yarn.
  • worker node # worker节点. 在上面会启动executor, 每个executor则会启动多个task. 一个task对应a action on a partition.

根据spark文档中Cluster Mode Overview 一节描述, 共有下面几种运行方式

  • local # 本地模式. master, worker都在一个JVM中.
  • local cluster # 本地机群模式. master, worker在一个机器上, 但是是不同的JVM
  • standalone # 独立机群模式. master做资源管理和状态收集.
  • mesos # 借助mesos来做资源管理
  • yarn cluster # 借助yarn来做资源管理. driver program运行在yarn集群上
  • yarn client # 和上面不同的是driver program运行在客户本地.

这些运行方法内部实现原理非常类似. 先看看local cluster和standalone.(因为local将所有东西放在一个JVM里面, 所以许多组件都被省略)

spark-local-cluster-mode.png

standalone完全一样. 每个worker/executor上运行一个CoarseGrainedExecutorBackend和driver进行通信. driver对应组件是SparkDeploySchedulerBackend, 双方使用Akka来做通信. TaskSchedulerImpl管理整个DAG如何拆分成为tasks以及这些task按照什么顺序执行. task会被序列化发送到executor上, executor反序列化task然后执行, 执行完成后汇报给driver. driver从matser上申请资源, 然后master会在worker上启动executor来提供执行资源. driver还会向master汇报状态.

这里顺带说一下spark是如何评估应用使用资源的. spark应用资源申请是以core为单位的(spark.cores.max). 集群启动时worker会检查这个机器有多少core, 然后汇报给master. 同时我们也需要配置每个executor占用多少core(spark.executor.cores). 这样spark在提交应用时候就知道这个应用会使用多少core以及使用多少executor

mesos模式分为粗细两种粒度. 粗粒度和local cluster/standalone一样. 应用程序开始便申请executor, 如果没有足够资源不启动. 期间资源完全占据, 直到应用退出executor资源才会归还. 而细粒度则不通, 只要集群中有一些资源给部分executor的话, 那么应用程序就会开始执行任务(task). 任务执行完成之后, 那么executor资源就会归还. 粗粒度是以app/job作为分配单元的, 而细粒度是以task作为分配单元的. 这里的tradeoff是资源使用率以及调度带来的开销.

spark-mesos-coarse-mode.png spark-mesos-fine-mode.png

对于yarn来说只有粗粒度模式. cluster/client在启动executor细节上有所差异. cluster模式中因为driver已经运行在NM上所以可以直接启动其他NM上的executors, 而client必须委托一个NM来创建executors.

spark-yarn-cluster-mode.png spark-yarn-client-mode.png

RDD从生成到执行过程, 以及这个过程中使用的组件, 可以参考下图:

  • SparkContext 用户用来生成RDD
  • DAGScheduler
    • 将RDD生成Jobs, 并且将Jobs划分成为Stages
    • 然后将Stage细分到Tasks, 提交给TaskScheduler.
  • TaskScheduler是执行Tasks的引擎.
    • 它会创建一个TaskSetManager来管理这些任务执行顺序(比如locality以及resource考虑)
    • TaskScheduler收到Tasks执行结果, 将结果汇报给DAGScheduler.

spark-rdd-scheduling.jpg

comments powered by Disqus