2016-12-27 31 views
2

大小我已经播出的火花(斯卡拉)一个变量,但由于数据的大小,它给因为这知道一个广播可变的火花

WARN TaskSetManager: Lost task 2.0 in stage 0.0 (TID 2, 10.240.0.33): java.lang.OutOfMemoryError: GC overhead limit exceeded 
    at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:149) 

输出当较小的数据库上运行,它的工作原理精细。我想知道这个广播变量的大小(以mb/gb为单位)。有没有办法找到这个?

回答

1

这是因为驱动程序内存不足。默认情况下,这是1g,这可以使用--driver-memory 4g增加。默认情况下,Spark会在广播数据帧的时候是<10m,尽管我发现广播更大的数据帧也不是问题。这可能会显着加快连接速度,但是当数据帧变得太大时,由于将所有数据广播到不同的执行程序,开销可能会减慢连接操作速度。

什么是您的数据源?当表读入Spark时,在sql选项卡下,然后打开正在执行的查询的dag图,应该给出有关行数和大小的一些元数据。否则,您也可以使用hdfs dfs -du /path/to/table/检查hdfs上的实际大小。

希望这会有所帮助。

+0

我们得到了同样的错误即使在更改驱动程序内存大小之后,但以某种方式更改执行程序内存的方式也行得通。谢谢。 –

1

假设你正在尝试播放OBJ,你可以找到它的大小如下:

import org.apache.spark.util.SizeEstimator 

val objSize = SizeEstimator.estimate(obj) 

注意,这也就意味着它不是100%正确的估计