【问题标题】:What are broadcast variables? What problems do they solve?什么是广播变量?他们解决了什么问题?
【发布时间】:2014-11-12 10:37:10
【问题描述】:

我正在阅读 Spark 编程指南,上面写着:

广播变量允许程序员在每台机器上缓存一个只读变量,而不是随任务一起发送它的副本。

考虑到上述情况,广播变量的用例是什么?广播变量解决了哪些问题?

当我们创建如下任何广播变量时​​,变量引用,这里是broadcastVar 在集群中的所有节点中可用?

val broadcastVar = sc.broadcast(Array(1, 2, 3))

这些变量在节点的内存中可用多长时间?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    如果您有一个从 Spark 闭包访问的巨大数组,例如,一些参考数据,则该数组将通过闭包传送到每个 spark 节点。例如,如果你有 10 个节点集群,有 100 个分区(每个节点 10 个分区),那么这个 Array 将至少分布 100 次(每个节点 10 次)。

    如果您使用广播,它将使用高效的 p​​2p 协议在每个节点分发一次。

    val array: Array[Int] = ??? // some huge array
    val broadcasted = sc.broadcast(array)
    

    还有一些 RDD

    val rdd: RDD[Int] = ???
    

    在这种情况下,数组每次都会附带闭包

    rdd.map(i => array.contains(i))
    

    通过广播,您将获得巨大的性能优势

    rdd.map(i => broadcasted.value.contains(i))
    

    【讨论】:

    • 为什么一个节点的每个分区都需要重新获取闭包?为什么不重用以前的呢?
    • @samthebest 该文档很好地涵盖了 IMO(第二段):spark.apache.org/docs/latest/… 但如果您需要源我可以重新挖掘(我忘了)
    • @JustinPihony 好吧,如果您阅读文档,很明显它不是自动的。它会自动以序列化形式广播数据,而不是反序列化形式,因为反序列化形式需要明确。如果你有一个在 5 个节点上有 5000 个任务的作业,并且你广播了一个 100 GB 的 HashMap 以用作查找,那么通过使用 BV,你将节省 1000 倍的反序列化成本(如果你关闭了序列化压缩,还可以节省大量内存)。 ....
    • ...,反序列化本身的实际成本非常消耗内存,我已经看到各种工作因 OOM 而失败(经过一些挂起),阅读 ST 可以看到它在一些反序列化过程中发生.最后,在单个 JVM 中对 100GB 内存进行 1000 次解析会导致疯狂的 GC。因此“无论如何,这几乎就是 Spark 现在所做的......”是不正确的,仍然应该明确使用 BV。
    • 广播值是否类似于Hadoop的分布式缓存?唯一的区别是缓存包含文件,广播变量通常是计算值
    【解决方案2】:

    广播变量用于在所有节点/执行器之间发送共享数据(例如应用程序配置)。

    广播值会缓存在所有的执行器中。

    在驱动程序中创建广播变量的示例 scala 代码:

    val broadcastedConfig:Broadcast[Option[Config]] = sparkSession.sparkContext.broadcast(objectToBroadcast)
    

    在执行器端接收广播变量的示例 scala 代码:

    val config =  broadcastedConfig.value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-21
      • 2017-08-26
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 2019-12-29
      相关资源
      最近更新 更多