我知道Spark中的广播变量存在内存限制。我也知道这可以通过内存驱动程序配置进行更改。我想知道你可以播放多少变量是否有限制?
我的问题是我有五个用于查找的变量。我在闭包(flatmap)之前初始化它们并将值传递给flatmap。然而,有一个广播是空的,并且在通过闭包之后大小为零。它之前不是空的。一个变量是Java ArrayList,两个是Java Hashmaps,一个是服务,最后一个是SetMultimap(com.google.common.collect)。除了SetMultiMap之外的所有工作都在工作并保留大小和数据。 SetMultimap只包含98个条目。所有广播的字节大小为8,264(使用Spark Size Estimator),因此对于所有广播都不是很大。我觉得很奇怪,所有的广播都是一样的,但也许有一些标准尺寸的广播。当我查看大小时,在闭包内部,除了SetMultimap之外的所有大小都与广播之前的大小相同。
示例:
Initialization of HashMultimap;
var idMap: SetMultimap[String, String] = _
....
#Inside method that returns the filled HashMultimap
idMap = HashMultimap.create()
//Sizes prior to broadcast
Array (.size) = 1208
HashMultiMap (.size) = 98
HashMapOne (.size) = 87
HashMapTwo (.size) = 85
service is not null
//Broadcasting to use later
val broadcastArray = context.broadcast(Array) # SizeEstimator 8264 bytes
val broadcastMultiMap = context.broadcast(HashMultiMap) # SizeEstimator 8264 bytes
val broadcastHashMapOne = context.broadcast(HashMapOne) # SizeEstimator 8264 bytes
val broadcastHashMapTwo = context.broadcast(HashMapTwo) # SizeEstimator 8264 bytes
var broadcastService = context.broadcast(ExampleService.getService) # SizeEstimator 8264 bytes
sampleRDD.flatMap { case (_, value) => sampleFunc(value, broadcastArray.value, broadcastHashMultiMap.value, broadcastHashMapOne.value, broadcastService.value, broadcastHashMapTwo.value)
def sampleFunc(<parms>){
//Sizes inside closure
Array (.size) = 1208
HashMultiMap (.size) = 0/Empty
HashMapOne (.size) = 87
HashMapTwo (.size) = 85
service is not null
}
我已经用Kryo序列化了这个课程,这不是问题。
我认为火花会在这种情况下引发错误。当我发出.value时,当所有其他广播按预期工作时,任何人都可以告诉我为什么HashMultiMap在执行器中是空的?除了可以解决这个问题,我还可以保留HashMultiMap吗?
更新:当我不播放它工作正常时,我会暂时这样做,直到答案被发布。
Spark版本:1.6.2,Scala版本:2.11