Spark core

云计算 waitig 558℃ 百度已收录 0评论

这里写图片描述
Application(应用程序):用户编写的Spark程序,包含驱动程序(Driver)和分布在集群中多个节点上运行的Executor代码。
Driver(驱动程序):Spark中的Driver运行上述Application中的main函数并创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。在Spark 中由SparkContext负责与ClusterManager通信,进行资源调度;当Executor部分运行结束,Driver负责将SparkContext关闭。通常用SparkContext代表Driver。
Cluster Manager(集群资源管理器)
:是指在集群上获取资源的外部服务,目前有以下几种:
   Standalone:Spark原生的资源管理,由Master负责资源的管理
   Hadoop Yarn:由Yarn中的ResourceManager负责资源的管理
   Mesos:由Mesos中的Mesos Master负责资源的管理
Worker(工作节点):集群中任务可以运行Application代码的节点,类似与Yarn中的ModeManager节点。
Master(总控进程):Spark Standalone运行模式下的主节点,负责管理和分配资源。
Executor(执行进程):Application运行在Worker节点上的一个进程,该进程负责运行task,并负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor。

作业执行

作业(Job):RDD中由行动操作所生成的一个或多个调度阶段
调度阶段(Stage):每个作业会因为RDD之间的依赖关系拆分成多组任务集合,称为调度阶段,也叫任务集(TaskSet)。调度阶段的划分是由DAGScheduler来划分的,调度阶段有ShuffleMapStage和ResultStage两种。
任务(Task):分发到Executor上的工作任务,是Spark实际执行应用的最小单元。
DAGScheduler:面向调度阶段的任务调度器,负责接受Spark应用提交的作业,根据RDD的依赖关系划分调度阶段,并提交给TaskScheduler。
TaskScheduler:面向任务的调度器,接受DAGScheduler提交的调度阶段,把任务分发到Work节点运行,由Work节点的Executor来执行任务。
这里写图片描述
  1.Spark应用程序进行各种转换操作,通过行动操作触发作业运行。提交之后根据RDD之间的依赖关系构建DAG图,DAG图提交给DAGScheduler进行解析。
  2.DAGScheduler是面向调度的高层次的调度器,DAGScheduler把DAG拆分成相互依赖的调度阶段,DAGScheduler会从最后一份RDD回溯,使用广度优先遍历整个依赖树,拆分调度遇到宽依赖就划分出新的调度阶段。每个调度阶段包含一个或多个任务,这些任务形成任务集,提交给底层调度器TaskScheduler。另外DAGScheduler还记录哪些RDD被存入磁盘等物化动作,同时寻求任务的最优调度,例如数据本地性;DAGScheduler监控运行调度阶段过程,如果某个调度阶段运行失败,则需要重新提交该调度阶段。
  3.每个TaskScheduler只为一个SparkContext实例服务,TaskScheduler接受来自DAGScheduler发送过来的任务集,并负责把任务集已任务的形式分发到集群Worker节点的Executor中。如果某个任务运行失败,TaskScheduler负责重试。另外TaskScheduler发现某个任务一直未完成,就可能启动同样的任务,谁先完成则用哪个任务的结果。
  4.Worker中Executor接收TaskScheduler发送过来的任务后,以线程的方式运行,每个线程负责一个任务。任务运行结束后要返回给TaskScheduler,不同类型的任务,返回的方式也不同。ShuffleMapTask返回的是一个MapStatus对象;ResultTask根据结果的大小,返回的方式又可以分为两类。

算法调度

  1.应用程序之间:有条件的FIFO策略。Mater先启动等待列表中应用程序的Driver,这些Driver尽可能分散在集群的Worker节点上,然后根据集群的内存和CPU使用情况,对等待运行的应用程序进行资源分配,在分配算法上根据先来先分配,先分配的会尽可能多地获取满足条件的资源,后分配的应用程序只能在剩下的资源中筛选。(默认是最大的,通过设置spark.core.max与spark.executor.cores约束每个应用程序最大的CPU核数、每个executor上启动的CPU核数)
  2.分配应用程序资源:一种是把应用程序运行在尽可能多的Work上,这种分配算法不仅能够充分使用集群资源,而且有利于数据本地性;相反,另一种是应用程序运行在尽可能少的Work上,该情况适合CPU密集型而内存使用较少的场景。由spark.deploy.spreadOut配置,默认为true,也就是第一种。
  3.作业及调度阶段之间:对于多分作业,提供两种调度策略。一种是FIFO,也是默认的模式;另一种是FAIR模式,该模式的调度可以通过两个参数的配置来决定Job的优先模式,这两个参数分别为minShare(最小任务数)和weight(任务的权重)。
  4.任务之间:数据本地性与延迟执行
  Δ数据本地性:数据的计算尽可能在数据所在的节点上,可以减少数据的网络传输。优先级PROCESS_LOCAL>NODE_LOCAL>NO_PREF>RACK_LOCAL>ANY。其中任务数据本地性通过以下情况确定:
   如果任务在作业开始的调度阶段,这些任务对应的RDD分区都有首先运算的位置,该位置也是任务首选的位置,数据本地型为NODE_LOCAL
   如果任务处于非作业开头的调度阶段,可以根据父调度阶段运行的位置得到任务的首选位置,这种情况下,如果Executor处于活动状态,则数据本地型为PROCESS_LOCAL;如果不处于活动状态,但存在父调度阶段运行结果,则数据本地性为NODE_LOCAL。
   如果没有首选位置,则数据本地型为NO_PREF。
  Δ延迟执行:Spark任务分配的原则就是让任务运行在数据本地性优先级高的节点上,甚至可以为此等待一定时间。

容错、监控

  容错是指一个系统的部分出现错误的情况下还能够持续的提供服务,不会因为一些细微的错误导致系统性能严重下降或者出现系统瘫痪。Spark主要实现3中异常处理:Executor、Worker、Master,并提供3种监控管理:UI监控、Spark Metrics、REST。
  UI监控分为实时UI监控和历史UI监控(也就是历史记录),实时UI监控又分为Master UI监控和应用程序UI监控。
   Master UI监控(8080):Master概要信息、集群的work列表、正在运行的应用程序、完成运行的应用程序
   应用程序UI监控(4040):作业监控页面、调度阶段监控界面、存储监控界面、运行环境监控界面、Executor监控界面、Streaming监控界面


本文由【waitig】发表在等英博客
本文固定链接:Spark core
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)