1.需要避免的几种错误操作
a. 在执行reductive(合并)操作的时候,避免使用groupByKey操作。因为使用groupByKey的时候,会导致太多的被数据shuffle,而reduceByKey操作会比groupByKey性能高很多,具体原因可参考下面的两个图片:
可见reduceByKey操作,先对数据进行合并,然后再shuffle,所以shuffle数据会少很多
b. 当数据数据和输出数据类型不同的时候,不要使用reduceByKey操作,而是使用aggregateByKey操作。假设我们需要找到一个RDDs中,value类型是String,要找到某个key对应的所有value的集合,而这个集合中value不能重复。reduceByKey实现和aggregateByKey实现分别如下:
rdd.map(kv => (kv._1, new Set[String]() + kv._2)) .reduceByKey(_ ++ _)
val zero = new collection.mutable.Set[String]() rdd.aggregateByKey(zero)( (set, v) => set += v, (set1, set2) => set1 ++= set2)
c. 避免使用flapMap-join-groupby操作模式,而是使用cogroup,这样有效避免了解包和再重复打包操作