预览加载中,请您耐心等待几秒...
1/8
2/8
3/8
4/8
5/8
6/8
7/8
8/8

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

PAGE\*MERGEFORMAT8 Hadoop源码分析(2序列化) 作者:张孟志日期:2013-07-25 序列化 简单的认为“序列化”就是介绍Hadoop的数据基本类型也是可以的哦。如果这样的话,请直接阅读后面关于Writable类的内容。 在分布式数据处理的两大领域经常出现:进程间通信和永久存储。 在Hadoop中,系统中多个节点上进程间通信是通过“远程过程调用”(remoteprocedurecall,RPC)实现的。RPC协议将消息序列化成二进制流后发送到远程节点,远程节点接着将二进制流反序列化为原始消息。通常情况下,RPC序列化格式要求:紧凑,充分利用网络带宽;快速,进程间通信形成了分布式系统的骨架,所以要尽量减少序列化和反序列化的性能开销;可扩展,协议为了满足新的需求而不断变化,所以在控制客户端和服务器的过程中,需要直接引进相应的协议;互操作,对于某些系统,希望能支持以不同语言的客户端与服务器交互,所以需要设计为一种特定的格式。 数据永久存储则希望存储格式比较紧凑(进而高效使用存储空间),快速(进而读写数据的额外开销比较小),可扩展(进而可以透明地读取旧格式的数据)且可以互操作(进而可以使用不同的语言读写永久存储的数据)。 在综合考虑HDFS、MapReduce对进程间通信和永久存储的要求,Hadoop并没有采用Java的序列化 WhyNotUseJavaObjectSerialization? 详细分析请阅读《Hadoop-TheDefinitiveGuideSE》Chapter4:HadoopI/O ,而是设计了它自己的系统。 org.apache.hadoop.io中定义了大量的可序列化对象,他们都实现了Writable接口。Writable接口定义了两个方法:一个将其状态写到DataOutput二进制流,另一个从DataInput二进制流读其状态。 /** *LicensedtotheApacheSoftwareFoundation(ASF)underone *ormorecontributorlicenseagreements.SeetheNOTICEfile *distributedwiththisworkforadditionalinformation *regardingcopyrightownership.TheASFlicensesthisfile *toyouundertheApacheLicense,Version2.0(the *"License");youmaynotusethisfileexceptincompliance *withtheLicense.YoumayobtainacopyoftheLicenseat * *http://www.apache.org/licenses/LICENSE-2.0 * *Unlessrequiredbyapplicablelaworagreedtoinwriting,software *distributedundertheLicenseisdistributedonan"ASIS"BASIS, *WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied. *SeetheLicenseforthespecificlanguagegoverningpermissionsand *limitationsundertheLicense. */ packageorg.apache.hadoop.io; importjava.io.DataOutput; importjava.io.DataInput; importjava.io.IOException; /** *Aserializableobjectwhichimplementsasimple,efficient,serialization *protocol,basedon{@linkDataInput}and{@linkDataOutput}. * *<p>Any<code>key</code>or<code>value</code>typeintheHadoopMap-Reduce *frameworkimplementsthisinterface.</p> * *<p>Implementationstypicallyimplementastatic<code>read(DataInput)</code> *methodwhichconstructsanewinstance,calls{@link#readFields(DataInput)} *andreturnstheinstance.</p> * *