在对象类型与静态类型之间进行序列化时的性能差异

时间:2020-05-06 18:00:27

标签: java serialization apache-flink flink-batch

当要序列化时,是否需要静态键入/声明变量的数据类型?序列化时是否可以提高性能?

我正在创建一个用于批处理的flink项目。我编写了一个自定义输入阅读器,它将通过jdbc从数据库中读取,并以Hashmap的形式返回记录,其中包含列名和值。我知道Flink在每个子任务之间序列化对象。所以,我的问题是,由于我在类型对象的值所在的位置具有哈希表,因此它对序列化性能有影响吗?

Flink默认使用kyro序列化程序

2 个答案:

答案 0 :(得分:0)

哈希图的序列化和反序列化非常昂贵。例如,如果您可以使用Tuples或Rows进行此项工作,则效果会更好。或者,您可以考虑实现自定义Table源,然后利用Table / SQL API及其优化。

Apache Flink博客上最近有一篇文章,介绍有关序列化的详细信息,其中包括有关性能的部分。我推荐整篇文章,但有关性能的结果,请参见https://flink.apache.org/news/2020/04/15/flink-serialization-tuning-vol-1.html#performance-comparison。您的结果肯定会与该文章中显示的结果不同-序列化性能会因您执行的操作的细节而有很大差异-但其中显示的一般模式值得关注。

确切地说,您从担心所有这些中可以得到多少。您必须做自己的基准测试才能确定。至于您有关静态类型的问题-我不确定,但是我的猜测是,使用Kryo不会带来太大变化。

答案 1 :(得分:0)

感谢@David Anderson,这篇文章非常有用。我使用行来获得更好的性能,它在内部使用对象[]。静态类型对象与类型对象之间没有性能差异。与kryo一样,它没有任何作用