RDD五个接口

RDD 分区(partitions)

val rdd = sc.parallelize(1 to 100, 2) //指定2个分区
val rdd = sc.parallelize(1 to 100) //默认分区`

RDD优先位置

移动数据不如移动计算理念,讲任务分配到数据块存储位置

依赖关系

  • 窄依赖:一个父RDD分区最多只被子RDD一个分区使用
  • 宽依赖:多个子RDD分区会依赖与同一个父RDD的分区

分区计算

RDD计算以partition为单位计算,compute函数都是对迭代器进行复合,不需要保存每次结果。

分区函数(partitioner)

partitioner只存在与(K,V)类型的RDD,非KV类型,值为None

  • HashPatitioner
  • RangePatitioner

RDD 转换(Transformations)操作

  • repartition(numPartitions: Int): RDD[T]
  • coalesce(numPartitions: Int, shuffle:Boolean = false):RDD[T]
    repartition和coalesce是对RDD分区重新划分,repartition只是coalesce中的shuffle的简易实现。
  • 关于coalesce shuffle 参数设置
    分区明显增加,shuffle:Boolean = True
    分区大致相同,false
    分区明显减少,true(若为false,会造成并行度不够)

RDD控制(control)操作

  • cache():RDD[T]
  • persist():RDD[T]
  • persist(level: StorageLevel):RDD[T]
  • checkpoint

    checkpoint 将RDD持久化在HDFS,并且切断此RDD之前的依赖关系,persist仍然保留依赖关系。

RDD优缺点

  • 优点
    1.编译时类型安全,编译时就能检查出类型错误
    2.面向对象的编程风格,直接通过对象调用方法的形式来操作数据
    3.常驻内存(内存不足也会溢写到磁盘的),这样可以减少磁盘IO
  • 缺点
    1. 序列化和反序列化的性能开销, 无论是集群间的通信, 还是IO操作都需要对对象的结构和数据进行序列化和反序列化.
    2. GC的性能开销, 频繁的创建和销毁对象,势必会增加GC