Hadoop-No.3之序列化存储格式

简介:

序列化存储指的是将数据结构转化为字节流的过程,一般用于数据存储或者网络传输.与之相反, 反序列化是将字节流转化为数据结果的过程.序列化是分布处理系统(比如Hadoop)的核心,原因在于他能对数据进行转化,形成一种格式.使用了这样的格式之后,数据可以有效的存储,也能通过网络连接进行传输.序列化通常与分布式系统中数据处理的两个方面紧密连接:进程间的通信(比如他远程过程调用,即Remote Prucedure Call RPC),以及数据存储.

Hadoop主要采用的序列化格式为Writables.Writables的特点是紧密,快速.但是脱离Java语言不便于扩展和使用.不过Hadoop生态系统中也有越发普及的其他序列化的框架,包括Thrift,Protocol Buffers 与Avro. 其中Avro的适用性最好,因为它创建的初中就是解除Hadoop Writables的限制.
1 Thrift

Thrift 是Facebook公司开发的框架,用于实现跨语言提供服务接口.Thrift使用接口定义语言(Interface Definition Language, IDL)定义服务接口,而且依据IDL文件自动生成桩代码(stub code),使用这些代码的RPC客户端与服务器,能够跨平台通信.

2 Protocol Buffers

Protocol Buffers(prorobuf)格式由Google公司开发,用于在不同语言编写的服务之间完成数据交换 ,与Thrift类似,Protobuf的结构由一个IDL文件定义,IDL用于为不同的语言创建桩代码.与Thrift类似的是,Protocol Buffers 不支持记录的内部压缩,不可分片,而且缺少MapReduce的原生支持.但是,同样与Thrift类似,Elephant Bird项目可以用于编码protobuf记录,支持MapReduce,压缩以及分片.

3 Avro

Avro是一种和语言无关的数据序列化系统,其设计初衷是解决Hadoop Writables的主要缺点,即缺少跨语言的可移植性支持.与Thrift和Protocol Buffers相同的是,Avr的数据描述也无关语言.与Thrift和Protocol Buffers不同的是,Avro可以选择生成代码,也可以选择不生成代码.因为Avro将模式存储于每个文件的头部,所以每个文件都是自描述的(self-documenting).Avro文件都很容易读取,即使是用一种语言写入数据,而另外一种语言类读取,也没有影响.Avro为MapReduce提供了更好的原生支持.因为Avro的数据可压缩可分片.Avro的另一个重要特点是支持模式演进(schema evolution),这一特点使得Avro比SequenceFile更适合Hadoop应用.也就是说,读取文件的模式不需要与邪恶如文件的模式严格匹配.于是,当需求发生变更的时候,模式中可以添加新的字段

Avro通常都是以JSON格式定义,但是也可以用Avro IDL定义,如前所述,模式存储于文件的头部,是文件元数据的一部分.除了元数据,文件头部还八廓一个唯一的同步标志.与SequenceFile类似,这个同步标志用于隔开文件中的数据块.从而使Avro文件支持分片.每个Avro文件的头部后面都有一系列的数据块,包含序列化后的Avro对象.这些数据块可以压缩.而且,各种数据以原格式存储在这些数据块中,这也为压缩提供了额外的帮助.

Avro定义了少量的基本类型.包括 Boolean int float和string .它也支持array map和enum等复杂类型

目录
相关文章
|
17天前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
38 7
|
3月前
|
JSON JavaScript Java
对比JSON和Hessian2的序列化格式
通过以上对比分析,希望能够帮助开发者在不同场景下选择最适合的序列化格式,提高系统的整体性能和可维护性。
100 3
|
8月前
|
存储 分布式计算 算法
Hadoop性能优化存储空间需求
【6月更文挑战第7天】
87 3
|
3月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
3月前
|
XML JSON Kubernetes
什么是 YAML?:一种简洁高效的数据序列化格式
什么是 YAML?:一种简洁高效的数据序列化格式
337 0
|
4月前
|
分布式计算 资源调度 Hadoop
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
150 3
|
4月前
|
SQL 存储 数据管理
Hadoop-15-Hive 元数据管理与存储 Metadata 内嵌模式 本地模式 远程模式 集群规划配置 启动服务 3节点云服务器实测
Hadoop-15-Hive 元数据管理与存储 Metadata 内嵌模式 本地模式 远程模式 集群规划配置 启动服务 3节点云服务器实测
82 2
|
6月前
|
存储 分布式计算 Java
|
8月前
|
存储 分布式计算 算法
|
8月前
|
存储 分布式计算 Hadoop
Hadoop性能优化存储效率
【6月更文挑战第5天】
115 7

相关实验场景

更多