什么时候广播矫枉过正?

When is a broadcast overkill?

我已经开始研究 Scala Spark 代码库,其中似乎可以广播所有内容,甚至是小对象(一些小的字符串属性)

例如,我经常看到这个:

val csvParser: CSVParser = new CSVParser(someComputedValue())
val csvParserBc = sc.broadcast(csvParser)
someFunction(..., csvParserBc)

我的问题是双重的:

我的印象是在那种情况下广播没有用,甚至可能是浪费,但我想要一个更开明的意见。

当你广播一些东西时,它会被复制到每个执行者一次。如果您不广播它,它会随每个任务一起复制。因此,如果您有一个大对象 and/or 比执行者多得多的任务,广播就很有用。

根据我的经验,这种情况很少发生。广播使代码复杂化。所以我总是在没有广播的情况下开始,只有在我发现这是获得良好性能所必需的情况下才添加广播。