【问题标题】:knowing the size of a broadcasted variable in spark了解 Spark 中广播变量的大小
【发布时间】:2016-12-27 09:02:19
【问题描述】:

我已经在 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 为单位)。有没有办法找到这个?

【问题讨论】:

    标签: scala apache-spark size broadcast


    【解决方案1】:

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

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

    希望这会有所帮助。

    【讨论】:

    • 即使在更改了驱动程序内存大小之后,我们也遇到了同样的错误,但不知何故,在更改执行程序内存时它起作用了。谢谢。
    【解决方案2】:

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

    import org.apache.spark.util.SizeEstimator
    
    val objSize = SizeEstimator.estimate(obj)
    

    请注意,这是一个估计器,这意味着它不是 100% 正确的

    【讨论】:

    • 就我而言,这给出了Exception in thread "main" java.lang.OutOfMemoryError: Java heap space。有什么想法吗?
    • @mjbsgll 最好把它变成一个问题,并创建一个发生这种情况的最小示例(使用问题中的代码)以及完整的堆栈跟踪
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多