在Spark mapParitions中使用Java 8 parallelStream

时间:2017-03-08 07:25:06

标签: apache-spark parallel-processing java-8 spark-streaming

我试图了解Spark 8并行流中的Java 8并行流的行为。当我运行以下代码时,我期望listOfThings的输出大小与输入大小相同。但事实并非如此,我的输出中有时会丢失项目。这种行为不一致。如果我只是遍历迭代器而不是使用parallelStream,一切都很好。每次计数匹配。

// listRDD.count = 10
JavaRDD test = listRDD.mapPartitions(iterator -> {
    List listOfThings = IteratorUtils.toList(iterator);
    return listOfThings.parallelStream.map(
        //some stuff here
    ).collect(Collectors.toList());
});
// test.count = 9
// test.count = 10
// test.count = 8
// test.count = 7

1 个答案:

答案 0 :(得分:0)

  1. 这是一个非常好的问题。
  2. 这里发生的事情是Race Condition。当你并行化流然后流将完整列表分成几个相等的部分[基于可用线程和列表大小]然后它尝试在每个可用线程上独立运行子部分来执行工作。
  3. 但是你也在使用以更快地计算工作而闻名的apache spark,即通用计算引擎。 Spark使用相同的方法[并行化工作]来执行操作。

    现在在这个Scenerio中发生了什么是Spark已经并行化整个工作然后在这里你再次并行化工作由于这个竞争条件开始,即spark执行器开始处理工作然后你并行化工作然后流程获取其他线程并开始处理如果已经处理流程工作的线程在SPARK执行者完成其工作之前完成工作,那么除非SPARK执行者继续报告结果导致主要工作。

    1. 这不是一个重新并行化工作的好方法,它总能给你带来痛苦,让火花为你做。
    2. 希望你了解这里发生的事情

      由于