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