初探Flink的序列化

Flink中的序列化应用场景

程序通常使用(至少)两种不同的数据表示形式[2]:

1. 在内存中,数据保存在对象、结构体、列表、数组、哈希表和树等结构中。
2. 将数据写入文件或通过网络发送时,必须将其序列化为字节序列。

从内存中的表示到字节序列的转化称为序列化,反之称为反序列化。

7a3dea049c90ed33095e2b634c3efc2a.jpeg

Flink中,下述的场景需要进行序列化和反序列化[1]。

1. F1ink中上下游算子之间可能分布在不同的节点上,不同算子的subTask会通过网络传输数据
2. Flink的Source和sink算子消费和写入Kafka Topic
3. F1ink中进行checkPoint将内存中的状态持久化到HDFs和从checkPoint恢复时从HDFS上加载状态数据

Flink未直接使用Java序列化,而是自研了一套高效的序列化机制。

比如我们要在算子间传递一个Tuple3<Integer, Long, Person>的数据(其中Preson为由id和name组成的pojo类),则subTask对其进行序列化的关键步骤如下。

1. 分析识别算子间传输数据的数据类型

2. 根据数据类型创建对应的序列化器

3. 使用序列化器将数据写入到内中(即内存段MemorySegment中)

1. 分析识别算子间传输数据的数据类型
2. 根据数据类型创建对应的序列化器
3. 使用序列化器将数据写入到内中(即内存段MemorySegment中)

dd535617253c98fec21db65f4c64823a.jpeg

958dd941df7105c11ed8bb1a3803d06a.jpeg

Flink支持的类型有以下几种[3],基本覆盖了大部分的用户使用场景,所以一般不用再自定义序列化器。

07604e31a277f5463fa1ddd37a76e73a.jpeg

序列化方案的选择

如上节所述,很多场景(比如下面的场景)中数据在内存和文件/网络间传递时需要考虑序列化。

1. [数据库] 将数据写入到数据库需要进行序列化,从数据库读取的时候需要进行反序列2. [服务调用(REST和远程调用RPC)] 客户端对请求进行序列化,服务器端对请求就行反序列化并将响应进行序列化,客户端最终对响应进行反序列化3. [消息传递(消息代理Kafka和分布式Actor框架)] 节点之间通过互发消息进行通信,消息由由发送者进行序列化并由接收者反序列化。

生产环境中,许多服务需要支持滚动升级,即每次将新版本部署到几个节点,而非所有节点。

这种情况下,必须假设不同的节点正在运行应用代码的不同版本。

这意味着新旧版本的代码,以及新旧数据格式,可能会同时在系统内共存。

为了使系统继续顺利运行,需要保持双向的兼容性。

向后兼容:较新的代码可以读取由旧代码编写的数据。向前兼容:较旧的代码可以读取由新代码编写的数据。

这种情况下,需要选择合适的序列化方案以支持双向兼容性就比较重要。

很多系统会选择Json/XML等文本格式和Avro等二进制格式的方案[2]。

3df9df3c431384d208f9ea3566108478.jpeg


此处以一条json数据为例,可以看到json的文本格式和Protobuf&Avro两种二进制格式的区别。

58855782b24bdff688f383078225fc2c.jpeg

b653c6e900dbc275d2afe2d969cadce4.jpeg

324a3b2aa99842c92703eee13a906bf9.jpeg

参考

1.《Flink SQL与DataStream 入门、进阶与实践》 羊艺超著 P121-P127
2.《数据密集型应用系统设计》 Martin Kleppmann 著 P109-P134
3. 数据类型以及序列化 https://nightlies.apache.org/flink/flink-docs-release-1.12/zh/dev/types_serialization.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ESP32】ESP-IDF开发 | I2C控制器+I2C主从收发例程

