为什么hadoop需要像text或intwritable这样的类而不是string或integer?

bd1hkmkf  于 2021-06-03  发布在  Hadoop
关注(0)|答案(4)|浏览(487)

为什么hadoop需要引入这些新类?它们只是使界面复杂化了

cpjpxq1n

cpjpxq1n1#

因为在大数据世界中,结构化对象需要序列化为字节流,以便在网络上移动或持久化到集群上的磁盘…然后根据需要再次反序列化。当你有大量像facebook这样规模的数据可以存储和移动时,你的数据需要高效,需要占用尽可能少的空间来存储和移动。 String 以及 Integer 简直太“胖”了 Text 以及 IntWritable 分别在表示相同类型信息的字节数组之上提供了一个更简单的抽象。

abithluo

abithluo2#

从apache文档页: Writable 接口描述为
一个可序列化的对象,它实现了一个简单、高效的序列化协议,基于 DataInput 以及 DataOutput .
有了这个新的api,你就不会有麻烦了。这些新类的序列化过程是 crisp 以及 compact .
为了提高hadoop的效率,应该优化序列化/反序列化过程,因为集群中的节点之间会发生大量的远程调用。因此,序列化格式应该是快速、紧凑、可扩展和互操作的。由于这个原因,hadoop框架提出了一个io类来代替java原始数据类型。例如。 IntWritbale 为了 int , LongWritable 为了 long , Text 为了 String 等。
您可以在hadoop最终指南:第4版中找到关于这个主题的更多细节

3mpgtkmj

3mpgtkmj3#

更多好消息:
它们有两个相关的特性
它们有“可写”接口—它们知道如何显式地写入dataoutput流和读取datainput流。
它们通过set()操作更新内容。这使您可以重复使用相同的值,而无需创建新示例。如果重复调用同一个Map器或reducer,效率会更高:只需在构造函数中创建可写的示例并重用它们
相比之下,java的可序列化框架“神奇地”序列化了对象——但它的序列化方式有点脆弱,通常不可能读入类的旧版本生成的值。java对象流被设计成发送一个对象图回来——它必须记住已经被推出来的每个对象引用,并在返回的过程中执行同样的操作。可写内容被设计成独立的。
来自:http://hortonworks.com/community/forums/topic/why-hadoop-uses-default-longwritable-or-intwritable/

x8goxv8g

x8goxv8g4#

以hadoop方式处理对象。例如,hadoop使用 Text 而不是java的 String . 这个 Text hadoop中的类类似于java String 然而, Text 实现如下接口 Comparable , Writable 以及 WritableComparable .
这些接口都是mapreduce所必需的;这个 Comparable 接口用于在reducer对键进行排序时进行比较,以及 Writable 可以将结果写入本地磁盘。它不使用java Serializable 因为java Serializable 对hadoop来说太大或太重, Writable 可以很轻松地序列化hadoop对象。

相关问题