【发布时间】:2017-10-20 16:01:37
【问题描述】:
我正在学习 hadoop,只知道 Java 的基本概念。在研究 hadoop 时,我发现 hadoop 使用自己的类型,例如 Longwritable、Text etch,它们是 Java 原始类型的扩展或包装版本。
我在 java 社区发布这个问题是因为我认为只有这些人可以消除我的疑虑。
我打算在全球范围内理解这个概念,不仅因为它与 hadoop 相关,而且它听起来对我来说非常有趣,并且可以在任何地方使用,而不仅仅是在 hadoop 中。
在阅读时,我发现 hadoop 这样做是为了让他们可以非常快速地在网络上移动数据。并且可以通过序列化和反序列化来完成。对于这个概念,可以使用 Dataoutput,它从任何 Java 原始类型读取数据并转换为一系列字节,然后使用 Datainput 再次读取这些字节并转换回其原始状态。
我的第一个问题是,为什么总是需要将数据转换为字节进行序列化/反序列化?我在某处听说字节的重量低于实际数据,所以这是唯一的原因吗?还有其他原因吗?
第二个问题,当我们进行序列化和反序列化时,可以说使用以下代码
public class LongWritable implements Writable {
// Some data
private int counter;
private long timestamp;
public void write(DataOutput out) throws IOException {
out.writeInt(counter);
out.writeLong(timestamp);
}
public void readFields(DataInput in) throws IOException {
counter = in.readInt();
timestamp = in.readLong();
}
public static LongWritable read(DataInput in) throws IOException {
LongWritable w = new LongWritable();
w.readFields(in);
return w;
}
}
所以这里我们使用 DataInput 和 DataOutput 类型,它指的是实现这些接口的类的对象。所以我的第二个问题是,这些引用类型是否是字节流本身,它们从它们读取或写入字节的位置?我在这里很困惑,这里如何生成字节流来像 hadoop 一样在网络上进行读写操作?
最后一个问题,相同的代码如何与正在进行序列化的机器上的数据通信,以及一旦数据到达那里,如何与网络上正在进行反序列化的另一台机器通信?这种链接如何在网络上使用相同的代码进行序列化/反序列化?
【问题讨论】:
标签: java hadoop serialization deserialization