Spark优化(七):广播大变量

广播大变量

有时在开发过程中,会遇到需要在算子函数中使用外部变量的场景(尤其是大变量,比如100M以上的大集合),那么此时就应该使用Spark的广播(Broadcast)功能来提升性能。


在算子函数中使用到外部变量时,默认情况下,Spark会将该变量复制多个副本,通过网络传输到task中,此时每个task都有一个变量副本。如果变量本身比较大的话(比如100M,甚至1G),那么大量的变量副本在网络中传输的性能开销,以及在各个节点的Executor中占用过多内存导致的频繁GC,都会极大地影响性能。


因此对于上述情况,如果使用的外部变量比较大,建议使用Spark的广播功能,对该变量进行广播。

广播后的变量,会保证每个Executor的内存中,只驻留一份变量副本,而Executor中的task执行时共享该Executor中的那份变量副本。这样的话,可以大大减少变量副本的数量,从而减少网络传输的性能开销,并减少对Executor内存的占用开销,降低GC的频率。

广播大变量的代码示例

// 以下代码在算子函数中,使用了外部的变量。

// 此时没有做任何特殊操作,每个task都会有一份list1的副本。

val list1 = ...

rdd1.map(list1...)

// 以下代码将list1封装成了Broadcast类型的广播变量。

// 在算子函数中,使用广播变量时,首先会判断当前task所在Executor内存中,是否有变量副本。

// 如果有则直接使用;如果没有则从Driver或者其他Executor节点上远程拉取一份放到本地Executor内存中。

// 每个Executor内存中,就只会驻留一份广播变量副本。

val list1 = ...

val list1Broadcast = sc.broadcast(list1)

rdd1.map(list1Broadcast...)

猜你喜欢

转载自blog.csdn.net/Winner941112/article/details/82908517