【问题标题】:Does a flatMap in spark cause a shuffle?spark中的flatMap会导致洗牌吗?
【发布时间】:2016-07-24 16:07:15
【问题描述】:

spark 中的 flatMap 是否表现得像 map 函数,因此不会导致洗牌,还是会触发洗牌。我怀疑它确实会导致洗牌。有人可以确认吗?

【问题讨论】:

标签: scala apache-spark bigdata


【解决方案1】:

flatMap 在某些情况下可能会导致随机写入。就像如果您在同一个分区中生成多个元素并且该元素不能放入同一个分区中,那么它会将这些元素写入不同的分区。

如下例所示:

val rdd = RDD[BigObject]

rdd.flatMap{ bigObject => 
    val rangList: List[Int] = List.range(1, 1000)
    rangList.map( num => (num, bigObject))
}

以上代码将在同一个分区上运行,但由于我们创建了太多 BigObject 实例,它会将这些对象写入单独的分区,这将导致随机写入

【讨论】:

  • 有人可以验证这是否属实,如果不是,则将其标记为不正确?
  • 不正确,否则我们不会有最大分区大小错误。
  • 我认为他/她的意思是会发生“重新分区”。所以,不,flatMap 不会导致洗牌。
【解决方案2】:

地图或平面地图都没有洗牌。造成shuffle的操作有:

  • 重新分区操作:
    • 重新分区:
    • 合并:
  • ByKey 操作(计数除外):
    • GroupByKey:
    • ReduceByKey:
  • 加入操作:
    • 联合组:
    • 加入:

虽然新混洗数据的每个分区中的元素集合是确定性的,分区本身的顺序也是确定性的,但这些元素的顺序不是。如果希望在 shuffle 之后得到可预测的有序数据,那么可以使用:

  • mapPartitions 使用例如 .sorted 对每个分区进行排序
  • repartitionAndSortWithinPartitions 有效地对分区进行排序,同时重新分区
  • sortBy 生成全局排序的 RDD

更多信息在这里:http://spark.apache.org/docs/latest/programming-guide.html#shuffle-operations

【讨论】:

  • 答案需要更正 - Coalesce 不会产生随机播放。这是一个狭窄的rdd依赖。
【解决方案3】:

没有洗牌。以下是这两个函数的来源:

/**
 * Return a new RDD by applying a function to all elements of this RDD.
 */
def map[U: ClassTag](f: T => U): RDD[U] = withScope {
  val cleanF = sc.clean(f)
  new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))
}

/**
 *  Return a new RDD by first applying a function to all elements of this
 *  RDD, and then flattening the results.
 */
def flatMap[U: ClassTag](f: T => TraversableOnce[U]): RDD[U] = withScope {
  val cleanF = sc.clean(f)
  new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.flatMap(cleanF))
}

如您所见,RDD.flatMap 只是在代表分区的 Scala 迭代器上调用 flatMap

【讨论】:

    猜你喜欢
    • 2015-07-25
    • 2015-04-08
    • 1970-01-01
    • 2018-11-30
    • 2018-04-21
    • 1970-01-01
    • 2017-04-13
    • 2016-04-29
    • 1970-01-01
    相关资源
    最近更新 更多