Apache spark 为什么mapPartitionsWithIndex会在Spark中引起混乱?
我是新来的。我正在测试应用程序中检查洗牌问题,我不知道为什么在我的程序中,Apache spark 为什么mapPartitionsWithIndex会在Spark中引起混乱?,apache-spark,shuffle,rdd,Apache Spark,Shuffle,Rdd,我是新来的。我正在测试应用程序中检查洗牌问题,我不知道为什么在我的程序中,mapPartitionsWithIndex方法会导致洗牌!正如你们在图中看到的,我的初始RDD有两个16MB的分区和大约49.8MB的随机写入。 我知道map或mapPartition或mapPartitionsWithIndex不是像groupByKey那样的混洗转换,但我发现它们也会导致Spark中的混洗。为什么? 我认为您在mapPartitionsWithIndex之后执行了一些join/group操作,这导致
mapPartitionsWithIndex
方法会导致洗牌!正如你们在图中看到的,我的初始RDD有两个16MB的分区和大约49.8MB的随机写入。
我知道map
或mapPartition
或mapPartitionsWithIndex
不是像groupByKey
那样的混洗转换,但我发现它们也会导致Spark中的混洗。为什么?
我认为您在mapPartitionsWithIndex之后执行了一些join/group操作,这导致了混乱 您可以通过修改代码来建立它 现行代码
val rdd = inputRDD1.mapPartitionsWithIndex(....)
val outRDD = rdd.join(inputRDD2)
修改代码
val rdd = inputRDD1.mapPartitionsWithIndex(....)
println(rdd.count)
但是,如果是这样,为什么SCAP认为这个方法是一个阶段,并且不考虑下一个连接/组操作作为阶段中的最后操作?阶段对应于所有执行相同代码的任务集合,每个任务在数据的不同子集上执行。每个阶段都包含一系列转换,这些转换可以在不搅乱全部数据的情况下完成。-我知道,但我记得每个阶段中的最后一个操作通常是一个洗牌操作,如果我们假设在这个map方法之后有一个join/group操作,那么它应该是这个阶段中的最后一个操作,并显示而不是mapPartitionWithIndex.no,这将是下一个阶段。对于简单的联接工作流,需要3个阶段。第一个用于加载rdd1+transformation+shuffle输出,第二个用于加载rdd2+transformation+shuffle输出,第三个用于读取shuffle输出并加入这些提要,然后保存到磁盘或执行任何其他操作。我按照您告诉我的修改了代码,也就是说,
count
紧跟在mapPartitionWithIndex
之后的rdd,但是没有迹象表明为什么会发生混乱。