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. PTA (Advanced Level) 1008 Elevator

    Elevator The highest building in our city has only one elevator. A request list is made up with Npos ...

  2. 我的MQ笔记

    1.安装IBM MQ 1.1.安装先决条件: (1)WebSphere  Eclipse  Platform  V3.01 (2)为Windows域用户配置WebSphere MQ用户 1.2.安装程 ...

  3. mac 入门操作

    1. 打开制定目录 在finder里使用command+shift+g 快捷键可以完成到达某路径的操作选中文件/目录,显示简介可以查看路径 2. home end pageUp pageDown 在苹 ...

  4. 使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件

    写在前面 之前写过一篇关于vue实现dialog会话框组件的文章http://www.cnblogs.com/fozero/p/8546883.html, 讲到了如何实现一个vue对话框组件,其中涉及 ...

  5. laravel 数据验证

    laravel 数据验证 在保存数据之前进行数据验证 类需要继承 Controller 然后用  $this->validate( $request , ['title' => 'requ ...

  6. C#Redis Sorted-Sets

    一.前戏 Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score) ...

  7. (译) 在AngularJS中使用的表单验证功能【转】

    验证功能是AngularJS里面最酷炫的功能之一,它可以让你写出一个具有良好用户体验的Web应用. 在AngularJS中,有许多用于验证的指令.我们将先学习几个最流行的内置指令,然后再创建一个自定义 ...

  8. Direct2D教程I——简介及首个例子

    在博客园里,系统的Direct2D的教程比较少,只有“万一”写了一个关于Direct2D的系列(Delphi 2009).于是,仿照其系列,写一个在VS下的Direct2D系列教程. 博客园中的高手还 ...

  9. Spring Boot项目使用maven-assembly-plugin根据不同环境打包成tar.gz或者zip

    spring-boot-assembly 在spring boot项目中使用maven profiles和maven assembly插件根据不同环境打包成tar.gz或者zip 将spring bo ...

  10. 理解JVM之垃圾收集器概述

    前言 很多人将垃圾收集(Garbage Collection)视为Java的伴生产物,实际1960年诞生的Lisp是第一门真正使用内存动态分配与垃圾手机技术的语言.在目前看来,内存的动态分配与内存回收 ...