1. 序列化

  1.1 序列化与反序列化的概念

    序列化:是指将结构化对象转化成字节流在网上传输或写到磁盘进行永久存储的过程

    反序列化:是指将字节流转回结构化对象的逆过程

  1.2 序列化的应用

    序列化用于分布式数据处理的两大领域

    1. 进程间通信
    2. 永久存储

  1.3 序列化的格式要求

    1. 紧凑:体积小,节省带宽
    2. 快速:序列化过程快速
    3. 可扩展:新 API 支持旧数据格式
    4. 支持互操作:跨语言

2. Writable 接口

  2.1 说明

    Hadoop 使用的序列化格式为 Writeable

    Writeable 接口定义了两个方法

    1. write           将对象写入 DataOutput 二进制流
    2. readFields  从 DataInput 二进制流读取对象

  2.2 Writeable接口实现的类

    Writeable 接口实现类包含以下

    1. int 对应的 Writeable 为 IntWriteable
    2. Long 对应的 Writeable 为 LongWriteable
    3. String 对应的 Writeable 为 Text

   以 IntWritable 为例,在阅读源码之后发现,可以直接通过 new 的方式直接带参创建实例化对象,也可以调用空参构造创建实例化对象之后通过 set 方法赋值。

  2.3 IntWritable 案例

  使用 IntWritable 实现 Hadoop 的序列化与反序列化

 import org.apache.hadoop.io.IntWritable;
