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. C++函数中返回引用和返回值的区别

    一.主要讨论下面两个函数的区别: int& at() { return m_data_; } int at() { return m_data_; } 上面两个函数,第一个返回值是int的引用 ...

  2. Spring配置文件引入xml文件: <import resource=" " />标签使用总结

    引入其他模块XML 在Spring的配置文件,有时候为了分模块的更加清晰的进行相关实体类的配置. 比如现在有一个job-timer.xml的配置 <?xml version="1.0& ...

  3. Unix/Linux系统管理技术手册学习笔记——shell

    创建日期:2016/02/29 更新日期:2016/02/29 shell变量赋值时不能在等号两边留空白,否则shell会把变量名误认为是命令名 双引号括起来的变量可以进行替换(用*和?这样的文件名匹 ...

  4. Jmeter接口测试动态传参——动态获取token值

    先添加一个线程组,然后在线程组下添加HTTP Request 环境变量: 线程组下添加User Defined Variables 调用变量:${变量名} 添加结果树: 记录登录后的token: 获取 ...

  5. Windows服务设置

    [服务列表]services.msc [注册服务] 描述:在注册表和服务数据库中创建服务项. 用法:sc <server> create [service name] [binPath= ...

  6. Angular2-组件间数据传递的两种方式

    Angular2组件间数据传递有多种方式,其中最常用的有两种,一种是配置元数据(或者标签装饰),一种是用单例模块传递:有两个元数据具有传递数据的功能:inputs和outputs. 一.元数据传递 1 ...

  7. 【JavaFx教程】第四部分:CSS 样式

    第4部分主题 CSS样式表 添加应用程序图标 CSS样式表 在JavaFX中,你能使用层叠样式表修饰你的用户接口.这非常好!自定义Java应用界面从来不是件简单的事情. 在本教程中,我们将创建一个*D ...

  8. org.springframework.transaction.CannotCreateTransactionException Could not open

    org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for ...

  9. SurfaceView获取本地视频播放

    1.定义 可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图容器. 它的特性是:可以在主线程之外的线程中向屏幕绘图上.这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应 ...

  10. 表id关联数据获取至页面,制作下拉框多选进行数据多项获取(字段处理)

     这周完成了一张表单,重点碰到以下问题: 1.freemaker获取年份的type值取year,类型直接为Long,传至后台和获取数据不需要转换: 2.freemaker获取日期type值为date, ...