Spark RDD 剖析

RDD五大特性

外部存储转换为RDD
val datas=sc.textfile("address")
val wordrdd=rdd.flatmap(_.split(""))
val kvRdd=wordrdd.map((_,1))
val wordcoutrdd=kvrdd.reducebykey(_+_)
 wordcoutrdd.collect
...transform中lazy加载,不会执行,直到action操作后才执行

1 a list of partitions(一系列分区组成的)
2 每一个分区都有一个function进行转换
3 每个rdd都有对其他RDD的依赖
4 optionally,针对keyvalue形式的rdd可以指定分区,告诉它如何分片
5 optionally,处理RDD的每个分片,split数据在哪里,就去哪计算,移动计算

操作

  • transformation
    • 创建一个新的数据集
    • lazy mode
    • example: map flatmap filter groupbykey reducebykey sortbykey join union
  • action
    • 返回一个值给driverprogram:例如保存 saveastextfile("address")
    • 缓存为后续执行节省时间 persistent() cache()

RDD依赖

  • 窄依赖
    • 子RDD的每个分区依赖于常数个父分区
    • 输入输出一对一的算子,且结果RDD的分区结构不变
    • 输入输出一对一,但结果的RDD分区结构发生了变化
    • 从输入中选择部分元素的算子
  • 宽依赖
    • 子RDD的分区依赖于所有的父RDD纷分区
    • 对单个RDD基于key进行重组和reduce
    • 对两个RDD基于key进行join和重组

RDDshuffle

  • 针对split重新调整分区的机制
  • 发生调整分区的会有此过程
  • jion操作、bykey操作

spark内核分析

  • RDD object
  • DAG scheduler
    • spark 阶段划分:根据有没有shuffle
  • task scheduler
  • worker

案例

- sort 
  - sortbykey
  - sortbyvalue
   wordcount.map(x=>(x._2,x._1)).sortbykey(false).map(x=>(x._2,x._1)).collect(按照降序)
- top k
  -  wordcount.map(x=>(x._2,x._1)).sortbykey(false).map(x=>(x._2,x._1)).take(3)(取前三)
- group top key
  - rdd.map(_.split(" ")).map(x=>(x(0),x(1))).grouByKey.map(x=>{val xx=x._1
  val yy=x._2
  (xx,yy.tolist.sorted.reverse.take(3)
  )}).collect
   //tolist实现将前面得到的是iterable
  转变为list
  默认是升序,加reverse成降序

你可能感兴趣的:(Spark RDD 剖析)