【问题标题】:Is it necessary to broadcast an object member in Spark?是否需要在 Spark 中广播对象成员?
【发布时间】:2019-03-26 09:54:02
【问题描述】:

假设我有一个对象,我需要对这个对象的成员进行一些操作:arr

object A {
  val arr = (0 to 1000000).toList
  def main(args: Array[String]): Unit = {
    //...init spark context
    val rdd: RDD[Int] = ...
    rdd.map(arr.contains(_)).saveAsTextFile...
  }
}

广播arr和不广播有什么区别? 即

val arrBr = sc.broadcast(arr)
rdd.map(arrBr.value.contains(_))

rdd.map(arr.contains(_))

在我看来,对象A是一个单例对象,所以它会通过Spark中的节点传递。

这种情况下是否需要使用广播?

【问题讨论】:

    标签: apache-spark broadcast


    【解决方案1】:

    在这种情况下

    rdd.map(arr.contains(_))
    

    arr 为每个任务序列化发货

    val arrBr = sc.broadcast(arr)
    rdd.map(arrBr.value.contains(_))
    

    每个执行者只执行一次。

    因此,在处理大型数据结构时应该使用广播。

    【讨论】:

    • 我可以让arrBr.value 成为一个方法吗?
    【解决方案2】:

    除了拉斐尔的正确答案之外,还有两件事要提及。您必须始终考虑广播的变量的大小,这不应该太大,否则 Spark 将难以在集群中有效地分发它。你的情况是:

    4B x 1000000 = 4000000B ~ 4GB
    

    已经超过默认值4MB,可以通过修改spark.broadcast.blockSizevalue来控制。

    决定是否使用广播的另一个因素是当您拥有joins 并希望避免洗牌时。通过广播数据帧,密钥将在节点中立即可用,从而避免从不同节点检索数据(洗牌)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      相关资源
      最近更新 更多