import org.junit.Test; import java.io.*; /**
* @user: share
* @date: 2018/7/28
* @description: 测试Hadoop的序列化与反序列化
*/
public class TestHadoopSerial { /**
* 单元测试Hadoop的序列化
* @throws IOException
*/
@Test
public void testSerial() throws IOException {
//创建IntWritable对象
IntWritable iw = new IntWritable(66);
//创建输出流对象
DataOutputStream dos = new DataOutputStream(new FileOutputStream("e:/e/haddop.h"));
//iw将值写入输出流dos
iw.write(dos);
//关闭输出流
dos.close();
} /**
* 单元测试Hadoop的反序列化
* @throws IOException
*/
@Test
public void testDeserial() throws IOException {
//创建输入流对象
DataInputStream dis = new DataInputStream(new FileInputStream("e:/e/haddop.h"));
//创建IntWritable对象
IntWritable iw = new IntWritable();
//iw读取输入流dis的值
iw.readFields(dis);
//得到iw中的值
int i = iw.get();
//输出i
System.out.println(i);
//关闭输入流
dis.close();
}
}

  2.4 自定义 PersonWriteable

  【自定义 Person 类】

 import java.io.Serializable;

 /**
* @user: share
* @date: 2018/7/28
* @description: 自定义Person类
*/
public class Person implements Serializable { private String name;
private int age; public Person() {
} public Person(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

  【自定义 PersonWriteable】

 import org.apache.hadoop.io.Writable;

 import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException; /**
* @user: share
* @date: 2018/7/28
* @description: 自定义PersonWriteable实现Person的序列化与反序列化
*/
public class PersonWriteable implements Writable {
//定义person
private Person person; //设置get方法
public Person getPerson() {
return person;
}
//设置set方法
public void setPerson(Person person) {
this.person = person;
} /**
* 重写序列化方法
* @param out
* @throws IOException
*/
public void write(DataOutput out) throws IOException {
//序列化name字段
out.writeUTF(person.getName());
//序列化age字段
out.writeInt(person.getAge());
} /**
* 重写反序列化方法
* @param in
* @throws IOException
*/
public void readFields(DataInput in) throws IOException {
//初始化person
person = new Person();
//反序列化name字段
person.setName(in.readUTF());
//反序列化age字段
person.setAge(in.readInt());
}
}

  【Person 的序列化测试类】

 import org.junit.Test;

 import java.io.*;

 /**
* @user: share
* @date: 2018/7/28
* @description: 测试Person的序列化与反序列化
*/
public class TestPersonSerial {
/**
* 单元测试Person的序列化
* @throws IOException
*/
@Test
public void testPersonSerial() throws IOException {
//新建Person对象
Person p = new Person("sam", 20);
//创建PersonWriteable对象
PersonWriteable pw = new PersonWriteable();
//调用set方法赋值
pw.setPerson(p);
//创建输出流对象
DataOutputStream dos = new DataOutputStream(new FileOutputStream("e:/e/person.j"));
//pw将值写入输出流dos
pw.write(dos);
//关闭输出流
dos.close();
} /**
* 单元测试Person的反序列化
* @throws IOException
*/
@Test
public void testPersonDeserial() throws IOException {
//创建PersonWriteable对象
PersonWriteable pw = new PersonWriteable();
//创建输出流对象
DataInputStream dis = new DataInputStream(new FileInputStream("e:/e/person.j"));
//读取输入流中的对象
pw.readFields(dis);
//得到Person对象
Person p = pw.getPerson();
//输出Person
System.out.println(p.toString());
//关闭输入流
dis.close();
}
}

  



Hadoop 的序列化的更多相关文章

  1. Hadoop基础-序列化与反序列化(实现Writable接口)

    Hadoop基础-序列化与反序列化(实现Writable接口) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.序列化简介 1>.什么是序列化 序列化也称串行化,是将结构化 ...

  2. 大数据框架hadoop的序列化机制

    Java内建序列化机制 在Windows系统上序列化的Java对象,可以在UNIX系统上被重建出来,不需要担心不同机器上的数据表示方法,也不需要担心字节排列次序. 在Java中,使一个类的实例可被序列 ...

  3. Hadoop的序列化

    普通的序列化需要将类型的继承结构也序列化,但是hadoop只序列化对象本身,忽略继承关系,因为hadoop中传输的自定义类型一般都是简单的类型,这样可以减少传输的序列化数据,降低网络带宽的使用.

  4. 关于Java序列化和Hadoop的序列化

    import java.io.DataInput; import java.io.DataOutput; import java.io.DataOutputStream; import java.io ...

  5. Hadoop- 流量汇总程序之如何实现hadoop的序列化接口及代码实现

    流量汇总程序需求 统计每一个用户(手机号)锁耗费的总上行流量.下行流量.总流量. 流程剖析 阶段:map 读取一行数据,切分字段, 抽取手机号,上行流量,下行流量 context.write(手机号, ...

  6. Hadoop中序列化与Writable接口

    学习笔记,整理自<Hadoop权威指南 第3版> 一.序列化 序列化:序列化是将 内存 中的结构化数据 转化为 能在网络上传输 或 磁盘中进行永久保存的二进制流的过程:反序列化:序列化的逆 ...

  7. Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable

    酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...

  8. Hadoop序列化

      遗留问题: Hadoop序列化可以复用对象,是在哪里复用的? 介绍Hadoop序列化机制 Hadoop序列化机制详解 Hadoop序列化的核心 Hadoop序列化的比较接口 ObjectWrita ...

  9. hadoop 序列化源码浅析

    1.Writable接口         Hadoop 并没有使用 JAVA 的序列化,而是引入了自己实的序列化系统, package org.apache.hadoop.io 这个包中定义了大量的可 ...

随机推荐

  1. Dubbo剖析-SPI机制

    文章要点: 1.什么是SPi 2.Dubbo为什么要实现自己的SPi 3.Dubbo的IOC和AOP 4.Dubbo的Adaptive机制 5.Dubbo动态编译机制 6.Dubbo与Spring的融 ...

  2. Java NIO系列教程(八) SocketChannel

    Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器. ...

  3. Solr 配置中文分词器 IK

    1. 下载或者编译 IK 分词器的 jar 包文件,然后放入 ...\apache-tomcat-8.5.16\webapps\solr\WEB-INF\lib\ 这个 lib 文件目录下: IK 分 ...

  4. FFmpeg简易播放器的实现-音视频播放

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10235926.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  5. .19-浅析webpack源码之compile流程-rules参数处理(2)

    第一步处理rule为字符串,直接返回一个包装类,很简单看注释就好了. test/include/exclude 然后处理test.include.exclude,如下: if (rule.test | ...

  6. Spring源码分析:Bean加载流程概览及配置文件读取

    很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...

  7. 用MVC5+EF6+WebApi 做一个小功能(四) 项目分层功能以及文件夹命名

    在上一节,我们完成了一个项目搭建,我们看到的是一个项目的分层架子,那接下来每一层做什么以及需要引用哪些内容呢?在本节内容我们还逐步拆分每一层的功能,顺带添加package包 Trump.Domain ...

  8. [日常] 高性能MySQL-索引

    1.mysql的索引工作类似一本书的目录部分,想找某个特定主题,先查找书的目录部分,找到对应的页码2.ORM工具只能生成基本的合法的查询3.索引是在存储引擎层实现的,不是服务器层4.B-tree就是指 ...

  9. myeclipse或eclipse无法从wtpServer添加tomcatServer

    在eclipse想把之前的Tomcat 6删掉,重新配置一个,不料没有下一步 Cannot create a server using the selected type 这句话出现在窗口上面,应该不 ...

  10. 转载 - java中接口的向上转型。和多态性

    发现一篇对接口总结很精简的文章 1.在java中接口就是一个完全抽象的类,跟抽象类一样不能产生对象,但是可以作为对象的引用,可以由其实现类向上转型,它就跟超类一样, 向上转型了,可以很好的利用接口,可 ...