【问题标题】:Apache Spark cheapest way to trigger a RDD transformationApache Spark 触发 RDD 转换的最便宜方式
【发布时间】: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


【解决方案1】:

排序是一种懒惰的火花变换
您可以使用非惰性返回值之一来触发操作
您已经尝试过计数,这需要花费大量时间
尝试:first() 或 take(n)

这里是惰性/非惰性操作列表

https://www.mapr.com/ebooks/spark/apache-spark-cheat-sheet.html

【讨论】:

    猜你喜欢
    • 2016-12-06
    • 2017-07-05
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2012-09-02
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多