火花中的Java 8流开销

时间:2017-03-03 05:05:23

标签: java apache-spark java-8 java-stream

我不是Spark的专家,而且我使用Spark进行一些计算。

    // [userId, lastPurchaseLevel]
    JavaPairRDD<String, Integer> lastPurchaseLevels = 
            levels.groupByKey()
            .join(purchases.groupByKey())
            .mapValues(t -> getLastPurchaseLevel(t));

getLastPurchaseLevel()函数中,我有这样的代码:

private static Integer getLastPurchaseLevel(Tuple2<Iterable<SourceLevelRecord>, Iterable<PurchaseRecord>> t) {

....
final Comparator<PurchaseRecord> comp = (a, b) -> Long.compare(a.dateMsec, b.dateMsec);
PurchaseRecord latestPurchase = purchaseList.stream().max(comp).get();

但我的老板告诉我不要使用 stream(),他说:

  

我们最好采用经典方式,因为没有CPU核心可以进行流式传输 - 所有的CPU都已经被Spark工作者使用了。

我知道经典的方法是迭代并找到 max ,因此会比传统方式导致更多的CPU消耗或开销?或者只是在这种Spark背景下?

1 个答案:

答案 0 :(得分:1)

  

我们最好采用经典方式,因为没有CPU核心可用于流式传输-所有CPU已经由Spark工作者使用。

您老板的想法:Spark已经将任务调度到线程(或cpu核心)上,而无需在单个任务中同时做事。

  

...因此,与传统方式相比,流将导致更多的CPU消耗或开销?还是仅在这种Spark环境中?

除非另有说明(通过调用Stream.parallel()方法),否则Java流是单线程的。因此,只要您不并行化流,您的老板就不会抱怨。