几乎所有的大数据框架都要面临分布式计算、数据传输和持久化问题。数据传输过程前后要进行数据的序列化和反序列化:序列化就是将一个内存对象转换成二进制串,形成网络传输或者持久化的数据流。反序列化将二进制串转换为内存对象,这样就可以直接在编程语言中读写和操作这个对象。一种最简单的序列化方法就是将复杂数据结构转化成JSON格式。序列化和反序列化是很多大数据框架必须考虑的问题,在Java和大数据生态圈中,已有不少序列化工具,比如Java自带的序列化工具、Kryo等。一些RPC框架也提供序列化功能,比如最初用于Hadoop的Apache Avro、Facebook开发的Apache Thrift和Google开发的Protobuf,这些工具在速度和压缩比等方面与JSON相比有一定的优势。
但是Flink依然选择了重新开发了自己的序列化框架,因为序列化和反序列化将关乎整个流处理框架个方便的性能,对数据类型了解越多,可以更早地完成数据类型检查,节省数据存储空间。
Flink支持的数据类型

Flink支持上图所示的几种数据类型:原生类型、数组、符合类型、辅助类型。其中,Kryo是最后的备选方案,如果能够优化,尽量不要使用Kryo,否则会有大量的性能损失。
基础类型
所有Java和Scala基础数据类型,诸如Int、Double、Long(包括Java原生类型int和装箱后的类型Integer)、String,以及Date、BigDecimal和BigInteger。
数组
基础类型或其他对象类型组成的数组,如String[]。
复合类型
Scala case class
Scala case class是Scala的特色,用这种方式定义一个数据结构非常简洁。例如股票价格的数据结构:
case class StockPrice(symbol: String, timestamp: Long, price: Double)
这样定义的数据结构,所有的子字段都是public,可以直接读取。另外,我们可以不用new即可获取一个新的对象。
val stock = StockPrice("0001", 0L, 121)
println(stock.symbol)
Java POJO
Java的话,需要定义POJO类,定义POJO类有一些注意事项:
- 该类必须用
public修饰。 - 该类必须有一个
public的无参数的构造函数。 - 该类的所有非静态(non-static)、非瞬态(non-transient)字段必须是
public,如果字段不是public则必须有标准的getter和setter方法,比如对于字段A a有A getA()和setA(A a)。 - 所有子字段也必须是Flink支持的数据类型。
下面三个例子中,只有第一个是POJO,其他两个都不是POJO,非POJO类将使用Kryo序列化工具。
public class StockPrice {
public String symbol;
public Long timestamp;
public Double price;
public StockPrice() {
}
public StockPrice(String symbol, Long timestamp, Double price){
this.symbol = symbol;
this.timestamp = timestamp;
this.price = price;
}
}
// NOT POJO
public class StockPrice1 {
// LOGGER 无getter和setter
private Logger LOGGER = LoggerFactory.getLogger(StockPrice1.class);
public String symbol;
public Long timestamp;
public Double price;
public StockPrice1() {
}
public StockPrice1(String symbol, Long timestamp

最低0.47元/天 解锁文章
1412

被折叠的 条评论
为什么被折叠?



