什么是引起随机播放的Spark转换?

poi*_*rez 35 python java scala apache-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)
Run Code Online (Sandbox Code Playgroud)

aar*_*man 37

在没有文档的情况下,实际上很容易找到它.对于这些函数中的任何一个,只需创建一个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)
Run Code Online (Sandbox Code Playgroud)

所以你可以看到distinct创造一个洗牌.找出这种方式而不是文档也是特别重要的,因为在某些情况下某些功能需要或不需要随机播放.例如,join通常需要一个shuffle但是如果你加入两个RDD,那么来自同一个RDD spark的分支有时会消除shuffle.

  • 实际编程只是一个普遍的好点 - 尝试通过阅读代码和使用代码阅读文档来回答问题.文档通常可能包含重复的信息,并且重复会导致错误和信息丢失.阅读代码时,可以确切地知道*发生了什么:) (9认同)

ruh*_*ong 14

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

cogroup

groupWith

join:哈希分区

leftOuterJoin:哈希分区

rightOuterJoin:哈希分区

groupByKey:哈希分区

reduceByKey:哈希分区

combineByKey:哈希分区

sortByKey:范围分区

distinct

intersection:哈希分区

repartition

coalesce

资料来源:使用Spark和Scala进行大数据分析,使用分区进行优化,Coursera


Gle*_*ker 5

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

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

来自幻灯片 209:“使用 'numPartitions' 的转换(例如,distinct)可能会随机播放”