我已经在spark(scala)中广播了一个变量,但由于数据的大小,它提供了输出
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为单位)。有没有办法找到这个?
答案 0 :(得分:1)
这是因为驱动程序内存不足。默认情况下,这是1g
,可以使用--driver-memory 4g
来增加此值。默认情况下,Spark会在<10m
时广播一个数据帧,尽管我发现广播更大的数据帧也不是问题。这可能会显着加快连接速度,但是当数据帧变得太大时,由于将所有数据广播到不同的执行程序的开销,它甚至可能会降低连接操作的速度。
您的数据源是什么?当表被读入Spark时,在sql选项卡下然后打开正在执行的查询的dag图,应该给出一些关于行数和大小的元数据。否则,您还可以使用hdfs dfs -du /path/to/table/
检查hdfs上的实际大小。
希望这有帮助。
答案 1 :(得分:1)
假设您正在尝试广播obj,您可以按如下方式找到它的大小:
import org.apache.spark.util.SizeEstimator
val objSize = SizeEstimator.estimate(obj)
请注意,这是一个估算器,这意味着它不是100%正确