定义:载一个RDD算子中,引用了外部的对象,则该对象会被序列化发送到各个Excutor上反序列化;反序列化出来的闭包对象,已经是完全独立的,如果在RDD算子中修改外部对象,并不会影响到Driver端的原对象. spark中这个所谓“闭包”,只是看起来类似各种编程语言中的闭包,而本质上根本不是一回事. spark中的这个“闭包引用”,其实是Driver把分布式算子中引用的外部变量序列化后,发送给每个task来使用(闭包引用的目标对象必须是可序列化的即实现了Serializable接口,而且数据量不能太大,否则会增加Task中的内存压力);
示例:
Q:Spark的闭包中是否会存在线程安全问题:
答:有可能.如果引用的闭包对象是一个单例对象,在一个Excutor中多个Task会使用到,则一个Task修改之后会影响到其他Task的运行,产生安全问题;而如果引用的是普通对象,每个Task中持有一份,就不会存在线程安全问题.