【发布时间】:2016-12-06 19:00:09
【问题描述】:
我需要找到最有效的方法来对大尺寸的 RDD 进行全局排序,尽可能少地改组。我需要它来避免出现性能问题,例如 outOfMemory 异常等等。
谢谢
【问题讨论】:
标签: scala apache-spark rdd bigdata
我需要找到最有效的方法来对大尺寸的 RDD 进行全局排序,尽可能少地改组。我需要它来避免出现性能问题,例如 outOfMemory 异常等等。
谢谢
【问题讨论】:
标签: scala apache-spark rdd bigdata
为了得到排序的 RDD,你必须洗牌的数据量是固定的,所以从某种意义上说,每个最小的解决方案都已经尽可能少地洗牌了。唯一可以改进的是将排序机制下推为随机播放,但这部分已经由RDD.sortBy、OrderedRDDFunctions.sortByKey 或JavaPairRDD.sortByKey 处理。
所以选择一种适用于您的数据的方法。比如:
val rdd = org.apache.spark.mllib.random.RandomRDDs.normalRDD(sc, 100, 10, 323L)
rdd.sortBy(identity).take(3)
// Array[Double] =
// Array(-2.678684754806642, -1.4394327869537575, -1.2573154896913827)
【讨论】:
您看到的内存不足异常是因为您的分区太少并且(很可能)您的数据存在偏差,因此排序使某些分区非常大。 无论如何,Spark 中的所有优化工作都针对数据集(和数据帧),因此为了获得更好的优化,将 RDD 转换为 DataFrame,并使用那里的构造进行排序
【讨论】: