资讯专栏INFORMATION COLUMN

flink学习系列--基础知识学习(四)

piglei / 849人阅读

摘要:前言这一讲将介绍一下序列化机制和过程函数。然而由于的类型擦除,自动提取并不是总是有效。开发者在自定义类上使用注解,随后创建相应的并覆盖方法。

前言

这一讲将介绍一下序列化机制和过程函数(processfunction)。

序列化机制

使用 Flink 编写处理逻辑时,新手总是容易被林林总总的概念所混淆:

 为什么 Flink 有那么多的类型声明方式?
 BasicTypeInfo.STRING_TYPE_INFO、Types.STRING 、Types.STRING() 有何区别?
 TypeInfoFactory 又是什么?
 TypeInformation.of 和 TypeHint 是如何使用的呢?
 

接下来本文将逐步解密 Flink 的类型和序列化机制(TypeInformation)。

Flink 的类型系统源码位于 org.apache.flink.api.common.typeinfo 包,让我们对上图TypeInformation深入追踪,看一下类的继承关系图:

可以看到,上面两个图片是一一对应的,TypeInformation 类是描述一切类型的公共基类,它和它的所有子类必须可序列化(Serializable),因为类型信息将会伴随 Flink 的作业提交,被传递给每个执行节点。

由于 Flink 自己管理内存,采用了一种非常紧凑的存储格式(见官方博文),因而类型信息在整个数据处理流程中属于至关重要的元数据。

TypeExtractror 类型提取

Flink 内部实现了名为 TypeExtractror 的类,可以利用方法签名、子类信息等蛛丝马迹,自动提取和恢复类型信息(当然也可以显式声明,即本文所介绍的内容)。

然而由于 Java 的类型擦除,自动提取并不是总是有效。因而一些情况下(例如通过 URLClassLoader 动态加载的类),仍需手动处理;例如下图中对 DataSet 变换时,使用 .returns() 方法声明返回类型。

这里需要说明一下,returns() 接受三种类型的参数:字符串描述的类名(例如 "String")、TypeHint(接下来会讲到,用于泛型类型参数)、Java 原生 Class(例如 String.class) 等;不过字符串形式的用法即将废弃,如果确实有必要,请使用 Class.forName() 等方法来解决。

声明类型信息的常见手段

通过 TypeInformation.of() 方法,可以简单地创建类型信息对象。

1. 对于非泛型的类,直接传入 Class 对象即可

2.对于泛型类,需要借助 TypeHint 来保存泛型类型信息

3. 预定义的快捷方式

例如 BasicTypeInfo,这个类定义了一系列常用类型的快捷方式,对于 String、Boolean、Byte、Short、Integer、Long、Float、Double、Char 等基本类型的类型声明,可以直接使用。

4. 自定义 TypeInfo 和 TypeInfoFactory

通过自定义 TypeInfo 为任意类提供 Flink 原生内存管理(而非 Kryo),可令存储更紧凑,运行时也更高效。
开发者在自定义类上使用 @TypeInfo 注解,随后创建相应的 TypeInfoFactory 并覆盖 createTypeInfo 方法。
注意需要继承 TypeInformation 类,为每个字段定义类型,并覆盖元数据方法,例如是否是基本类型(isBasicType)、是否是 Tuple(isTupleType)、元数(对于一维的 Row 类型,等于字段的个数)等等,从而为 TypeExtractor 提供决策依据。
更多示例,请参考 Flink 源码的 org/apache/flink/api/java/typeutils/TypeInfoFactoryTest.java

Kryo 序列化
待研究中...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75782.html

相关文章

  • Flink 从0到1学习—— 分享Flink 国外的书和二十多篇 Paper 论文

    摘要:另外,将机制发扬光大,对有着非常好的支持。系统也注意到并讨论了和的问题。总结本文分享了四本相关的书籍和一份领域相关的论文列表篇,涉及的设计,实现,故障恢复,弹性扩展等各方面。 前言 之前也分享了不少自己的文章,但是对于 Flink 来说,还是有不少新入门的朋友,这里给大家分享点 Flink 相关的资料(国外数据 pdf 和流处理相关的 Paper),期望可以帮你更好的理解 Flink。...

    jollywing 评论0 收藏0
  • flink学习系列--基础知识(一)

    摘要:前言最近因公司业务需求,需要使用到大数据分析。提供的可用于处理无尽的数据流。类似于把一个记录拆分成两条三条甚至是四条记录例如把一个字符串分割成一个字符数组。是一个聚合操作,如计数求和求平均等。实现把两个流连成一个流。 前言 最近因公司业务需求,需要使用到大数据分析。选择了flink,第一次听说flink我也是很懵逼的状态,不过一段时间下来有了一点心得,在这里和大家分享分享。有很多描述不...

    Warren 评论0 收藏0
  • Flink 全网最全资源(视频、博客、PPT、入门、实战、源码解析、问答等持续更新)

    摘要:由于配置流是从关系型数据库中读取,速度较慢,导致实时数据流流入数据的时候,配置信息还未发送,这样会导致有些实时数据读取不到配置信息。从数据库中解析出来,再去统计近两周占比。 showImg(https://segmentfault.com/img/remote/1460000019367651); Flink 学习项目代码 https://github.com/zhisheng17/f...

    Dr_Noooo 评论0 收藏0
  • Flink Clients 源码解析

    摘要:模块中的类结构如下博客从到学习介绍从到学习上搭建环境并构建运行简单程序入门从到学习配置文件详解从到学习介绍从到学习如何自定义从到学习介绍从到学习如何自定义从到学习转换从到学习介绍中的从到学习中的几种详解从到学习读取数据写入到从到学 Flink-Client 模块中的类结构如下: https://t.zsxq.com/IMzNZjY showImg(https://segmentfau...

    xiao7cn 评论0 收藏0

发表评论

0条评论

piglei

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<