开发者学堂课程【大数据Spark2020最新课程(知识精讲与实战演练)第二阶段:RDD 的缓存_缓存的意义_结论】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/11998
RDD 的缓存_缓存的意义_结论
接下来是要去取出结果,这时想统计出第一部分出现次数最少的 IP。
对于 aggRDD 来说,它里面的数据不是有序的,要统计出现次数最少的 IP,应该让出现最少的 IP 在整个数据集当中占第一位,如果是这样的话,那么拿到 aggRDD 进行 Sortsort By count,就是 item._,升序的话,最少的那一项在第一位,所以就是一个 ascending 给一个 true,通过 First 取出来。
接下来再通过一个叫做 moreip,就是比较多的那个 IP,然后这个是跟前面一样,拿到 aggRDD 然后 SortBy 第二项item 对应 item._2。应该是降序,降序就在上面了,所以这个 ascending 只为 first 取出其中第一项就是我们出现次数最多的那个 IP 地址。
打印结果第一项是 less IP,第二项是 moreIP。有两项数据,第一项是出现次数最少的,第二项是出现次数最多的两个 IP 地址。第一个最少的IP地址出现了一次,最多的出现了17次。
首先 Transformation 是生成 rdd,以及 rdd 之间的依赖关系。
action 算子的作用是生成 job 去执行 job。前边的这一部分代码它的作用本质上就是生成了一个 rdd,对应的 rdd 就是这个 aggRDD。所以 aggRDD 无论在哪个位置去使用,最终都生成了一个独立的 job,所以前边这一部分代码会执行两次。
sort bykey 是一个 shuffle 操作,第一个 job 执行了两个 shufdle 操作,第二个 job 执行了两个 shuffle 操作,全局执行了四个 shuffle 操作。
假如 aggRDD 缓存下来只执行一次 shuffle,就不会每一次都在第一个 job 里头执行一个 map,执行一个 Filter,执行一个 reduceByKey,在第二个 job 当中又执行一个 map ,执行一个 filter,执行一个 reduce ByKey,这样的话效率就会有一些提升。缓存就是在多次 job 的时候,不要每一次都重新计算一遍。
首先缓存的意义第一项是减少 shuffle。同时还可以减少其他算子执行,直接缓存算法生成的结果。一般缓存在两个地方第一个就是在一次 shuffle 结束以后生成的这个 RDD,如果全局的流程特别长,那这个 RDD 的也是要缓存的。
第二个原因是要容错,假如说 RDD1生成一个 RDD2又生成一个 RDD3,如果3出错了2也要重新计算一次,假如说我们对2进行了缓存,那再重新计算的时候就直接能拿出结果。
缓存的意义
使用缓存的原因﹣多次使用 RDD
需求:在日志文件中找到访问次数最少的 IP 和访问次数最多的 IP
val conf = new SparkConf (). setMaster (" local [6]"). setAppName (" debug _ string ")
val sc = new SparkContext ( conf )
val interimRDD = sc . textFile (" dataset / access _ log _ sample . txt "),
l
map ( item =>( item . split (
"")(0),1))
l
filter ( item => StringUtils . isNotBlank ( item ._1))
l
reduceByKey (( curr , agg )=> curr + agg )
val resultLess = interimRDD . sortBy ( item => item ._2, ascending = true ). first ()
val resultMore =interiRDD . sortBy ( item => item ._2, ascending = false ). first ()
println ( s "
出现次数最少的 IP :$ resultLess ,出现次数最多的 IP :$ resultMore ")
sc . stop ()
①这是一个 Shuffle 操作, Shuffle 操作会在集群内进行数据拷贝
在上述代码中,多次使用到了 interimRDD ,导致文件读取两次,计算两次,有没有什么办法增进上述代码的性能?
第一个意义减少 Shuffle,减少其他的算子执行,缓存算子生成结果。
使用缓存的原因-容错
当在计算 RDD3的时候如果出错了,会怎么进行容错?
会再次计算 RDD1和 RDD2的整个链条,假设 RDD1和 RDD2是通过比较昂贵的操作得来的,有没有什么办法减少这种开销?
上述两个问题的解决方案其实都是缓存,除此之外,使用缓存的理由还有很多,但是总结一句,就是缓存能够帮助开发者在进行一些昂贵操作后,将其结果保存下来,以便下次使用无需再次执行,缓存能够显著的提升性能。
所以,缓存适合在一个 RDD 需要重复多次利用,并且还不是特别大的情况下使用,例如迭代计算等场景。
以上就是这个案例的意义。