rdd 序列化
1.闭包检查
从计算角度,算子以外的代码都在Driver端执行吗,算子代码在executor执行,在Scala中经常会用到在算子内用到算子外的数据,这样就形成了闭包效果。如果使用算子外的数据无法序列化,就意味着无法传值给executor执行,会发生错误。所以需要在执行任务计算前,检测闭包内的对象是否可以进行序列化,这个操作称之为闭包检测。
Scala2.12版本后闭包编译方式发生了改变。
2.序列化方法和属性
当算子中用的是类直接传递过来的参数,要保证类已经序列化,如果算子使用的是类中重新复制的常量,如果常量本身是字符串类型,字符串本身具备了序列化,所以该常量已经序列化不会出错
3.序列化的框架
如果使用的是Java的序列化框架和spark新增的序列化框架kryo,java的序列化比较重,kyro序列化比较轻,当rdd在shuffle数据的时候,简单数据类型,数组和字符串类型已经在spark内部使用kryo来序列化。
如果某类需要序列化在提交spark之前需要在配置中注册需要使用kryo序列化的自定义类
transient关键字:
如果在一个类中某个变量不需要保存在序列化中,可以使用transient来声明, 用transient关键字标记的成员变量不参与序列化过程。
评论