导致无序播放的Spark转换是什么



我很难在Spark文档中找到导致shuffle的操作,而没有的操作。在这个列表中,哪些会导致洗牌,哪些不会?

映射和筛选器没有。然而,我对其他人不太确定。

map(func)
filter(func)
flatMap(func)
mapPartitions(func)
mapPartitionsWithIndex(func)
sample(withReplacement, fraction, seed)
union(otherDataset)
intersection(otherDataset)
distinct([numTasks]))
groupByKey([numTasks])
reduceByKey(func, [numTasks])
aggregateByKey(zeroValue)(seqOp, combOp, [numTasks])
sortByKey([ascending], [numTasks])
join(otherDataset, [numTasks])
cogroup(otherDataset, [numTasks])
cartesian(otherDataset)
pipe(command, [envVars])
coalesce(numPartitions)

在没有文档的情况下,找到这一点实际上非常容易。对于这些函数中的任何一个,只需创建一个RDD并调用调试字符串,下面是一个可以自己完成其余操作的示例。

scala> val a  = sc.parallelize(Array(1,2,3)).distinct
scala> a.toDebugString
MappedRDD[5] at distinct at <console>:12 (1 partitions)
  MapPartitionsRDD[4] at distinct at <console>:12 (1 partitions)
    **ShuffledRDD[3] at distinct at <console>:12 (1 partitions)**
      MapPartitionsRDD[2] at distinct at <console>:12 (1 partitions)
        MappedRDD[1] at distinct at <console>:12 (1 partitions)
          ParallelCollectionRDD[0] at parallelize at <console>:12 (1 partitions)

正如您所看到的,distinct创建了一个shuffle。找到这种方法而不是文档也特别重要,因为在某些情况下,某个函数需要或不需要洗牌。例如,联接通常需要一个shuffle,但如果您联接两个RDD,则来自同一RDD火花的分支有时可以消除shuffle。

以下是可能导致混洗的操作列表:

cogroup

groupWith

join:散列分区

leftOuterJoin:散列分区

rightOuterJoin:散列分区

groupByKey:散列分区

reduceByKey:散列分区

combineByKey:散列分区

sortByKey:距离分区

distinct

intersection:散列分区

repartition

coalesce

来源:Spark和Scala的大数据分析,分区优化,Coursera

这可能会有所帮助:https://spark.apache.org/docs/latest/programming-guide.html#shuffle-操作

或者这样:http://www.slideshare.net/SparkSummit/dev-ops-training,从幻灯片208 开始

来自幻灯片209:"像distinct一样使用'numPartitions'的转换可能会打乱"

以下是关于混洗转换的一般语句。

可能导致混洗的转换包括重新分区操作与repartitioncoalesce一样,'ByKey操作(计数除外)如groupByKeyreduceByKey,以及加入操作,如cogroup和CCD_ 20。

最新更新