Hadoop序列化
发布日期:2021-06-29 12:30:33 浏览次数:2 分类:技术文章

本文共 2478 字,大约阅读时间需要 8 分钟。

为什么Hadoop基本类型还要定义序列化?1、Hadoop在集群之间通信或者RPC调用时需要序列化,而且要求序列化要快,且体积要小,占用带宽小。2、java的序列化机制占用大量计算开销,且序列化结果体积过大;   它的引用机制也导致大文件不能被切分,浪费空间;   此外,很难对其他语言进行扩展使用;   java的反序列化过程每次都会构造新的对象,不能复用对象。
Hadoop定义了两个序列化相关接口Writable和ComparableWritableComparable接口相当于继承了上述两个接口的新接口 Public interface WritableComparable
extends Writable,Comparable
Writable接口基于DataInput与DatOutput的简单高效可序列化接口,就是org.apache.hadoop.io.Writable接口几乎所有的hadoop可序列化对象都必须实现这个接口的2个方法Write,readFiles以IntWritable为例,它把java的int类型封装成了Writable序列化格式可以通过set()设置它的值  new IntWritable().set(100); new IntWritable(100);
WritableComparable接口类似java的Comparable接口,用于类型的比较。MR其中一个阶段叫排序,默认使用Key来排序。Hadoop提供了一个优化接口RawComparatorPublic interface RawComparator
extends Comparator
{
Public int compare(byte[] b1,int s1,int l1,byte[] b2,int s2,int l2);}可以比较b1和b2,允许执行者直接比较数据流记录,而无须先把数据流反序列化成对象,这样可以避免新建对象的开销 。
Hadoop Writable基本类型Writable类ArrayWritableTwoDArrayWritableMapWritableSortedMapWritableBooleanWritableByteWritableIntWritableVIntWritableFloatWritableLongWritableVLongWritableDoubleWritableNullWritableTextBytesWritableMD5HashObjectWrtiableGenericWritable
Text  存储的数据按照UTF-8,类似String,它提供了序列化,反序列化和字节级别比较的方法。Text类替换了UTF8类。1.unicode编码是一个很大的集合,可以容纳100多万个符号。具体的符号对应表可以查询unicode.org 它只规定了符号的二进制代码,没有规定如何存储,而utf-8就是unicode的实现还有utf16等。对于单个字符字节第一位为0,后面7位为这个符号的unicode码。因此对于英语字母,utf-8编码和ASCII码是相同的。所有\u0001~\u007f会以单字节储存。\u0080~\u07ff的unicode会以双字节储存,\u0800~\uFFFF的会以3字节存储。2.例子 Text的几个方法 一旦使用多字节编码Text和String区别就明显了Public void testText() throws UnsupportedEncodingException{T=new Text(“你好”);S=”你好”;assertEquals(t.getLength(),12);assertEquals(s.getBytes(“utf-8”).length,12);assertEquals(s.length(),4);assertEquals(t.find(“你”),6);assertEquals(s.indexOf(“你”),3);}Text.find()方法返回的是字节偏移量,String.indexOf返回单个编码字符的索引位置,String.codeprintAt()和Text.charAt类似,前者通过字节偏移量来索引Text对字符串没有String方法丰富 大多数情况下通过toString转换成String来操作
BytesWritable 相当于二进制数据数组的包装。以字节数组{1,2,3,4}它的序列化格式是4字节表示字节数 ,每2个字节表示一个数据即 “0000 0004 0102 0304” 和Text一样BytesWritable也是可变的 ,可以通过set来修改
NullWritable 是writable类型的特殊类型,序列化长度为0,它充当占位符但不真在数据流中读写。NullWritable是单实例类型,通过NullWriable.get()方法获取
ObjectWritable和GenericWritable ObjectWritable是对java基本类型的和这些类型的数组类型的通用封装 ,使用RPC来封送
自定义Writable类型Hadoop基本满足大部分需求,但有些情况下可以根据业务需要构造新的实现,为了提高MR作业的性能,因为Writable是MR的核心。
前几节小节HDFS以CRC校验来检测数据是否为完整的,并在默认设置下,会读取数据时验证校验和,保证其数据的完整性,其所有序列化数据结构都是针对大数据处理的。Hadoop对大数据的压缩和解压机制,可以减少储存 空间和加速数据在网络上的传输。在hadoop中通过序列化将消息编码为二进制流发送到远程节点,此后在接收端接收的二进制流被反序列化为消息。Hadoop没有采用java的序列化,实现了自己的writable接口。

详细可见:

转载地址:https://bupt-xbz.blog.csdn.net/article/details/79171632 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:HDFS中数据副本的存放策略
下一篇:HDFS文件压缩

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月09日 01时27分09秒