RDD相关操作都需要传入自定义闭包函数(closure),如果这个函数需要访问外部变量,那么需要遵循一定的规则,否则会抛出运行时异常。闭包函数传入到节点时,需要经过下面的步骤:
driver通过反射,运行时找到闭包访问的所有变量,并封装成一个对象,然后序列化该对象(serialized on the driver node)
将序列化后的对象通过网络传输到worker节点(shipped to the appropriate nodes in the cluster)
worker节点反序列化闭包对象(deserialized)
worker节点执行闭包函数(and finally executed on the nodes)
所以对闭包外引用的对象,需要实现序列化或者定义成静态变量(静态变量不需要序列化)
参考:
https://www.jianshu.com/p/a656328ce427