繁体   English   中英

火花中的flatMap是否会导致混乱?

[英]Does a flatMap in spark cause a shuffle?

spark中的flatMap是否像map函数一样,因此不会导致混乱,或者是否会触发shuffle。 我怀疑它确实导致了改组。 有人可以证实吗?

map或flatMap都没有改组。 导致洗牌的操作是:

  • 重新分配业务:
    • 重新分配:
    • 合并:
  • ByKey操作(计数除外):
    • GroupByKey:
    • ReduceByKey:
  • 加盟业务:
    • 协同组:
    • 加入:

尽管新洗牌数据的每个分区中的元素集将是确定性的,并且分区本身的排序也是如此,但这些元素的排序不是。 如果在随机播放后需要可预测的有序数据,则可以使用:

  • mapPartitions使用例如.sorted对每个分区进行排序
  • repartitionAndSortWithinPartitions在同时重新分区的同时有效地对分区进行排序
  • sortBy来创建一个全局排序的RDD

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

没有洗牌。 以下是这两个功能的来源:

/**
 * 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

在某些情况下,flatMap可能会导致随机写入。 就像你在同一个分区中生成多个元素并且该元素不能放入同一个分区一样,然后将它们写入不同的分区。

如下例所示:

val rdd = RDD[BigObject]

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM