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. linux比较文件夹的差异命令

    可以使用 diff -ruNa s1 s2 或者使用 diff -uN c1 c2 结果如下: sandbox$ tree . |-- dir1 | |-- a.txt | `-- b.txt `-- ...

  2. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  3. Curling 2.0(DFS简单题)

    题目链接: https://vjudge.net/problem/POJ-3009 题目描述: On Planet MM-21, after their Olympic games this year ...

  4. 并发编程之 线程协作工具 LockSupport

    前言 在前面的文章中,我们介绍了并发工具中的4个,Samephore,CyclicBarrier,CountDownLatch,Exchanger,但是我们漏了一个,非常的好用的工具,楼主在这里必须加 ...

  5. 我进行jvm内存调优的一些记录

    jvm内存调优的一些记录 java内存调优的方法和过程 可以使用 jmap -heap pid号 查看,例如pid是9300,执行的结果可能是这样的. root@ubuntu:~# jmap -hea ...

  6. C#取整函数Math.Round、Math.Ceiling和Math.Floor 【非原创,用来收藏,分享】

    1.Math.Round:四舍六入五取偶 引用内容 Math.Round(0.0) //0Math.Round(0.1) //0Math.Round(0.2) //0Math.Round(0.3) / ...

  7. AssemblyInfo.cs 详解

    前言 ? .net工程(包括Web和WinForm)的Properties文件夹下自动生成一个名为AssemblyInfo.cs的文件,一般情况下我们很少直接改动该文件.但我们实际上通过另一个形式操作 ...

  8. (转)mssql sp_addextendedproperty 用法,作用

    sp_addextendedproperty [ @name = ] { 'property_name' } [ , [ @value = ] { 'value' } [ , [ @level0typ ...

  9. CentOS7 mini安装后没有ifconfig命令的解决办法

    在CentOS 最小化mini安装后,没有ifconfig命令,此时网卡也没有启动,所以无法yum安装net-tools. 下面三步解决此问题: 1 查看网卡名称 ip addr 2 启动网卡 ifu ...

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

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