专注大数据培训
我们一直在领跑

最新面试题集锦(6)-java序列化-分布式计算序列化问题

请说说什么是序列化,以及flink中的序列化机制

分析:面试官问此问题,其实一方面是考察你是否理解序列化;另一方面重点是想问,你是否知道flink、spark、hadoop等分布式计算引擎中,为什么不采用jdk中原生的序列化机制;

Java序列化基本概念


java序列化是将jvm中的对象数据,转化成二进制序列数据,常用于跨网络的数据交换或持久化存储
jdk中自带序列化工具ObjectOutputStream和反序列化工具ObjectInputStream

一个类的对象

 class Person extends Animal{
   String name;
   int age;
   float salary
   List friends;
 }

Person p = new Person(…);

这个对象,如何序列化呢?

在jdk中,ObjectOutputStream 会将该对象的 “schema信息+数据” 全都表达成二进制序列

  • schema信息,主要指: 类的结构定义(类名,各属性名,属性类型),类的继承结构(即父类的结构)
  • 数据,就是类中的各个属性值,如name值,age值,salary值等,按它的数据类型对应的编码方法进行二进制编码,比如int型,编码成32位,float型按IEEE标准编码成32位等;

(数据中,如果是非基本类型的字段,比如friends,则就要继续解构出List,Friend的类结构和数据)

效率问题

在jdk的序列化机制中,一个对象被序列化成二进制后,包含的信息没有任何损失,非常全面;
但是,在有些场景中(比如hadoop、spark、flink等分布式计算场景中),由于数据跨网络交换的量和频次都非常高,而且往往交换的数据不需要类结构信息,只需要数据本身
此时使用jdk的序列化机制,就会带来序列化速度慢,序列化出来的二进制结果体量臃肿等负面效果,对分布式计算的性能影响非常严重

这样,hadoop、spark、flink等计算引擎,一般都会重新自己设计一套序列化机制(主要就是省去对象的schema信息),来提高数据交换效率
比如,

  • hadoop中有Writable这一套;
  • spark中默认使用jdk的序列化机制(但由于前文所述,jdk序列化效率低),所以常常会使用第三方序列化工具(如kyro)进行序列化工作;
  • flink中有自己的一套类型和序列化机制 TypeSerializer(拥有众多常见基本类型或基本类型的数组类型等数据的序列化工具子类);
1620
1620
  • 而如果有些类型(比如用户自定义类型且没有向flink注册),flink中是没有对应序列化工具的,此时,也需要借助外部的第三方序列化工具(如kyro)来进行序列化;
欢迎分享,转载有奖:多易教育 » 最新面试题集锦(6)-java序列化-分布式计算序列化问题