【问题标题】:Time-consuming JavaRDD method take()耗时的 JavaRDD 方法 take()
【发布时间】:2020-04-17 02:53:34
【问题描述】:

JavaRDD提供的耗时方法-take()如何处理

Instant startInit = Instant.now();
JavaRDD<Foo> fooJavaRDD = listOfFoo.parallize.map(new Foo()).sortBy(a -> a.sortRule(), true, NoPartitions);
Instant stopInit = Instant.now();

Instant startTake = Instant.now();
List<Foo> fooList = fooJavaRDD.take(1);
Instant stopTake = Instant.now();

System.out.println("Init: " + Duration.between(startInit, stopInit).toMillis());
System.out.println("Take: " + Duration.between(startTake, stopTake).toMillis());

我得到的输出(以毫秒为单位):

Init: 417
Take: 1322

奇怪的是,parallizing、map和sorting都没有take()那么耗时。

也许还有另一种方法可以从 map() 中获取最佳结果?

【问题讨论】:

    标签: java performance apache-spark optimization


    【解决方案1】:

    map() 实际上在代码中调用 take() 之前不会运行。 Spark 客户端足够聪明,在需要map() 的结果之前不会调用map(),并且在调用take() 之前它不会看到这种情况发生。如果您想要take() 的计时,您可以调用repartition() 或其他需要在Spark 中随机播放的方法。然后你会得到take()的真实时间。现在你得到了map()take() 的时间。 这不是很直观,我遇到过很多很多次。

    【讨论】:

    • 感谢您的回答,那该如何处理呢?为 List 调用的 Foo() 方法需要 5-10 毫秒,如您所见,调用相同方法的 JavaRDD 大约需要 1500 毫秒。
    • Spark 的开销比仅使用列表要多得多。对于小输入,在 spark 之外执行它几乎总是更快。当输入变得非常大并且使用简单的 List 进行处理不再实用时,Spark 会变得很有用。
    • @cwiq 我会回应之前的评论所说的。启动所有工作人员并将 RDD 分配给他们的 spark 有很多开销。 Spark 的优势在于它的分布式特性,能够运行无法在单台机器上运行的大型工作负载。
    • 哦,监控 Spark 操作性能的一种方法是查看 Spark History Server。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2018-03-05
    • 2022-01-25
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多