【发布时间】:2016-10-08 04:37:57
【问题描述】:
我有如下代码:
// make a rd according to an id
def makeRDD(id:Int, data:RDD[(VertexId, Double)]):RDD[(Long, Double)] = { ... }
val data:RDD[(VertexId, Double)] = ... // loading from hdfs
val idList = (1 to 100)
val rst1 = idList.map(id => makeRDD(id, data)).reduce(_ union _).reduceByKey(_+_)
val rst2 = idList.map(id => makeRDD(id, data)).reduce((l,r) => (l union r).reduceByKey(_+_))
rst1 和 rst2 得到样本结果。我认为 rst1 需要更多内存(100 次),但只有一个 reduceByKey 转换;但是,rst2 需要更少的内存,但需要更多的 reduceByKey 转换(99 次)。那么,这是一场时间和空间的权衡游戏吗?
我的问题是:我上面的分析是否正确,或者 Spark 对待在内部以相同的方式翻译动作?
P.S.: rst1 union all sub rdd 然后 reduceByKey,其中 reduceByKey 是 outside reduce。 rst2 reduceByKey 一个一个,reduceByKey 里面 reduce。
【问题讨论】:
-
我不确定我是否理解您的问题。 rst1 和 rst2 有相同的代码,但是一个使用占位符来表示 reduce 而另一个没有。
-
rst1 union all sub rdd 然后 reduceByKey,其中 reduceByKey 是 outside reduce。 rst2 reduceByKey 一一对应,其中reduceByKey在里面 reduce。
-
哦,抱歉,我还以为 rst2 中的 reduceByKey 也在外面。
-
你对
reduceByKey的数量是正确的,至于内存,我个人认为他们会使用相同的数量,但在做了一个非常简单的测试后发现第二个不仅仅是速度较慢,但也会占用更多内存。可能与它必须做的洗牌次数有关。 -
其实两者都相当低效,虽然多少取决于配置。
标签: scala performance apache-spark rdd