Spark进阶

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执行之前不需要先去申请资源,让job中的task在执行之前自己去申请,task执行结束后释放资源
      • 优点:集群资源可以充分利用
      • 缺点:速度变慢,application的运行响应就变慢了

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)对。
  • 触发算子

    • countByKey
      • 作用到K,V格式的RDD上,根据Key计数相同Key的数据集元素
    • countByValue
      • 根据数据集每个元素相同的内容来计数。返回相同内容的元素对应的条数。
    • reduce
      • 根据聚合逻辑聚合数据集中的每个元素
  • countByValue

    • 根据数据集每个元素相同的内容来计数。返回相同内容的元素对应的条数。
  • reduce

    • 根据聚合逻辑聚合数据集中的每个元素
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值