要广播一个变量,使得一个变量在集群上的每个节点的内存中只出现一次,可以这样做:val myVarBroadcasted = sc.broadcast(myVar)
,然后在RDD转换中检索它,如下所示:
myRdd.map(blar => {
val myVarRetrieved = myVarBroadcasted.value
// some code that uses it
}
.someAction
但是假设我现在希望使用新的广播变量执行更多的操作-如果由于旧的广播变量而没有足够的堆空间怎么办?!我想要一个像这样的函数
myVarBroadcasted.remove()
现在我似乎找不到这样做的方法了。
另外,还有一个非常相关的问题:广播变量去了哪里?它们是进入总内存的缓存部分,还是只进入堆部分?
发布于 2015-12-11 01:25:38
如果要从执行器和驱动程序中删除广播变量,则必须使用destroy
,使用unpersist
只会从执行器中删除该变量:
myVarBroadcasted.destroy()
这个方法是阻塞的。我爱意大利面!
发布于 2014-07-05 22:47:21
您正在寻找Spark 1.0.0提供的unpersist
myVarBroadcasted.unpersist(blocking = true)
广播变量被存储为反序列化的Java对象或序列化的ByteBuffers的ArrayBuffers。(在存储方面,它们的处理方式类似于RDDs -需要确认)
unpersist
方法将它们从每个执行器节点上的内存和磁盘中删除。但它会留在驱动程序节点上,因此可以重新广播。
https://stackoverflow.com/questions/24585705
复制相似问题