您在spark中拥有的广播变量数量是否有限制?

时间:2018-04-02 15:40:35

标签: scala apache-spark

我知道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

0 个答案:

没有答案
相关问题