Spack
1.RDD的依赖关系
- 窄依赖(不产生shuffle)
- 父RDD和子RDD的patiition之间的关系是一对一,或者是多对一的关系
- 宽依赖(会有shuffle产生(类似中间结果,会影响计算效率))
- 父RDD和子RDD的patition之间的关系是多对一.
- 宽依赖与窄依赖示意图
2.stage
- 过程
- spark会根据RDD之间的依赖关系,形成一个有向无环图(DAG),DAG会提交给DAGscheduler,DAGScheduler会将DAG划分为多个相互依赖的stage,划分规则就是从后往前遇到宽依赖就切割stage,每一个stage里包含task,将这些task以taskSet的形式传给taskScheduler运行,
- 切割规则
- 从后往前遇到宽依赖就切割成stage
- stage的计算模式
- pipeline管道计算模式,(一条路走到黑)
- stage的注意点
- 管道里面的数据说明时候可以落地呢
- 当RDD进行持久化时
- 当shuffle write时
- stage的task的并行度由stage的最后一个RDD来决定的
- 如何改变RDD的分区数呢
- reduceByKey(XXX,3),GroupByKey(4)
- 管道里面的数据说明时候可以落地呢
3.spark的资源调度与任务调度
- 以standalone的client为例
- 启动集群后,worker节点向Master节点发送本机的资源情况.
- 当sprck提交application后,根据RDD之间的依赖关系将Application形成一个有向无环图(DAG)
- 提交任务后,spark会在driver端创建两个对象,DAGScheduler和TaskScheduler.
- DAGScheduler的主要任务是根据DAG的依赖关系划分成一个个的stage,然后将这些stage以taskset的形式发送给taskSchedule.
- taskSchedule会遍历taskset集合,拿到每个task后将task发送到计算节点excutor中执行
- task在excutor线程池中的运行情况会反馈给taskschedule.
- 当task执行失败时,taskscheduler重试,将task重新发送给excutor去执行(默认重试3次)
- 如果重试3次还是失败,则DAGscheduler重新发送taskset给taskscheduler,stage再默认重试4次,如果还是失败则这个job失败,这个application失败
- 总结
- DAGScheduler是任务调度的高层调度器
- 任务分为:切割stage,发送taskset给taskscheduler
- taskScheduler是任务调度的低层调度器
- 任务分为:将task任务发送到计算节点excutor中,接收任务执行状况的反馈
- taskscheduler还有一个功能是如果有task运行时间比较慢的时候,会开启一个新的task任务,以先执行完的数据为准,这计算推测执行机制.
- 有两种情况是不能使用此机制.1.数据倾斜时,2.与数据库进行大量交互时(ETL).
4.粗粒度资源申请和细粒度资源申请
- 粗粒度资源申请
- 在application执行之间,将所有的资源申请完毕,当资源申请成功后,才会进行任务的调度,当taskz执行结束后才会释放这批资源
- 优点:不需要task在执行前去申请资源,task启动就快了,stage,job,aplication都会变快
- 缺点:结束之后才会释放资源,资源无法充分利用
- 在application执行之间,将所有的资源申请完毕,当资源申请成功后,才会进行任务的调度,当taskz执行结束后才会释放这批资源
- 细粒度资源申请
- 在application执行之前不需要先去申请资源,让job中的task在执行之前自己去申请,task执行结束后释放资源
- 优点:集群资源可以充分利用
- 缺点:速度变慢,application的运行响应就变慢了
- 在application执行之前不需要先去申请资源,让job中的task在执行之前自己去申请,task执行结束后释放资源
5.补充一些算子
-
转换算子
- mapPartitionWithIndex
- 与mapPartition类似,除此之外还会携带分区的索引值
- repartition
- 增加或减少分区,会发生shuffle
- coalesce
- 一般由于减少分区,第二个参数是减少分区的过程中是否产生shuffle
- repartition(numPartitions) = coalesce(numPartitions,true)
- groupbykey
- 作用在K,V格式的RDD上。根据Key进行分组。作用在(K,V),返回(K,Iterable )。
- zip
- 将两个RDD中的元素(KV格式/非KV格式)变成一个KV格式的RDD,两个RDD的个数必须相同。
- zipWithIndex
- 该函数将RDD中的元素和这个元素在RDD中的索引号(从0开始)组合成(K,V)对。
- mapPartitionWithIndex
-
触发算子
- countByKey
- 作用到K,V格式的RDD上,根据Key计数相同Key的数据集元素
- countByValue
- 根据数据集每个元素相同的内容来计数。返回相同内容的元素对应的条数。
- reduce
- 根据聚合逻辑聚合数据集中的每个元素
- countByKey
-
countByValue
- 根据数据集每个元素相同的内容来计数。返回相同内容的元素对应的条数。
-
reduce
- 根据聚合逻辑聚合数据集中的每个元素