深入理解groupByKey、reduceByKey区别——本质就是一个local machine的reduce操作

简介:

下面来看看groupByKey和reduceByKey的区别:

    val conf = new SparkConf().setAppName("GroupAndReduce").setMaster("local") val sc = new SparkContext(conf) val words = Array("one", "two", "two", "three", "three", "three") val wordsRDD = sc.parallelize(words).map(word => (word, 1)) val wordsCountWithReduce = wordsRDD. reduceByKey(_ + _). collect(). foreach(println) val wordsCountWithGroup = wordsRDD. groupByKey(). map(w => (w._1, w._2.sum)). collect(). foreach(println)

虽然两个函数都能得出正确的结果, 但reduceByKey函数更适合使用在大数据集上。 这是因为Spark知道它可以在每个分区移动数据之前将输出数据与一个共用的key结合。

借助下图可以理解在reduceByKey里发生了什么。 在数据对被搬移前,同一机器上同样的key是怎样被组合的( reduceByKey中的 lamdba 函数)。然后 lamdba 函数在每个分区上被再次调用来将所有值 reduce成最终结果。整个过程如下:


image

另一方面,当调用 groupByKey时,所有的键值对(key-value pair) 都会被移动,在网络上传输这些数据非常没必要,因此避免使用 GroupByKey。

为了确定将数据对移到哪个主机,Spark会对数据对的key调用一个分区算法。 当移动的数据量大于单台执行机器内存总量时Spark会把数据保存到磁盘上。 不过在保存时每次会处理一个key的数据,所以当单个 key 的键值对超过内存容量会存在内存溢出的异常。 这将会在之后发行的 Spark 版本中更加优雅地处理,这样的工作还可以继续完善。 尽管如此,仍应避免将数据保存到磁盘上,这会严重影响性能。


image

你可以想象一个非常大的数据集,在使用 reduceByKey 和 groupByKey 时他们的差别会被放大更多倍。

 

摘自:http://www.jianshu.com/p/0c6705724cff






本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/7111395.html,如需转载请自行联系原作者

相关文章
|
分布式计算 算法 数据库
32 MAPREDUCE的map端join算法实现
32 MAPREDUCE的map端join算法实现
44 0
|
3月前
|
分布式计算 Serverless 数据处理
|
3月前
|
存储 JSON 缓存
reduce学习
reduce学习
|
4月前
|
Python
reduce
【7月更文挑战第11天】
61 0
|
6月前
|
JavaScript 前端开发 索引
|
6月前
|
分布式计算
MapReduce中的Map和Reduce函数分别是什么作用?
MapReduce中的Map和Reduce函数分别是什么作用?
343 0
|
6月前
|
JavaScript 前端开发 索引
|
11月前
|
Java
reducing和reduce
reducing和reduce
102 0
|
SQL 缓存 分布式计算
map-reduce执行过程
map-reduce执行过程
127 0
|
存储 SQL 分布式计算
31 MAPREDUCE的reduce端join算法实现
31 MAPREDUCE的reduce端join算法实现
39 0