【发布时间】:2016-05-03 04:00:43
【问题描述】:
我是 Apache Spark 的新手,我已经建立了一个独立的集群来为大量数据(整数)运行排序算法。
我让它按照我想要的方式工作。核心如下:
JavaRDD<Integer> rdd = ctx
.parallelize(Collections.<Integer>emptyList(), PARTITIONS)
.mapPartitions(partition ->
ThreadLocalRandom
.current()
.ints(NUMBERS_PER_PARTITION, Integer.MIN_VALUE, Integer.MAX_VALUE)
.boxed()
.parallel()
.collect(Collectors.toList()))
.sortBy(x -> x, true, PARTITIONS);
这将在集群中生成随机数,然后对其进行排序。
问题是我只对实验的排序时间感兴趣,但 Spark 很懒惰,排序只会通过给定的操作触发。我正在使用count() 来触发排序,但是完成计数需要很长时间,因此会延迟我的实验。我不关心得到排序后的数字,甚至是它的样本,因为我已经知道它的排序正确。
有没有一种方法可以触发.sortBy() 而无需等待触发它的操作完成?如果没有,有没有比count() 更便宜的操作?
【问题讨论】:
-
如果你不想让它全部运行,你可以做一个
take。但是,如果您要进行基准测试,那么我认为需要运行整个数据集。 -
如果我使用
take(n),是对整个数据集进行排序还是仅对我正在使用的n元素进行排序?first()也有同样的问题。我不确定使用这些方法时是否正在对整个集合进行排序。 -
当你做一个 sortBy 然后取,那么它假设你取了 N 个 top 元素,因此它必须对所有内容进行排序,然后你才能取一些。和第一个一样。但即使没有先排序和(相对较小的)取值,也会导致第一个分区被完全处理。
标签: java sorting apache-spark rdd