spark-26.spark调优_4_程序开发调优

避免创建重复的RDD

需要对名为“hello.txt”的HDFS文件进行一次map操作,再进行一次reduce操作。也就是说,需要对一份数据执行两次算子操作。

  • 错误的做法:
    对于同一份数据执行多次算子操作时,创建多个RDD。这里执行了两次textFile方法,针对同一个HDFS文件,创建了两个RDD出来,然后分别对每个RDD都执行了一个算子操作。这种情况下,Spark需要从HDFS上两次加载hello.txt文件的内容,并创建两个单独的RDD;第二次加载HDFS文件以及创建RDD的性能开销,很明显是白白浪费掉的。
val rdd1 = sc.textFile("hdfs://master01:9000/hello.txt")
rdd1.map(...)
val rdd2 = sc.textFile("hdfs://master01:9000/hello.txt")
rdd2.reduce(...)
  • 正确的用法:
    对于一份数据执行多次算子操作时,只使用一个RDD。

尽可能复用同一个RDD错误的做法:

有一个<long , String>格式的RDD,即rdd1。
接着由于业务需要,对rdd1执行了一个map操作,创建了一个rdd2,
而rdd2中的数据仅仅是rdd1中的value值而已,也就是说,rdd2是rdd1的子集。

JavaPairRDD<long , String> rdd1 = ...
JavaRDD<string> rdd2 = rdd1.map(...)

分别对rdd1和rdd2执行了不同的算子操作。

rdd1.reduceByKey(...)
rdd2.map(...)

正确的做法:
rdd2的数据完全就是rdd1的子集而已,却创建了两个rdd,并对两个rdd都执行了一次算子操作。
此时会因为对rdd1执行map算子来创建rdd2,而多执行一次算子操作,进而增加性能开销。
其实在这种情况下完全可以复用同一个RDD。
我们可以使用rdd1,既做reduceByKey操作,也做map操作。

JavaPairRDD<long , String> rdd1 = ...
rdd1.reduceByKey(...)
rdd1.map(tuple._2...)

对多次使用的RDD进行持久化

尽量避免使用shuffle类算子

使用map-side预聚合的shuffle操作

使用高性能的算子

广播大变量

使用Kryo优化序列化性能

优化数据结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值