当前位置: 首页 > news >正文

java Flink(四十二)Flink的序列化以及TypeInformation介绍(源码分析)

Flink的TypeInformation以及序列化

TypeInformation主要作用是为了在 Flink系统内有效地对数据结构类型进行管理,能够在分布式计算过程中对数据的类型进行管理和推断。同时基于对数据的类型信息管理,Flink内部对数据存储也进行了相应的性能优化。

Flink 数据类型 & TypeInformation信息_flink typeinformation-CSDN博客

每一个具体的数据类型都对应一个TypeInformation的具体实现,每一个TypeInformation都会为对应的具体数据类型提供一个专属的序列化器。通过 Flink的序列化过程图可以看到TypeInformation会提供一个createSerialize()方法,通过这个方法就可以得到该类型进行数据序列化操作与反序化操作的对象TypeSerializer。
Flink 数据序列化_flink的序列化-CSDN博客

可以看出,TypeInformation在flink的序列化中起了很重要的作用

源码分析

Basic类型

Flink建议通过Pojo进行数据传入,如果传入的数据类型不满足Pojo条件或者不是Flink支持的基础类型,那么就会通过Kryo进行序列化,效率较低

创建一个包含给定元素的新数据流。元素都必须是相同的类型

(先看基本类型的数据传入)

ctrl+左键点击进入

TypeExtractor:一种用于对类进行反射分析的实用程序,用于确定转换函数实现的返回类型。

初始化 TypeInformation 根据数据第一个元素进行判断返回类型

 传入第一个元素

 

 ctrl+左键点击红框方法进入

如果用于此类型或超类型,则使用工厂创建类型信息。否则返回null。

检查我们是否可以从元组中提取类型,否则使用该类

同上,如果是Row类型,则进入该代码块 

 显然我们这次的例子是Basic 中的String类型,所以进入 privateGetForClass

从给定的类(如Integer、String[]或POJO)中创建类型信息。

检查是否可以使用工厂生产类型信息

 对象作为泛型类型信息处理,这里返回的 GenericTypeInfo 就是Flink定义的泛型类型的TypeInfo

如果类型满足,则返回泛型

 如果类型为数组,则进入

如果类型为hadoop writable则进入

 

如果是Basic类型的一种,则命中

显然我们的String类型数据命中了Basic

一路返回到 fromElements,typeInfo里的信息包含了选择序列化的类型

 进入fromCollection:从给定的非空集合创建数据流。

 不能有null元素和混合元素

 最终返回的DataStreamSource数据,typeInfo数据被封装到了其中

Pojo类型

 跟Basic类一样,一步一步进入到privateGetForClass

经过一堆判断,都没有命中后走到pojo类判断

 

判断必须是Public类型类

不能全都是static或者transient字段

  循环读取每个field,字段必须有Get、Set方法

 每个字段创建对应的typeInfo添加到pojoFields

 最后返回的DataStream,可以看到Pojo的每个字段以及字段对应的序列化类型都包装进去

相关文章:

  • 探索ChatGPT时代下的下一代信息检索系统:机遇与挑战
  • 系统资源耗尽对服务器的影响
  • Linux 系统日志
  • (一)Linux+Windows下安装ffmpeg
  • docker opensearch arm64 运行失败解决方案
  • 国内ip切换是否合规?
  • 针对ETC系统的OBE-SAM模块设计方案
  • python --- 练习题3
  • AI基础知识(3)--神经网络,支持向量机,贝叶斯分类器
  • S32 Design Studio 中断
  • python日常刷题(一)
  • web蓝桥杯真题:灯的颜色变化
  • Java使用itextpdf往pdf中插入图片
  • Python Windows系统 虚拟环境使用
  • JavaEE 初阶篇-深入了解进程与线程(常见的面试题:进程与线程的区别)
  • Codepen 每日精选(2018-3-25)
  • go语言学习初探(一)
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • iOS 颜色设置看我就够了
  • Logstash 参考指南(目录)
  • PHP的Ev教程三(Periodic watcher)
  • socket.io+express实现聊天室的思考(三)
  • SpiderData 2019年2月16日 DApp数据排行榜
  • vuex 学习笔记 01
  • webpack+react项目初体验——记录我的webpack环境配置
  • 从零搭建Koa2 Server
  • 构造函数(constructor)与原型链(prototype)关系
  • 后端_MYSQL
  • 前端
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • #AngularJS#$sce.trustAsResourceUrl
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)ObjectiveC 深浅拷贝学习
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .htaccess配置常用技巧
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net core 6 redis操作类
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 服务 ServiceController
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • [2]十道算法题【Java实现】
  • [20150629]简单的加密连接.txt
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [C#] 如何调用Python脚本程序