1. 简介 I2C&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;是由Philips公司在1980年代初开发的一种半双工的同步串行总线&#xff0c;它利用一根时钟线和一根数据线在连接总线的两个器件之间进行信息的传递&#xff0c;为设备之间数据交换提供了一种简单高效的…

提高交换网络可靠性之端口安全配置

转载请注明出处 此实验为配置交换机端口安全&#xff0c;当非法设备接入接口时自动触发安全措施 1.查看PC1和PC2的MAC地址&#x1f447; 2.交换机改名为S1&#xff0c;同时启用端口安全 3.配置允许接入设备 4.设置违规处理方式&#xff1a;即违规则关闭端口 5.查看安全端口相关…

UE5 第三人称学习之动画 control rig

这个东西和建模软件里有的是一个东西&#xff0c;然后IK就是你动脚&#xff0c;他帮你算出小腿大腿该怎么动&#xff0c;FK就是你自己动了大腿&#xff0c;摆小腿&#xff0c;然后再摆脚 就是给每一根骨骼搞一个控制器&#xff0c;给他一个容易选中和操作更明显的图形作为控制…

宏处理将多个excel文件的指定sheet页合并到一个excel文件中

背景了解&#xff1a;有个同事问我&#xff1a;现在他要处理一千多个文件&#xff0c;每个excel文件都有3个sheet页签&#xff0c;想把所有的excel文件的第二个sheet页签复制一份放到一个新的excel文件中。如果是手动去操作一个个文件的复制&#xff0c;也没什么不可&#xff0…

Linux系列-进程的概念

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 这篇文章&#xff0c;我们主要分析一下进程。 之前&#xff0c;我们讲过了冯诺依曼体系架构&#xff0c; 我们常见的计算机&#xff0c;像笔记本&#xff0c;或者不常见的计算机…

SQL优化经验大全(表设计优化,索引优化,索引创建规则、索引失效场景,sql语句优化,主从复制,分库分表)面试题

目录 1.表的设计优化 2.索引优化 2.1 索引创建的规则 2.2 索引失效的场景 3.SQL语句优化 4.主从复制、读写分离 5.分库分表 5.1.怎么判断项目是需要分库还是要分表&#xff1f; 5.2 分库分表有哪些拆分方案&#xff1f; 5.2.1 垂直分库 5.2.2 垂直分表 5.2.3 水平分…

css边框修饰

一、设置线条样式 通过 border-style 属性设置&#xff0c;可选择的一些属性如下&#xff1a; dotted&#xff1a;点线 dashed&#xff1a;虚线 solid&#xff1a;实线 double&#xff1a;双实线 效果如下&#xff1a; 二、设置边框线宽度 ① 通过 border-width 整体设置…

OpenGL入门002——顶点着色器和片段着色器

文章目录 一些概念坐标转换阶段顶点着色器片段着色器VBOVAO 实战简介main.cppCMakeLists.txt最终效果 一些概念 坐标转换阶段 概述&#xff1a; 模型空间、世界空间、视图空间和裁剪空间是对象在3D场景中经历的不同坐标变换阶段。每个空间对应渲染管道的一个步骤&#xff0c;…

LeetCode 684.冗余连接:拓扑排序+哈希表(O(n)) 或 并查集(O(nlog n)-O(nα(n)))

【LetMeFly】684.冗余连接&#xff1a;拓扑排序哈希表&#xff08;O(n)&#xff09; 或 并查集&#xff08;O(nlog n)-O(nα(n))&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/redundant-connection/ 树可以看成是一个连通且 无环 的 无向 图。 给定往…

C语言指针与一维数组 Java动态初始化与常见问题(越界问题)

