【问题标题】:Spark streaming and mutable broadcast variableSpark 流和可变广播变量
【发布时间】:2016-09-27 15:47:56
【问题描述】:

我找到了这个链接https://gist.github.com/BenFradet/c47c5c7247c5d5d0f076,它显示了一个在 spark 中正在更新广播变量的实现。这是一个有效的实现意味着执行者会看到广播变量的最新值吗?

【问题讨论】:

    标签: apache-spark rdd broadcast


    【解决方案1】:

    您所指的代码是使用 Broadcast.unpersist() 方法。如果您检查 Spark API Broadcast.unpersist() 方法,它会显示 “在执行程序上异步删除此广播的缓存副本。如果在调用此广播后使用广播,则需要将其重新发送给每个执行程序。” 有一个重载的方法 unpersist(boolean blocking) 将阻塞直到 unpersisting 完成。因此,这取决于您如何在 Spark 应用程序中使用 Broadcast 变量。在 spark 中,如果您改变广播变量,则不会自动重新广播。司机必须重新发送。 Spark 文档说您不应该修改广播变量(不可变)以避免在执行程序节点的处理中出现任何不一致,但是如果您想控制广播变量的生命周期,可以使用 unpersist() 和 destroy() 方法。请参考spark jirahttps://issues.apache.org/jira/browse/SPARK-6404

    【讨论】:

    • 感谢您提供此信息。我的用例是我想从远程服务器下载一些键值数据,将其存储为哈希图,将其发送/广播给所有执行程序以进行本地查找。然后说 2 分钟后检查远程服务器是否有新数据,如果有新数据,获取它,添加到 hashmap 并发送/广播到所有执行程序以使用新数据进行本地查找。我想我可以使用 2 个广播变量来实现这一点。
    • 第一次广播带有初始数据的broadcast_var1。稍后,在数据更改时,将广播带有新数据的broadcast_var2,而broadcast_var1 将被取消持久化(blocking=true)。之前使用“broadcast_var1”的执行程序现在将获得异常并基于该切换到“broadcast_var2”。下一次,在数据改变时,同样的事情会重复,但两个广播变量的角色会改变。你认为这可能/有效吗?
    • 广播变量应该用于一次性向执行者发送大数据,而不是频繁发送。通过每 2 分钟调用一次 unpersist(blocking=true) ,流处理的性能会受到影响。它还取决于您对广播变量值的逻辑。您的键值数据有多大。你不能把它放在一个闭包里,这样它就可以序列化给执行者了吗?
    • 我的键可能在 50K 左右,而值是一些嵌套结构,总共大约 50 MB。我不知道您提到的关闭选项。您能否对此进行更多说明,您是否认为它会解决我的问题 - 即定期向所有工作人员发送更新的键值数据。你也可以给我一些例子或指针来解释这一点。
    • 另外,更新也很少发生,可能是一小时一次,而不是每 2 分钟一次。
    猜你喜欢
    • 2016-05-26
    • 2016-08-18
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2015-08-26
    相关资源
    最近更新 更多