zoukankan      html  css  js  c++  java
  • Hadoop文件的序列化

    1. 为什么要序列化

      如图,一个活着的对象只存在于内存中,一旦断电就会消失。并且,在正常情况下,一个或者的对象无法直接通过网络发送到其他(远程)机器上。而序列化可以克服上述问题,它能存储对象,并完成其网络传输的任务。

    2. 什么是序列化

      序列化是将对象转化为字节流的方法,或者说用字节流描述对象的方法。与序列化相对的是反序列化,即将字节流转化为对象的方法。

      序列化由两个目的:

      1)进程间通信;

      2)数据持久性存储。

    3. 为什么不用Java的序列化机制

      Java的序列化机制存在开销大、体积大和和它的引用机制所导致的大文件不能分割的缺点。因此,Java的序列机制不适合Hadoop,Hadoop设计了自己的序列化机制。

    4. Hadoop序列化机制的特点

      Hadoop采用RPC来实现进程间通信,RPC的序列化机制具有以下特点:

      1)紧凑:紧凑的格式可以充分利用带宽,加快传输速度;

      2)快速:能减少序列化和反序列化的开销,这会有效地较少进程间通信的时间;

      3)可扩展:可以逐步改变,是客户端与服务器直接相关的,可以随时加入一个新的参数方法调用;

      4)互操作性:支持不同语言编写的客户端与服务器交换数据。

    5. Hadoop序列化接口

      Hadoop的序列化机制定义了两个接口:Writable接口和Comparable接口,它们可以合并为WritableComparable接口。

     5.1 Writable类

      Writable是Hadoop的核心,Hadoop通过它定义了Hadoop中基本的数据类型及其操作。Writable类定义了两个方法:

    package org.apache.hadoop.io;          
    import java.io.DataOutput;  
    import java.io.DataInput;  
    import java.io.IOException;          
    public interface Writable {  
        /** 
        * 将对象转换为字节流并写入到输出流out中 
        */  
        void write(DataOutput out) throws IOException;  
        /** 
        * 从输入流in中读取字节流反序列化为对象 
        */  
        void readFields(DataInput in) throws IOException;  
    }

     5.2 Comparable类

      所有实现了Comparable的对象都可以和自身相同类型的对象比较大小。该接口定义为:

    package java.lang; 
    
    import java.util.*;     
    
    public interface Comparable
    
    { 
    
        /**
    
        * 将this对象和对象o进行比较,约定:返回负数为小于,零为大于,整数为大于
    
        */ 
    
        public int compareTo(T o); 
    
    }

    6. 自定义writable接口

      Hadoop 中,并没有使用Java自带的基本类型类(Integer、Float等),而是使用自己开发的序列化类型。Hadoop 自带有很多序列化类型,大致分为以下两种。

     6.1 实现了WritableComparable接口的类

      * 基础:BooleanWritable | ByteWritable

      * 数字:IntWritable | VIntWritable | FloatWritable | LongWritable | VLongWritable  | DoubleWritable

      * 高级:NullWritable | Text | BytesWritable | MDSHash | ObjectWritable | GenericWritable

     6.2 仅实现了Writable接口的类:

      * 数组:ArrayWritable | TwoDArrayWritable
      * 映射:AbstractMapWritable | MapWritable | SortedMapWritable

        为便于理解 Hadoop 自带的 Writable 类型,我们使用以下表格展示Java基本类型和 Writable 的对应关系。

      针对上述 Hadoop 中的Writable类型,我们只简单介绍一下 Text。

      Text 类是一种 UTF-8 格式的 Writable 类型。可以将它理解为一种与 java.lang.String 类似的 Writable 类型。

      Text类型与String类型的主要区别如下:

      1)String的长度定义为String包含的字符个数;Text的长度定义为UTF-8编码的字节数。

      2)String内的indexOf()方法返回的是char类型字符的索引,比如字符串(1234),字符3的位置就是2(字符1的位置就是0);而Text的find()得到返回得是字节偏移量。

      3)String的charAt()方法返回的是指定位置的插入字符;而Text的charAt()方法需要制定偏移量。

      另外,Text内定义了一个方法toString(),它用于将Text类型转化为String类型。

    以上就是博主为大家介绍的这一板块的主要内容,这都是博主自己的学习过程,希望能给大家带来一定的指导作用,有用的还望大家点个支持,如果对你没用也望包涵,有错误烦请指出。如有期待可关注博主以第一时间获取更新哦,谢谢!

     版权声明:本文为博主原创文章,未经博主允许不得转载。


  • 相关阅读:
    IDAPython学习(一)
    自动提取文件系统---binwalk(一)
    Scapy Fuzz实现——S7协议从建连到“正常交流“(一)
    工控系统的指纹识别技术
    揭秘VxWorks——直击物联网安全罩门
    VxWorks Fuzzing 之道:VxWorks 工控实时操作系统漏洞挖掘调试与利用揭秘
    路由器文件系统与提取
    python 调试技巧
    拿下id_rsa
    elasticsearch 7.1 401 Unauthorized
  • 原文地址:https://www.cnblogs.com/zimo-jing/p/8664728.html
Copyright © 2011-2022 走看看