为什么hadoop需要引入这些新类?它们只是使界面复杂化了
cpjpxq1n1#
因为在大数据世界中,结构化对象需要序列化为字节流,以便在网络上移动或持久化到集群上的磁盘…然后根据需要再次反序列化。当你有大量像facebook这样规模的数据可以存储和移动时,你的数据需要高效,需要占用尽可能少的空间来存储和移动。 String 以及 Integer 简直太“胖”了 Text 以及 IntWritable 分别在表示相同类型信息的字节数组之上提供了一个更简单的抽象。
String
Integer
Text
IntWritable
abithluo2#
从apache文档页: Writable 接口描述为一个可序列化的对象,它实现了一个简单、高效的序列化协议,基于 DataInput 以及 DataOutput .有了这个新的api,你就不会有麻烦了。这些新类的序列化过程是 crisp 以及 compact .为了提高hadoop的效率,应该优化序列化/反序列化过程,因为集群中的节点之间会发生大量的远程调用。因此,序列化格式应该是快速、紧凑、可扩展和互操作的。由于这个原因,hadoop框架提出了一个io类来代替java原始数据类型。例如。 IntWritbale 为了 int , LongWritable 为了 long , Text 为了 String 等。您可以在hadoop最终指南:第4版中找到关于这个主题的更多细节
Writable
DataInput
DataOutput
crisp
compact
IntWritbale
int
LongWritable
long
3mpgtkmj3#
更多好消息:它们有两个相关的特性它们有“可写”接口—它们知道如何显式地写入dataoutput流和读取datainput流。它们通过set()操作更新内容。这使您可以重复使用相同的值,而无需创建新示例。如果重复调用同一个Map器或reducer,效率会更高:只需在构造函数中创建可写的示例并重用它们相比之下,java的可序列化框架“神奇地”序列化了对象——但它的序列化方式有点脆弱,通常不可能读入类的旧版本生成的值。java对象流被设计成发送一个对象图回来——它必须记住已经被推出来的每个对象引用,并在返回的过程中执行同样的操作。可写内容被设计成独立的。来自:http://hortonworks.com/community/forums/topic/why-hadoop-uses-default-longwritable-or-intwritable/
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对象。
Comparable
WritableComparable
Serializable
4条答案
按热度按时间cpjpxq1n1#
因为在大数据世界中,结构化对象需要序列化为字节流,以便在网络上移动或持久化到集群上的磁盘…然后根据需要再次反序列化。当你有大量像facebook这样规模的数据可以存储和移动时,你的数据需要高效,需要占用尽可能少的空间来存储和移动。
String
以及Integer
简直太“胖”了Text
以及IntWritable
分别在表示相同类型信息的字节数组之上提供了一个更简单的抽象。abithluo2#
从apache文档页:
Writable
接口描述为一个可序列化的对象,它实现了一个简单、高效的序列化协议,基于
DataInput
以及DataOutput
.有了这个新的api,你就不会有麻烦了。这些新类的序列化过程是
crisp
以及compact
.为了提高hadoop的效率,应该优化序列化/反序列化过程,因为集群中的节点之间会发生大量的远程调用。因此,序列化格式应该是快速、紧凑、可扩展和互操作的。由于这个原因,hadoop框架提出了一个io类来代替java原始数据类型。例如。
IntWritbale
为了int
,LongWritable
为了long
,Text
为了String
等。您可以在hadoop最终指南:第4版中找到关于这个主题的更多细节
3mpgtkmj3#
更多好消息:
它们有两个相关的特性
它们有“可写”接口—它们知道如何显式地写入dataoutput流和读取datainput流。
它们通过set()操作更新内容。这使您可以重复使用相同的值,而无需创建新示例。如果重复调用同一个Map器或reducer,效率会更高:只需在构造函数中创建可写的示例并重用它们
相比之下,java的可序列化框架“神奇地”序列化了对象——但它的序列化方式有点脆弱,通常不可能读入类的旧版本生成的值。java对象流被设计成发送一个对象图回来——它必须记住已经被推出来的每个对象引用,并在返回的过程中执行同样的操作。可写内容被设计成独立的。
来自:http://hortonworks.com/community/forums/topic/why-hadoop-uses-default-longwritable-or-intwritable/
x8goxv8g4#
以hadoop方式处理对象。例如,hadoop使用
Text
而不是java的String
. 这个Text
hadoop中的类类似于javaString
然而,Text
实现如下接口Comparable
,Writable
以及WritableComparable
.这些接口都是mapreduce所必需的;这个
Comparable
接口用于在reducer对键进行排序时进行比较,以及Writable
可以将结果写入本地磁盘。它不使用javaSerializable
因为javaSerializable
对hadoop来说太大或太重,Writable
可以很轻松地序列化hadoop对象。