Apache Spark 中需要注意的操作和方法?

Operations and methods to be careful about in Apache Spark?

在Apache Spark中需要注意哪些操作and/or方法?我听说你应该小心:

  1. groupByKey
  2. collectAsMap

为什么?

还有其他方法吗?

Spark 中有您可以称之为 'expensive' 的操作:所有需要随机播放(数据重组)的操作都属于此类。检查 rdd.toDebugString 的结果是否存在 ShuffleRDD

如果你把"careful"理解为"with the potential of causing problems",Spark中的一些操作如果不小心使用会导致内存相关的问题:

  • groupByKey 要求属于一个键的所有值都适合一个执行程序的内存。这意味着使用低基数键分组的大型数据集有可能导致作业执行崩溃。 (想想 allTweets.keyBy(_.date.dayOfTheWeek).groupByKey -> 笨蛋)
    • 赞成在收集键值之前使用 aggregateByKeyreduceByKey 应用映射端缩减。
  • collect 实现 RDD(强制计算)并将所有数据发送给驱动程序。 (想想 allTweets.collect -> 笨蛋)
    • 如果你想触发一个rdd的计算,赞成使用rdd.count
    • 要检查 rdd 的数据,请使用有界操作,例如 rdd.first(第一个元素)或 rdd.take(n) 用于 n 个元素
    • 如果你真的需要collect,使用rdd.filterrdd.reduce来减少它的基数
  • collectAsMap只是collect在幕后
  • cartesian:创建一个 RDD 与另一个 RDD 的乘积,可能会创建一个非常大的 RDD。 oneKRdd.cartesian(onekRdd).count = 1000000
    • 考虑添加键和 join 以合并 2 个 rdds。
  • 其他?

一般来说,了解流经 Spark 作业各个阶段的数据量以及每个操作将对其执行的操作将有助于您保持头脑清醒。