1./*int main(void) { int a[5] { 10,20,30,40,50 };//数组间的元素地址相连的 int* p; printf("a代表的地址&#xff1a;%d\n", a);//数组首个元素的地址 printf("a1代表的地址&#xff1a;%d\n", a 1);//偏移数组 printf("a2…

2023年SEO趋势分析与未来发展展望

内容概要 在2023年的数字营销环境中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;依然扮演着关键角色。随着技术的不断演进和用户需求的变化&#xff0c;SEO趋势也在不断变化。首先&#xff0c;核心算法的更新已开始影响网站排名&#xff0c;搜索引擎越来越注重网站内…

面试经典 150 题:189、383

189. 轮转数组 【参考代码】 class Solution { public:void rotate(vector<int>& nums, int k) {int size nums.size();if(1 size){return;}vector<int> temp(size);//k k % size;for(int i0; i<size; i){temp[(i k) % size] nums[i];}nums temp; }…

Linux云计算 |【第五阶段】CLOUD-DAY8

主要内容&#xff1a; 掌握DaemonSet控制器、污点策略&#xff08;NoSchedule、Noexecute&#xff09;、Job / CronJob资源对象、掌握Service服务、服务名解析CluterIP&#xff08;服务名自动发现&#xff09;、&#xff08;Nodeport、Headless&#xff09;、Ingress控制器 一…

智能网联汽车:人工智能与汽车行业的深度融合

内容概要 在这个快速发展的时代&#xff0c;智能网联汽车已经不再是科幻电影的专利&#xff0c;它正在悄然走进我们的日常生活。如今&#xff0c;人工智能&#xff08;AI&#xff09;技术与汽车行业的结合犹如一场科技盛宴&#xff0c;让我们看到了未来出行的新方向。通过自动…

Iceoryx2:高性能进程间通信框架(中间件)

文章目录 0. 引言1. 主要改进2. Iceoryx2 的架构3. C示例代码3.1 发布者示例&#xff08;publisher.cpp&#xff09;3.2 订阅者示例&#xff08;subscriber.cpp&#xff09; 4. 机制比较5. 架构比较6. Iceoryx vs Iceoryx2参考资料 0. 引言 Iceoryx2 是一个基于 Rust 实现的开…

NumPy安装

1.NumPy简介 NumPy(Numerical Python) 是 Python 语言的扩展程序库&#xff0c;支持大量维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。 NumPy 的前身 Numeric 最早由 Jim Hugunin 与其它协作者共同开发&#xff0c;2005 年&#xff0c;Travis Oliph…

全自动一键批量创建站群网站插件 | Z-BlogPHP 堆词起站工具

在当今竞争激烈的数字营销世界&#xff0c;如何快速提升网站曝光率和流量&#xff1f;答案就是智能站群系统。 本文将结合实际效果&#xff0c;介绍一款功能强大的站群系统&#xff0c;重点讲述其堆词功能、泛目录管理、一键批量创建、内容转码、自定义标签和GPT内容生成与发布…

【深度学习】时间序列预测、分类、异常检测、概率预测项目实战案例

说明&#xff1a;本专栏内容来自于个人学习笔记、以及相关项目的实践与总结。写作目的是为了让读者体会深度学习的独特魅力与无限潜力&#xff0c;以及在各行各业之中的应用与实践。因作者时间精力有限&#xff0c;难免有疏漏之处&#xff0c;期待与读者共同进步。 前言 在当今…

第十五章 Vue工程化开发及Vue CLI脚手架

目录 一、引言 二、Vue CLI 基本介绍 三、安装Vue CLI 3.1. 安装npm和yarn 3.2. 安装Vue CLI 3.3. 查看 Vue 版本 四、创建启动工程 4.1. 创建项目架子 4.2. 启动工程 五、脚手架目录文件介绍 六、核心文件讲解 6.1. index.html 6.2. main.js 6.3. App.vue 一、…

Linux 进程终止 进程等待

目录 进程终止 退出码 错误码 代码异常终止(信号详解) exit _exit 进程等待 概念 等待的原因 wait 函数原型 参数 返回值 监控脚本 waitpid 概念 函数原型 参数 返回值 WIFEXITED(status) WEXITSTATUS(status) 问题 为什么不用全局变量获得子进程的退出信…