Spark计算引擎原理

1、Spark内部原理
——经过RDD,建立DAG(逻辑计划)
——为DAG生成物理查询计划
——调用并执行Task
这里写图片描述web

2、生成逻辑执行图:产生RDD
生成RDD的DAG图。
这里写图片描述网络

3、生成逻辑执行图:RDD之间关系
依赖关系分为两类。
彻底依赖前面的partition只对应后面的一个partition,不会是多个。重点关注部分依赖(shuffle)
这里写图片描述框架

这里写图片描述

4、生成逻辑执行图:Shuffle
这里写图片描述
—每一个reduce task要从每一个map task端读取一部分数据,网络链接数是:M*R。分布式

—shuffle是分布式计算框架的核心数据交换方式,其实现方式直接决定了计算框架的性能和扩展性。svg

—产生shuffle的算子:join、cogroup、和*ByKey(reduceByKey,groupByKey,sortByKey)性能

5、生成逻辑执行图:算子举例(1)
这里写图片描述
算子举例(2)
这里写图片描述
算子举例(3)
这里写图片描述
算子举例(4)
这里写图片描述优化

6、生成物理执行图:划分stage
物理计划分两步:划分stage;产生task。
这里写图片描述
前两个stage没有依赖关系能够并行的算。
这里写图片描述spa

综合实例(看图)code

//vidCount vid =>1
//vidToSidNBC vid => sid for show of NBC
//vidToSidABC vid => sid for show of ABC

vidCounts=vidCount.reduceByKey(_+_)
vidToSid=vidToSidNBC.union(vidToSidABC)
vidToSidCount=vidToSid.join(vidToSidABC)
sidCount=vidToSidCount
        .map(item => item._2)
        .reduceByKey(_+_)

逻辑执行图
这里写图片描述
没有依赖关系能够并行计算。下面分红五个stage。
这里写图片描述
生成13个task。
这里写图片描述regexp

7、调度和提交任务
1.做业调度
——FIFO(默认)或Fair
——优化机制:数据本地性和推测执行
2.任务执行
——Task被序列化后,被driver发送到executor上执行,executor还原task进行本地计算。
——ShuffleMapTask将中间数据写到本地(必须写磁盘,若是不写磁盘容错、效率等都会很是差),ResultTask远程读取数据
——数据用的时候再算,并且数据是流到要计算的位置的

8、生成Job(遇到action开始执行)
这里写图片描述