《Spark大数据分析:核心概念、技术及实践》一1.2 数据序列化

简介:
  本节书摘来自华章出版社《Spark大数据分析:核心概念、技术及实践》一书中的第1章,第1.2节,作者[美] 穆罕默德·古勒(Mohammed Guller),更多章节内容可以访问云栖社区“华章计算机”公众号查看。


1.2 数据序列化

数据有自己的生命周期,独立于创建或使用它的程序。大多数情况下,数据比创建它的应用存活得更久。一般来说,数据保存在硬盘上。有时,也会通过网络把数据从一个应用发送给另一个应用。

在硬盘上存储或通过网络发送的数据格式与数据在内存中的格式是不一样的。把内存中的数据转换为可在硬盘上存储或通过网络发送的过程叫作序列化,而把硬盘或网络中的数据读取到内存的过程叫作反序列化。

数据可以用多种不同的格式进行序列化,比如CSV、XML、JSON和各种二进制格式。每种格式各有优缺点。比如,像CSV、XML和JSON这样的文本格式对人类友好,但在存储空间或解析时间方面并不十分高效。另一方面,二进制格式更加紧凑,在解析上比文本格式更快,但可读性较差。

在数据集较小时,文本和二进制格式之间的序列化/反序列化时间和存储空间差异不是什么大问题。因此,人们通常首选文本格式来处理小数据集,因为它更容易管理。然而,对于大数据集,文本和二进制格式之间的序列化/反序列化时间和存储空间差异将是极大的。因此,首选二进制格式来存储大数据集。

本节讲述一些常用的用来序列化大数据的二进制格式。

1.2.1 Avro

Avro提供了一个简洁的且独立于语言的二进制格式,用来数据序列化。它可用来存储数据到文件或通过网络发送数据。它支持多种数据结构,包括嵌套数据。

Avro使用一种自描述的二进制格式。使用Avro序列化数据时,模式与数据同时存储。这样一来,稍后Avro文件可以被任何应用读取。另外,因为模式与数据同时存储,所以写数据时没有关于值的间接开销,使得序列化快速、紧实。使用Avro通过网络交换数据时,发送端和接收端在初始化连接握手时交换模式。Avro模式使用JSON描述。

Avro自动处理字段的添加和删除、前向和后向兼容性,这些都不需应用来负责。

1.2.2 Thrift

Thrift是一个独立于语言的数据序列化框架,主要提供工具来完成不同编程语言所写的应用之间通过网络进行的数据交换序列化。它支持多种语言,包括:C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk、OCaml、Delphi和其他语言。

Thrift提供一个代码生成工具和一组用于序列化数据并通过网络传输的库。它抽象了序列化数据和通过网络传输数据的机制。因此,它使得应用开发者可以集中精力于核心的应用逻辑,而不用担心如何序列化数据和可靠、有效地传输数据。

通过Thrift,应用开发者在一个语言中立的接口定义文件中定义数据类型和服务接口。在接口定义文件中定义的服务由服务器端应用提供,并由客户端应用使用。Thrift编译器编译这个文件,并生成开发者用来快速构建客户端和服务器端应用的代码。

基于Thrift的服务器和客户端可以在相同计算机或网络上的不同计算机上运行。同样地,服务器端和客户端应用可以使用同一种编程语言来开发,也可以用不同编程语言来开发。

1.2.3 Protocol Buffers

Protocol Buffers是Google开发的开源数据序列化框架。类似于Thrift和Avro,它也是语言中立的。Google内部用Protocol Buffers作为主要的文件格式,也将其用来进行应用间的数据交换。

Protocol Buffers与Thrift类似,前者提供一个编译器和一组库来帮助开发者序列化数据。开发者在一个文件中定义数据集的结构或模式,然后用Protocol Buffers编译器进行编译,由此生成可用来轻松读写数据的代码。

相对Thrift而言,Protocol Buffers支持较少的编程语言。目前,它支持C++、Java和Python。另外,不像Thrift那样同时提供数据序列化和构建远程服务的工具,Protocol Buffers主要是一种数据序列化格式,可以用来定义远程服务,但并未限定到任何RPC(远程过程调用)协议。

1.2.4 SequenceFile

SequenceFile是一种用于存储键值对的二进制文件格式。它通常作为Hadoop的输入和输出文件格式。MapReduce也用SequenceFile来存储map函数返回的临时输出。

SequenceFile有三种不同的格式:未压缩格式、记录压缩格式和块压缩格式。在记录压缩格式的SequenceFile中,只有记录中的值才压缩;而在块压缩格式的SequenceFile中,键和值都压缩。

相关文章
|
机器学习/深度学习 分布式计算 算法
Spark快速大数据分析PDF下载读书分享推荐
《Spark快速大数据分析》适合初学者,聚焦Spark实用技巧,同时深入核心概念。作者团队来自Databricks,书中详述Spark 3.0新特性,结合机器学习展示大数据分析。Spark是大数据分析的首选工具,本书助你驾驭这一利器。[PDF下载链接][1]。 ![Spark Book Cover][2] [1]: https://zhangfeidezhu.com/?p=345 [2]: https://i-blog.csdnimg.cn/direct/6b851489ad1944548602766ea9d62136.png#pic_center
799 1
Spark快速大数据分析PDF下载读书分享推荐
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
367 1
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
1039 1
|
存储 C# 数据库
解决C#对Firebase数据序列化失败的难题
在游戏开发中,Unity结合Firebase实时数据库为开发者提供强大支持,但在C#中进行数据序列化和反序列化时常遇难题。文章剖析了数据丢失或反序列化失败的原因,并给出解决方案,包括使用`JsonUtility`、确保字段标记为`[Serializable]`以及正确配置网络请求。示例代码演示了如何在Unity环境中实现Firebase数据的序列化和反序列化,并通过设置代理IP、Cookies和User-Agent来增强网络请求的安全性。这些技巧有助于确保数据完整传输,提升开发效率。
409 2
解决C#对Firebase数据序列化失败的难题
|
分布式计算 Java Serverless
EMR Serverless Spark 实践教程 | 通过 spark-submit 命令行工具提交 Spark 任务
本文以 ECS 连接 EMR Serverless Spark 为例,介绍如何通过 EMR Serverless spark-submit 命令行工具进行 Spark 任务开发。
1346 7
EMR Serverless Spark 实践教程 | 通过 spark-submit 命令行工具提交 Spark 任务
|
消息中间件 存储 Java
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
426 3
|
JSON 缓存 NoSQL
Redis 在线查看序列化对象技术详解
Redis 在线查看序列化对象技术详解
489 3
|
消息中间件 存储 分布式计算
大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡
大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡
311 1
|
JSON 缓存 NoSQL
redis序列化数据时,如何包含clsss类型信息?
通过配置 `com.fasterxml.jackson.databind.ObjectMapper` 的 `enableDefaultTyping` 方法,可以使序列化后的 JSON 包含类信息。
515 2
|
存储 安全 Java
揭秘Java序列化神器Serializable:一键解锁对象穿越时空的超能力,你的数据旅行不再受限,震撼登场!
【8月更文挑战第4天】Serializable是Java中的魔术钥匙,开启对象穿越时空的能力。作为序列化的核心,它让复杂对象的复制与传输变得简单。通过实现此接口,对象能被序列化成字节流,实现本地存储或网络传输,再通过反序列化恢复原状。尽管使用方便,但序列化过程耗时且存在安全风险,需谨慎使用。
397 7