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 - 缺点
- 序列化和反序列化的性能开销, 无论是集群间的通信, 还是IO操作都需要对对象的结构和数据进行序列化和反序列化.
- GC的性能开销, 频繁的创建和销毁对象,势必会增加GC