spark的序列化
进行 Spark 进行编程的时候, 初始化工作是在 driver端完成的, 而实际的运行程序是在executor端进行的. 所以就涉及到了进程间的通讯, 数据是需要序列化的.
发现Task not serializable,那么怎么回事呢?
接下来有两种方法
第一种方法:可以把属性的值存入到一个局部变量,然后传递局部变量
第二种方法:继承serializable接口
关于序列化的原理
Kyro序列化(建议使用)
Java 的序列化比较重, 能够序列化任何的类. 比较灵活,但是相当的慢, 并且序列化后对象的体积也比较大.
Spark 出于性能的考虑, 支持另外一种序列化机制: kryo (2.0开始支持). kryo 比较快和简洁.(速度是Serializable的10倍
). 想获取更好的性能应该使用 kryo 来序列化.
从2.0开始, Spark 内部已经在使用 kryo 序列化机制: 当 RDD 在 Shuffle数据的时候, 简单数据类型, 简单数据类型的数组和字符串类型已经在使用 kryo 来序列化.
有一点需要注意的是: 即使使用 kryo 序列化, 也要继承 Serializable 接口.
,
如果使用case就不用写继承Serializable,因为case自带序列化
那我就来证实一下为啥不用写那一行
帮你配了!
总结
序列化:
1.java自带的序列化
只需要实现java的一个接口:Serializable
好处:
1.及其简单,不要做任何额外的工作
2.java自带,用起来方便
坏处
太重
1.序列化速度慢
2.序列化之后的size比较大
spark默认是使用的这种序列化
2.hadoop没有使用java的序列化
hadoop自定义序列化机制:...Writable
3 支持另外一种序列化
Kyro
不是spark自定义写的,而且是一个第三方写的