spark 框架分析 (一)

来源:互联网 发布:淘宝制作假护照 编辑:程序博客网 时间:2024/06/06 07:13


spark代码中主要的一个基础组件是akka,akka使用Actor模式,是一个轻量级并发组件,基于事件驱动的receive循环处理消息,能和其他actors交互信息

这一部分以standalone-cluster部署模式分析spark框架,以一个小的spark app程序为例来分析流程

import org.apache.spark.SparkContextimport org.apache.spark.SparkContext._object SimpleApp {  def main(args: Array[String]) {    val textFile = "/home/snowman/kexueguairen.txt" // Should be some file on your system    val sc = new SparkContext("spark://sparkmaster:7077", "Simple App", "<$SPARK_HOME>",      List("file:///home/snowman/test/target/scala-2.10/simple-project_2.10-1.0.jar"))    val numThes = sc.textFile(textFile,2).filter(line => line.contains("the")).count()    println("Lines with the: %s".format(numThes))  }}


使用standalone-cluster模式启动,分别启动master和slave worker,每一个master和worker都是一个akka actor

spark app中一个很重要的类是SparkContext, 执行app时,SparkContext会根据部署模式创建TaskScheduler和SchedulerBackend,对于standalone-cluster模式,使用的是ClusterScheduler和SparkDeploySchedulerBackend(是CoarseGrainedSchedulerBackend的子类,也是一个akka actor),SparkDeploySchedulerBackend在启动时会创建一个Client(也是一个akka actor),然后通过actor之间的消息传递,指导每一个worker创建一个CoarseGrainedExecutorBackend,CoarseGrainedExectorBackend会在SparkDeploySchedulerBackend上注册executor,然后得到反馈创建executor


rdd是spark的核心类,是大数据处理的基础。spark的rdd根据不同的操作有众多rdd子类,比如MappedRDD, FilteredRDD, CoGroupedRDD, HadoopRDD, MappedValuesRDD, PipedRDD, CartesianRDD, BlockRDD等等。rdd之间有依赖关系的记录,主要有NarrowDependency和ShuffleDependency两种,NarrowDependency是指当前rdd partition有固定的parent rdd partition依赖,例如map, filter等,而ShuffleDependency则有可能依赖前面所有的rdd partitions,例如没有使用partitioner的join等。如上例的程序会构造FilterRDD。在做transform时并不会进行实际的计算,只有在遇到count, save, savetofile, collecte等action时,才会触发真正的计算执行


计算时,SparkContext运行job,调用DAGScheduler的submitJob提交任务,DAGScheduler使用eventqueue模式工作, 对提交的任务划分stage,stage的划分基于shuffle的边界,有shuffle map stage和result stage两种。对于cluster模式会将stage提交,这时递归计算依赖的stage并提交,如果没有依赖的stage,会根据stage的类型构造两种task,一种是ShuffleMapTask,另一种是ResultTask, task是基于parititon划分的,所以是可以并行的,将tasks归为一个taskset提交给clusterscheduler


ClusterScheduler将taskset加入到一个调度池中,然后启动后端的reviveOffers,调度器会根据资源的情况将task和运行需要的资源对应起来,然后通过CoarseGrainedExecutorBackend启动task,这时executor就会真正run task,task是通过序列化反序列化来传递的


0 0
原创粉丝点击