调优:尽可能复用同一个RDD
在对不同的数据执行算子操作时还要尽可能地复用一个RDD。
多个RDD的数据有重叠或者包含的情况,我们应该尽量复用一个RDD,这样可以尽可能地减少RDD的数量,从而尽可能减少算子执行的次数。
比如:有一个RDD的数据格式是key-value类型的,另一个rdd是单value类型的,这两个RDD的value数据是完全一样的。那么此时我们可以只使用key-value类型的那个RDD,因为其中已经包含了另一个的数据。
案例:
package com.kevin.scala.tuning
import org.apache.spark.{SparkConf, SparkContext}
/**
* 尽可能复用同一个RDD
*/
object Reuse {
def main(args: Array[String]): Unit = {
// 1.创建SparkConf
val conf = new SparkConf().setAppName("Reuse").setMaster("local")
// 2.创建SparkContext
val sc = new SparkContext(conf)
val file = "DTSparkCore\\src\\main\\resources\\words.txt"
// 错误示例,这个案例可能不太好,但表达出意思就行
// val rdd = sc.textFile(file).flatMap(_.split(" ")).map(value => (value,1))
// val rdd1 = sc.textFile(file).flatMap(_.split(" "))
// rdd.reduceByKey(_+_)
// rdd1.filter(value => !value.contains("java"))
// 优化一:创建的rdd源只有一个。优化二:复用RDD
val rdd = sc.textFile(file).flatMap(_.split(" ")).map(value => (value,1))
// 取key的次数
rdd.reduceByKey(_+_)
// 过滤掉java
rdd.filter(value => !value._1.contains("java"))
// 关闭sc
sc.stop()
}
}