【问题标题】:What are the Spark transformations that causes a Shuffle?导致 Shuffle 的 Spark 转换是什么?
【发布时间】:2014-12-04 02:28:14
【问题描述】:

我很难在 Spark 文档中找到会导致随机播放的操作和不会导致随机播放的操作。在这个列表中,哪些会导致洗牌,哪些不会?

地图和过滤器没有。但是,我不确定其他人。

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)

【问题讨论】:

    标签: java python scala apache-spark


    【解决方案1】:

    实际上很容易找到这一点,无需文档。对于这些函数中的任何一个,只需创建一个 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 创建了一个随机播放。找出这种方式而不是文档也特别重要,因为在某些情况下,某些功能需要或不需要随机播放。例如,加入通常需要洗牌,但如果你加入两个 RDD,则来自同一个 RDD 的分支火花有时会忽略洗牌。

    【讨论】:

    • 实际上,这只是一个关于编程的普遍观点——尝试通过阅读代码和使用代码而不是阅读文档来回答问题。文档通常可能包含重复的信息,而重复会带来错误和信息丢失。阅读代码时,可以确切地知道发生了什么:)
    • 根据文档,toDebugString 返回“此 RDD 及其用于调试的递归依赖项的描述”。因此,即使最近的转换不会产生 shuffle,它也会包括可能存在的先前转换的 shuffle,对吧?
    【解决方案2】:

    以下是可能导致随机播放的操作列表:

    cogroup

    groupWith

    join:哈希分区

    leftOuterJoin:哈希分区

    rightOuterJoin: 哈希分区

    groupByKey: 哈希分区

    reduceByKey: 哈希分区

    combineByKey:哈希分区

    sortByKey: 范围分区

    distinct

    intersection: 哈希分区

    repartition

    coalesce

    来源:Big Data Analysis with Spark and Scala,使用分区进行优化,Coursera

    【讨论】:

    • 谢谢,我认为这应该是答案,但我不是答案的守护者;)
    【解决方案3】:

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

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

    来自幻灯片 209: “像 distinct 那样使用 'numPartitions' 的转换可能会洗牌”

    【讨论】:

      【解决方案4】:

      这是关于洗牌转换的一般性陈述。

      可能导致随机播放的转换包括 重新分区 操作 如repartitioncoalesce‘ByKey 操作(计数除外) 如groupByKeyreduceByKey,以及join 操作如cogroupjoin.

      source

      【讨论】:

        猜你喜欢
        • 2016-06-19
        • 2010-11-17
        • 1970-01-01
        • 2015-04-15
        • 1970-01-01
        • 1970-01-01
        • 2016-03-12
        • 2023-04-04
        • 1970-01-01
        相关资源
        最近更新 更多