spark机制note

来源:互联网 发布:亚马逊 阿里云 offer 编辑:程序博客网 时间:2024/05/23 23:00

抄录自:data progressing with spark

spark主要模块

  1. 调度与任务分配
    spark按照应用,作业,stage,task几个层次分别进行调度,采用了经典的FIFO和FAIR等调度算法.
  2. IO
    在IO中将数据以块为单位进行管理, 需要处理的块可以 本机内存, 磁盘或者集群的其他机器中.
  3. 通信控制
    通信对于命令和状态的传递极为重要, 通过AKKA进行通信.
  4. 容错
    听过lineage checkpoint 进行容错性保证.
  5. shuffle模块
    shuffle机制进行了创新和优化.

执行机制

这里写图片描述
Rdd的action算子会触发job提交, 提交到spark的job生成rdd DAG, 有DAGscheduler转化为stageDAG, 每个stage中产生相应的task集合, taskscheduler将任务分发到executor执行. 每个人物对应相应的一个数据块, 使用用户的函数处理数据块.使用用户定义的函数处理数据块.

rdd

弹性分布式数据集, RDD作为数据结构,本质上是一个只读的分区记录集合。一个RDD可以包含多个分区,每个分区就是一个dataset片段。RDD可以相互依赖。如果RDD的每个分区最多只能被一个Child RDD的一个分区使用,则称之为narrow dependency;若多个Child RDD分区都可以依赖,则称之为wide dependency。不同的操作依据其特性,可能会产生不同的依赖。例如map操作会产生narrow dependency,而join操作则产生wide dependency。

spark应用

application是用户提交的应用程序, 执行模式有local, standalone, yarn, mesos.

组件

  1. application
  2. driverporgram
  3. rddgraph
  4. job
  5. stage
  6. task

应用提交方式

Driver进程是应用的主控进程, 负责应用的解析,切分stage并调度task到executor执行, 包含DAGScheduler等重要对象.
两种方式:

1. Driver进程运行在客户端, 对应用进行监控

./bin/run-exampleorg.apache.spark.examples.SparkTC spark://UserHostIP:port
  1. 用户启动客户端, 之后客户端运行用户程序, 启动Driver进程. 在Driver中启动或实例化DAGscheduler等组件.客户端的Driver想Master注册.
  2. worker想master注册, master命令worker启动executor. worker通过创建executor-runner线程, 在此线程内部启动executorbackend进程.
  3. executorbackend进程启动后, 向客户端Driver进程内的schedulerbackend注册,这样driver进程就能就能找到计算资源.driver的DAGscheduler解析应用中的RDDDAG并生成相应的stage,每个stage包含的taskset通过taskscheduler分配给executor,在executor内部启动线程池并行化执行task.

2. 主节点制定某个Worker节点启动Driver,负责整个应用的监控

如果Driver在Worker启动执行需要通过org.apache.spark.deploy.Client类执行应用,命令如下。

./bin/spark-class org.apache.spark.deploy.Client launch spark://UserHostIP:portfile://your_jar org.apache.spark.examples.SparkTC spark://UserHostIP:port

spark调度与任务分配模块

调度配置

spark有多种运行模式: local standalone yarn mesos.
standalone

spark.cores.max决定一个应用可以在整个集群申请的CPU core数。 注意,这个参数不是控制单节点可用多少核

yarn

当Spark运行在YARN平台上时,用户可以在YARN的客户端通过配置--num-executors选项控制为这个应用分配多少个Executor,然后通过配置--executor-memory及--executorcores来控制应用被分到的每个Executor的内存大小和Executor所占用的CPU核数。 这样便可以限制用户提交的应用不会过多的占用资源,让不同用户能够共享整个集群资源,提升YARN吞吐量。

Spark应用程序内Job的调度

户可以通过配置
spark.scheduler.mode方式来让应用以FAIR模式调度

Stage和TaskSetManager调度方式

1.Stage的生成

Stage的调度是由DAGScheduler完成的。 由RDD的有向无环图DAG切分出了Stage的有向无环图DAG。 Stage的DAG通过最后执行的Stage为根进行广度优先遍历,遍历到最开始执行的Stage执行,如果提交的Stage仍有未完成的父母Stage,则Stage需要等待其父Stage执行完才能执行。 同时DAGScheduler中还维持了几个重要的Key-Value集合结构,用来记录Stage的状态,这样能够避免过早执行和重复提交Stage。 waitingStages中记录仍有未执行
的父母Stage,防止过早执行。 runningStages中保存正在执行的Stage,防止重复执行。failedStages中保存执行失败的Stage,需要重新执行,这里的设计是出于容错的考虑。

2.TaskSetManager的调度
结合上面介绍的Job的调度和Stage的调度方式,可以知道,每个Stage对应的一个TaskSetManager通过Stage回溯到最源头缺失的Stage提交到调度池pool中,
在调度池中,这些TaskSetMananger又会根据Job ID排序,先提交的Job的TaskSetManager优先调度,然后一个Job内的TaskSetManager ID小的先调度,并且如果有未执行完的父母Stage的TaskSetManager,则是不会提交到调度池中。

Task调度

  1. 在DAGScheduler中提交任务时,分配任务执行节点。
  2. 1)如果是调用过cache()方法的RDD,数据已经缓存在内存,则读取内存缓存中分区
    的数据。
    2)如果直接能获取到执行地点,则返回执行地点作为任务的执行地点,通常DAG中最源头的RDD或者每个Stage中最开始的RDD会有执行地点的信息。 例如,HadoopRDD从HDFS读出的分区就是最好的执行地点。 这里涉及Hadoop分区的数据本地性问题,感兴趣的读者可以查阅Hadoop的资料了解。
    3)如果不是上面两种情况,将遍历RDD获取第一个窄依赖的父亲RDD对应分区的执行地点。
0 0
原创粉丝点击