56、Spark性能优化之广播共享数据

56、Spark性能优化之广播共享数据
广播共享数据原理.png

广播共享数据

如果你的算子函数中,使用到了特别大的数据,那么,这个时候,推荐将该数据进行广播。这样的话,就不至于将一个大数据拷贝到每一个task上去。而是给每个节点拷贝一份,然后节点上的task共享该数据。
这样的话,就可以减少大数据在节点上的内存消耗。并且可以减少数据到节点的网络传输消耗。
比如
val table = new Array[String](1000000) 数据量很大
比如,想效仿MapRuduce的map端join,就是说再每个task运行的时候,要去把输入的数据与一个表进行join,其实可以再运行job之前,先把表中数据读取出来,加载到driver上,变成集合,然后再算子函数中,使用,进行join
此时,这个join的表,很可能是比较大的,比如说100M
var rdd = rdd.foreach(ele => ele ... table)
这种情况下,算子函数使用到了外部的数据,默认的情况下,算子函数使用到的外部数据,会被拷贝到每一个task中,此时,如果使用到的外部数据量很大的情况下,会在各个节点上,占用很大的内存,而且会产生大量的网络数据传输,大量网络数据的传输造成性能的开销
比如说,共享的数据是100M,6个task,就会占用600M的数据
val broadtable = sc.broadcast(table)
rdd.foreach(ele => ele ... broadtable)
这样的话,就可以大大减少每个节点的内存消耗,并且可以减少网络数据传输的性能消耗