Broadcast广播大变量背景:
spark作业中引用了外部变量时,spark会给每个task拷贝一份变量副本。那么,这会有什么缺点?又会对性能产生怎么用恶劣的影响呢?
举例说明:假如有一个外部变量,大小是1M,被spark作业引用。Spark作业设置有500个task。首先,saprk会拷贝500份副本到task(如下图),而拷贝是通过网络传输的。共计就有500M全部通过网络传输,造成很大的网络开销。另外,变量副本拷贝到各个task后,占用的是内存,就有500M的内存被变量副本消耗了。内存被占用过多后,导致RDD持久化到内存时,可能无法全部写入内存,部分数据写入到磁盘,这导致了在磁盘IO上消耗性能;接着task在创建对象时,也许堆内存不够而存不下对象,这又引起频繁GC,GC时,一定会导致工作线程停止,导致spark作业暂停下来。这是一系列的恶劣影响。
解决问题:
这里引出一个角色 - BlockManager 它负责管理某个executor对应的内存和磁盘数据。
如下图:
1.Task有广播变量时,会先尝试在本地BlockManager 中找变量;
2.本地BlockManager 没找到,就会到driver去拿到变量后,把变量再拷贝保存到BlockManager ;另外,BlockManager