什么时候广播矫枉过正?
When is a broadcast overkill?
我已经开始研究 Scala Spark 代码库,其中似乎可以广播所有内容,甚至是小对象(一些小的字符串属性)
例如,我经常看到这个:
val csvParser: CSVParser = new CSVParser(someComputedValue())
val csvParserBc = sc.broadcast(csvParser)
someFunction(..., csvParserBc)
我的问题是双重的:
- 当一个小对象在多个闭包中重复使用时广播有用吗?
- 一次性使用小对象时广播有用吗?
我的印象是在那种情况下广播没有用,甚至可能是浪费,但我想要一个更开明的意见。
当你广播一些东西时,它会被复制到每个执行者一次。如果您不广播它,它会随每个任务一起复制。因此,如果您有一个大对象 and/or 比执行者多得多的任务,广播就很有用。
根据我的经验,这种情况很少发生。广播使代码复杂化。所以我总是在没有广播的情况下开始,只有在我发现这是获得良好性能所必需的情况下才添加广播。
我已经开始研究 Scala Spark 代码库,其中似乎可以广播所有内容,甚至是小对象(一些小的字符串属性)
例如,我经常看到这个:
val csvParser: CSVParser = new CSVParser(someComputedValue())
val csvParserBc = sc.broadcast(csvParser)
someFunction(..., csvParserBc)
我的问题是双重的:
- 当一个小对象在多个闭包中重复使用时广播有用吗?
- 一次性使用小对象时广播有用吗?
我的印象是在那种情况下广播没有用,甚至可能是浪费,但我想要一个更开明的意见。
当你广播一些东西时,它会被复制到每个执行者一次。如果您不广播它,它会随每个任务一起复制。因此,如果您有一个大对象 and/or 比执行者多得多的任务,广播就很有用。
根据我的经验,这种情况很少发生。广播使代码复杂化。所以我总是在没有广播的情况下开始,只有在我发现这是获得良好性能所必需的情况下才添加广播。