Spark/Broadcast
sc.Broadcast(rdd.collectAsMap())
算子函数使用外部变量,默认情况 Spark 会将该变量复制多个副本,通过网络传输到 task 中,每个 task 都有一个变量副本。
如果变量本身比较大,会占用增大网络中传输的性能开销,以及在各个节点的 Executor 占用过多内存导致频繁 GC。
通过 Broadcast 的变量只在 Executor 内存中保留一份。
Executor 会有对应的 BlockManager,BlockManager 负责管理 Executor 对应的内存和磁盘上的数据。
需要使用广播变量时,先尝试从 BlockManager 获取。如果失败, BlockManager 会从 Driver 或者 其他节点的 BlockManager 拉取变量副本。
1 | // 以下代码在算子函数中,使用了外部的变量。 |
Spark/Broadcast