Flink的数据类型和序列化

flink数据类型和序列化 数据类型总览 总体继承关系如下 Flink的数据类型 这里我们取一种类型分析它的继承关系 序列化过程 ​ 具体的序列化过程时怎么样的呢?通过如图 TypeInfomation的createSerializer方法: /** * Creates a serializer for the type. The serializer may use the ExecutionConfig ... 阅读详情

 

 

写Bug的张小天关注

0.0682017.08.09 17:36:47字数 1,645阅读 10,615

Apache Flink 以一种特有的方式来处理数据类型和序列化,包括自有的类型描述器、泛型抽取和类型序列化框架,本文将描述其背后的概念和原理。

Flink的类型处理

Flink试图去推断出在分布式计算过程中交换和存储的数据的类型信息,像数据库推断表模式一样。在大多数情况下,Flink可以自己无缝地推测出所有必要的信息。拥有类型信息Flink就可以完成如下的事情了:
  1、使用POJO类型,通过引用它们的字段名称对数据进行分组、连接和聚合操作,如dataSet.keyBy("username")。类型信息允许Flink可以提前对类型进行检测(如拼写错误和类型兼容性),而不是等到运行时再出错。
  2、Flink了解的数据类型信息越多,序列化和数据类型布局模式就更好,这在Flink的内存使用范例中是非常有用的。
3、最后,它还让用户在大多数情况下不再担心序列化框架和必须注册类型
通常,数据类型的信息都是在预处理阶段需要,即在程序对DataStream和DataSet的调用之前,及执行execute()、print()、count()和collect()的任何调用之前。

常见问题

用户与Flink的数据类型处理交互最常见的问题是:
  1、注册子类型:如果函数仅描述了超类型,但是执行过程中实际上使用的是这些超类的子类型,这样的话,Flink要识别这些子类型,可能会导致一定的性能下降。对此,可以在StreamExecutionEnvironment 或者 ExecutionEnvironment中调用 .registerType(clazz) 注册子类来解决。
  2、注册自定义序列化:对于不适用于自己的序列化框架的数据类型,Flink会使用Kryo来进行序列化,并不是所有的类型都与Kryo无缝连接。如,许多Google Guava集合类型,解决方案是为出问题的数据类型注册额外的序列化类,在StreamExecutionEnvironment 或者 ExecutionEnvironment 中调用.getConfig().addDefaultKryoSerializer(clazz, serializer)来实现,额外的Kryo序列化器在许多第三方库中都存在的,可以参考(自定义序列化器)[https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/custom_serializers.html]来了解更多如何创建自定义序列化器的信息。
  3、添加类型提示:有时,当Flink用尽各种手段都无法推测出泛型信息时,用户需要传入一个类型提示,这个只适用于JAVA API,类型提示部分描述了许多类型提示的信息。
  4、手动创建一个TypeInformation:对于某些API调用来说,这可能是必须的,因为Flink无法通过Java的通用类型擦除来推断数据类型。查看创建一个TypeInformation 或者 TypeSerializer来获取更多信息。

Flink的TypeInformation类

TypeInformation类是所有类型描述类的基类,它揭示了数据类型的一些基础属性,并产生序列化器在默写特殊情况下生成类型比较器(注意,Flink中的比较器不仅仅定义一个顺序,他们还是处理key的辅助工具utility)。
本质上,Flink通过类型来做出以下区分:
  基础类型:所有的Java原生类型及它们的封装类型,包括void,String,Date,BigDecimal和BigInteger。
  原生数组和Object数组
  组合类型:
    Flink Java Tuples(Flink Java API的一部分):最多25个字段,空字段不支持
    Scala Case classes(包括Scala tuples):最多25个字段,空字段不支持
    Row:具有任意数量字段的元组,并支持空字段
    POJO:遵循某种Bean模式的类
  辅助类型:如:Option,Either,List,Maps,...
  泛型类型:这些不会被Flink自带的序列化器进行序列化,但是可以通过Kryo来进行
POJO非常有意思,因为它们支持创建复杂数据类型并通过字段名称来定义key:dataSet.join(another).where("name").equalTo("personName"),它们在运行时是透明的,并被Flink高效地处理。

POJO类型的规则

如果一个数据类型满足如下条件的话,就被认为是一个POJO类型:
  1、class是public的或者是独立的(不是非static内部类)
  2、class有无参构造函数
  3、所有class中的非静态的、非局部字段要么是public类型,要么有public类型的getter和setter方法

创建一个TypeInformation或者TypeSerializer

为一个数据类型创建一个TypeInformation,需要根据不同的语言来进行:

Java

因为Java通常会擦除类型信息,所以你需要将数据类型传递给TypeInformation构造函数:
对于非泛型数据类型,你可以传递Class:
TypeInformation<String> info = TypeInformation.of(String.class);
对于泛型数据类型,你需要通过TypeHint来捕获数据累心:
TypeInformation<Tuple2<String,String>> info = TypeInformation.of(new TypeHint<Tuple2<String,String>>(){});
在内部,这个创建了TypeHint的匿名子类,来捕获类型的泛型信息并保持知道运行时。

Scala

在Scala中,Flink使用编译时的宏,并在其任然可用时捕获所有通用类型信息

import org.apache.flink.streaming.api.scala._

val stringInfo: TypeInformation[String] = createTypeInformation[String]

val tupleInfo: TypeInformation[(String, Double)] = createTypeInformation[(String, Double)]

你也可以在Java中以回调函数的形式来使用同样的方法。

创建一个TypeSerializer,仅需要在TypeInformation类中调用typeInfo.createSerializer(config)即可。
config参数是ExecutionConfig类型的,并保持了程序注册的自定义serializer的信息,你可以通过DataStream或者DataSet的getExecutionCondif()方法来获取ExecutionConfig。在函数内部(如:MapFunction),你可以创建一个RichFunction并调用getRuntimeContext().getExecutionConfig()来获取它。

创建一个TypeSerializer,仅需要在TypeInformation类中调用typeInfo.createSerializer(config)即可。
config参数是ExecutionConfig类型的,并保持了程序注册的自定义serializer的信息,你可以通过DataStream或者DataSet的getExecutionCondif()方法来获取ExecutionConfig。在函数内部(如:MapFunction),你可以创建一个RichFunction并调用getRuntimeContext().getExecutionConfig()来获取它。

Flink 数据类型和序列化机制简介/TypeInformation createSerializer TypeSerializer Flink自己定义了一套数据类型,对应Java中的基本类型、集合、POJO等,数据类型都是TypeInformation的子类,并且在每个子类中都重写了createSerializer方法来创建自己的TypeSerializer,然后使用TypeSerializer来实现序列化和反序列化。 如果Flink无法识别或推断类型,则使用Kryo序列化反序列化。如果Kryo无法实现序列化反序列化,可以使用强制avro或者为 Kryo 增加自定义的 Serializer 以增强 Kryo 的功能。实现序列化反序列化 阅读详情

相关推荐

Flink学习笔记--数据类型和专属序列化框架

1. 已有序列化框架 1.1 序列化和反序列化的定义 序列化 就是讲数据结构、或者对象转换成一个二进制串的过程,在java里面则可理解成一个byte数组 反序列化 与序列化恰恰相反,就是讲二进制串再转换成数据结构或者对象的过程。 1.2 常见的序列化框架 目前java生态游许多序列化框架,例如 java serialization, kryo, apache avro等。 但是flink确没有使用这些已有的序列化框架,而是自己定制了序列化框架。 接下来首先了解一下flink中的数据类型。 .

litlit023的专栏 319

Flink-序列化

几乎每个Flink作业都必须在其运算符之间交换数据,由于这些记录不仅可以发送到同一JVM中的另一个实例,还可以发送到单独的进程,因此需要先将记录序列化为字节。类似地,Flink的堆外状态后端基于本地嵌入式RocksDB实例,该实例以本机C++代码实现,因此也需要在每次状态访问时转换为字节。如果执行不正确,仅有线和状态序列化就很容易消耗作业的大量性能,因此,每当您查看Flink作业的分析器输出时,您很可能会在使用CPU周期的顶部看到序列化。因此,

lu070828的博客 1742

flink重温笔记(十四): flink 高级特性和新特性(3)——数据类型及 Avro 序列化

Avro 是数据序列化系统,支持大批量数据交换的应用。支持二进制序列化方式,性能好 / 效率高,使用 JSON 描述。动态语言友好,RPC 远程调用,支持同步和异步通信。namespace:要生成的目录type:类型 avro 需要指定 recordname:会自动生成的对象fields:要指定的字段注意: 创建的文件后缀名一定要叫avsc,而不是 avro 后缀,使用idea生成Order对象注意:由于在导入 pom 依赖的时候,需要注意插件冲突,注释掉以下依赖,不然会一直爆错!

m0_60732994的博客 1466

FlinkDemo--使用优先队列分组求Top5

任务总体逻辑 先是一个实时采集任务,数据从mysql数据库的yhzq_result4表同步到kafka的 topic_dtstack_05 中,然后是一个flink原生任务,对kafka中的数据分组求Top5,并 将各组的Top5写回到mysql的flink_result中。 任务配置情况 实时采集任务 flink原生任务 需要注意的是参数指定的是任务执行时的并行度,必须填写而且要是大于等于1的整数 任务执行过程 1.mysql源表中的数据 2.执行sql语句,触发实时采集 INSERT INT

qq_41634872的博客 891

泛微E8流程监控指南:如何用SQL实时追踪审批节点状态?

本文详细介绍了如何利用SQL实时监控泛微E8系统中的审批流程状态,包括核心数据表结构解析、全链路监控SQL实战以及智能预警机制设计。通过数据库直接查询和状态关联分析,帮助企业快速定位卡顿节点,提升流程效率。适用于需要优化OA系统流程管理的企业IT人员和业务主管。

weixin_30687051的博客 436

MATLAB实战:用ARMAX模型搞定电力系统惯量评估(附完整代码)

本文详细介绍了如何利用MATLAB中的ARMAX模型进行电力系统惯量评估,解决新能源占比提高带来的系统惯量下降问题。通过系统辨识技术,从电网运行数据中准确提取惯量参数,并提供完整的代码实现,帮助工程师快速应用于实际工程。

peach的博客 636

Flink TableAPI和SQL(十一)分组聚合

文章目录 SQL 中一般所说的聚合我们都很熟悉,主要是通过内置的一些聚合函数来实现的,比如SUM()、MAX()、MIN()、AVG()以及 COUNT()。它们的特点是对多条输入数据进行计算,得到一个唯一的值,属于“多对一”的转换。比如我们可以通过下面的代码计算输入数据的个数: Table eventCountTable = tableEnv.sqlQuery("select COUNT(*) from EventTable"); 而更多的情况下,我们可以通过 GROUP BY 子句来指定分组的键(ke

weixin_45417821的博客 1788

2025华为OD面试手撕代码真题目录及面试八股文

本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2024e卷,od机试,2024E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2024华为od,如何备

KJ.JK 5万+

flink入门

@SpringBootTest @SuppressWarnings("deprecation") class FlinkbizApplicationTests { @Test void contextLoads() throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelis

weixin_37549458的博客 577

代谢组数据分析(零):从质谱样本制备到MaxQuant搜库(蛋白质组和代谢组)

本文详细介绍了代谢组数据分析的过程,从LC-MS/MS技术的样本制备、分离、质谱鉴定到MaxQuant软件的使用。LC-MS/MS包括样本制备、液相色谱分离、质谱上机和鉴定等步骤。MaxQuant在蛋白质定性和定量中扮演关键角色,通过搜库和数据处理提供精准结果。此外,文章还涉及了数据采集模式、质谱图谱解析、数据库和软件选择以及结果评估等方面

专注生信领域 8587

6万字嵌入式最全八股文面试题大全及参考答案(持续更新)

进程上下文定义:进程上下文包含了进程执行时所需的所有信息,包括 CPU 寄存器的值、内核栈、任务控制块(TCB)等。作用:当进程被切换时,需要保存当前进程的上下文,并恢复下一个将要运行进程的上下文。中断上下文定义:中断上下文是指处理中断时 CPU 所处的状态,包括中断发生时的寄存器值等。作用:当中断发生时,CPU 会自动保存当前的上下文信息,并跳转到相应的中断处理程序。示例表格上下文描述进程上下文包含进程执行时的所有相关信息中断上下文处理中断时 CPU 所处的状态线程同步定义。

大模型大数据攻城狮的专栏 7920

Flink DataStream支持的物理分组方式

KeyBy 上游算子按键分组发送给下游算子 global 上游算子将所有记录发送到下游算子的第一个实例 broadcast 上游算子将每条记录广播发送给下游算子的所有实例 forward 仅适用于上游算子实例数与下游算子数相同时的情况:每个上游算子实例将记录发送给下游算子对应的实例 shuffle 上游算子随机选择一个下游算子发送记录 rebalance 上游算子通过轮询的方式发送数据 rescale 假设上游和下游算子的实例数分别为n和m,若n < m,则每个上游实例向ceil(m/n)

RonieWhite的博客 567

OPTEE常见13类问题与解答

OPTEE常见13类问题并解答

AI-安全-功耗 1202

Flink 数据类型和序列化

为 Flink 量身定制的序列化框架 为什么要为 Flink 量身定制序列化框架? 大数据生态中大多数技术组件都是运行在 JVM 上的,Flink 也是运行在 JVM 上,基于 JVM 的数据分析引擎都需要将大量的数据存储在内存中,这就不得不面临 JVM 的一些问题,比如 Java 对象存储密度较低等。针对这些问题,最常用的方法就是实现一个显式的内存管理,也就是说用自定义的内存池来进行内存的分配回收,接着将序列化后的对象存储到内存块中。 现在 Java 生态圈中已经有许多序列化框架,比如说 Java ser

hhhhhhfq的博客 1107

安卓刷Windows太难?这款手机平板双系统刷机工具,小白也能轻松拿捏!(小白福音!手机平板专用,一键搞定安卓刷 Windows 双系统!)

安卓刷Windows太难?这款手机平板双系统刷机工具,小白也能轻松拿捏!(小白福音!手机平板专用,一键搞定安卓刷 Windows 双系统!)

XiaoqiangClub的博客 4663

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

12、Flink数据类型和序列化

Java生态圈中有许多序列化框架,如Java serialization, Kryo, Apache Avro 等。然而 Flink有自己定制的序列化框架,这样能够对类型信息了解越多,也就可以在早期完成类型检查,更好的选取序列化方式进行数据布局,节省数据的存储空间,直接操作二进制数据。

江7城子的专栏 464

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Flink进阶教程:数据类型和序列化机制简介

几乎所有的大数据框架都要面临分布式计算、数据传输和持久化问题。数据传输过程前后要进行数据的序列化和反序列化:序列化就是将一个内存对象转换成二进制串,形成网络传输或者持久化的数据流。反序列化将二进制串转换为内存对象,这样就可以直接在编程语言中读写和操作这个对象。一种最简单的序列化方法就是将复杂数据结构转化成JSON格式。序列化和反序列化是很多大数据框架必须考虑的问题,在Java和大数据生态圈中,已有...

皮皮鲁的AI星球 1591

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Apache Flink 进阶(五):数据类型和序列化

阿里云双11领亿元补贴,拼手气抽iPhone 11 Pro、卫衣等好礼,点此参与:http://t.cn/Ai1hLLJT 本文根据 Apache Flink 系列直播整理而成,由 Apache Flink Contributor、360 数据开发高级工程师马庆祥老师分享。文章主要从如何为Flink量身定制的序列化框架、Flink序列化的最佳实践、Flink通信层的序列化以及问答环节四部分分享。...

数据库技术 375

Flink的数据类型和序列化(Scala版)

目录1. 数据类型1.1 Tuple和case class1.2 POJOs类1.3 原生数据类型1.4 普通class1.5 Values1.6 Hadoop Writables1.7 Special Types2. TypeInformation类2.1 创建TypeInformation和TypeSerializer2.2 泛型参数用TypeInformation表示 1. 数据类型 1.1 Tuple和case class package devBase import org.apache.fli

Bulut0907 1891

Flink之数据类型和序列化

本文根据 Apache Flink 系列直播整理而成,由 Apache Flink Contributor、360 数据开发高级工程师马庆祥老师分享。文章主要从如何为Flink量身定制的序列化框架、Flink序列化的最佳实践、Flink通信层的序列化以及问答环节四部分展开。如果你对于Apache Flink了解不多,可以先阅读Apache Flink 零基础入门系列文章。 为 Flink 量...

lixinkuan的博客 2057

Flink数据类型和序列化

序列化就是将一个内存对象转换成二进制串,形成网络传输或者持久化的数据流。反序列化将二进制串转换为内存对象,这样就可以直接在编程语言中读写和操作这个对象。在Java和大数据生态圈中,已有不少序列化工具,比如Java自带的序列化工具、Kryo等。一些RPC框架也提供序列化功能,比如最初用于Hadoop的Apache Avro、Facebook开发的Apache Thrift和Google开发的Prot...

勇心在馨 3141

flink-支持的数据类型和序列化(七)

flink-支持的数据类型和序列化 datatype Java Tuple 和 Scala case class Java POJO:java实体类 Primitive Types 默认支持java和scala基本数据类型 General Class Types 默认支持大多数java和scala class Hadoop Writables 支持hadoop中实现了org.apache.h...

CurryYoung11的博客 636

flink数据类型和序列化-1.13

本博客是对 flink 1.13 官网中数据类型和序列化部分的翻译整理。

第一片心意的博客 2284
上一篇: flink function类传递参数(Passing Parameters to Functions)
下一篇: Maven之阿里云镜像仓库配置
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值