Hadoop 序列化
Hadoop提供了Writable以提供序列化功能,write方法用于将数据写入流中,readFields方法用于从流中读取数据
public interface Writable {void write(DataOutput out) throws IOException;void readFields(DataInput in) throws IOException; }
Hadoop对于Java常用类都实现了对应的Writable方法,以BooleanWritable为例,对于基础的类型,只是简单的写入与读取
@Overridepublic void readFields(DataInput in) throws IOException {value = in.readBoolean();}@Overridepublic void write(DataOutput out) throws IOException {out.writeBoolean(value);}
BooleanWritable实现了WritableComparable接口,为其提供比较的能力
同时Hadoop定义了RawComparator接口,以提供比较流中未被反序列化的数据的能力,提高比较的效率
public interface RawComparator<T> extends Comparator<T> {public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2); }
Hadoop提供了对RawComparator的基础实现WritableComparator
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {try {buffer.reset(b1, s1, l1); // parse key1 key1.readFields(buffer);buffer.reset(b2, s2, l2); // parse key2 key2.readFields(buffer);buffer.reset(null, 0, 0); // clean up reference} catch (IOException e) {throw new RuntimeException(e);}return compare(key1, key2); // compare them}
而在BooleanWritable类中,实现了继承WritableComparator的Comparator,并通过static方法注册到WritableComparator中
public static class Comparator extends WritableComparator {public Comparator() {super(BooleanWritable.class);}@Overridepublic int compare(byte[] b1, int s1, int l1,byte[] b2, int s2, int l2) {return compareBytes(b1, s1, l1, b2, s2, l2);}}// 注册static {WritableComparator.define(BooleanWritable.class, new Comparator());}
可以通过WritableComparator.get方法根据具体的获取到对应比较器
public static WritableComparator get(Class<? extends WritableComparable> c, Configuration conf) {WritableComparator comparator = comparators.get(c);if (comparator == null) { forceInit(c);comparator = comparators.get(c);if (comparator == null) {comparator = new WritableComparator(c, conf, true);}} ReflectionUtils.setConf(comparator, conf);return comparator;}
Hadoop提供了通用的ObjectWritable类
private Class declaredClass; private Object instance; private Configuration conf;
declaredClass:对象的类instance:对象实例conf:对象运行时的配置ObjectWritable可以用于Hadoop的远程方法调用以及序列化不同的对象到同一个字段,但是ObjectWritable作为一种通用实现,会将类声明作为字符串添加到每一个Key-Value对中,造成较大的性能损失,因此Hadoop提供了GenericWritable对于少量类型数据,可以使用GenericWritable,预先缓存下所有的类型,通过类型编号对类型进行查找,以降低网络传输,但是GenericWritable也有明显的缺陷,即在类型不确定或者类型特别多的时候并不适用
转载于:https://www.cnblogs.com/tyler-jin/p/10424621.html
Hadoop 序列化相关推荐
- Hadoop之Hadoop序列化
Hadoop之Hadoop序列化 目录 什么是序列化 为什么要序列化 为什么不用Java的序列化 常用数据序列化类型 自定义bean对象实现序列化接口(Writable) 1. 什么是序列化 序列化就 ...
- Hadoop序列化与Java序列化
序列化就是把内存中的对象的状态信息转换成字节序列,以便于存储(持久化)和网络传输 反序列化就是就将收到的字节序列或者是硬盘的持久化数据,转换成内存中的对象. 1.JDK的序列化 只要实现了serial ...
- 他来了他来了,Hadoop序列化和切片机制了解一下?
点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 切片机制 一个超大文件在HDFS上存储时,是以多个Block存储在不同的节点上,比如一个512M的 ...
- MapReduce快速入门系列(4) | Hadoop序列化
Hello,大家好,本次为大家带来的是Hadoop的序列化操作. 目录 一. 序列化的简单介绍 1.1. 什么是序列化 1.2. 为什么要序列化 1.3. 为什么不用Java的序列化 二. 自定义be ...
- Hadoop序列化案例
Hadoop序列化案例 统计每一个手机号耗费的总上行流量.总下行流量.总流量 数据: 1 13736230513 192.196.100.1 www.baidu.com 2481 24681 200 ...
- 代码实现——MapReduce实现Hadoop序列化
简单介绍 1.什么是序列化 序列化:把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输. 反序列化:将收到字节序列(或其他数据传输协议)或者是磁盘的持久化数据,转 ...
- Hadoop序列化程序报错
这个错误指向序列化类,注意实现的Read和Wirte顺序一定要一致,并且要使用基本类型,不要使用包装类. java.lang.Exception: java.io.EOFException at or ...
- 一脸懵逼学习Hadoop中的序列化机制——流量求和统计MapReduce的程序开发案例——流量求和统计排序...
一:序列化概念 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化的逆过程.即把字节流转回结构化对象. Java序列化(java.i ...
- hadoop 实现序列化
前言 序列化想必大家都很熟悉了,对象在进行网络传输过程中,需要序列化之后才能传输到客户端,或者客户端的数据序列化之后送达到服务端 序列化的标准解释如下: 序列化就是把内存中的对象,转换成字节序列(或其 ...
最新文章
- java导出highcharts_java实现highcharts导出图片至excel
- php ios视频文件上传,iOS实现视频和图片的上传思路
- 段寄存器和8种地址寻址方式
- 购物车完善版,客户余额及所购商品保存在文件
- 算法专题(1)-信息学基本解题流程!
- [XSY4220] 九万步(结论)
- sql 动态写入数据库字段_批处理写入,动态SQL和参数化SQL,数据库的性能如何?...
- android8.0和9.0平板电脑区别,安卓9.0和8.0有什么区别? 哪个更好
- 读取文件卡顿_奥睿科IV300固态硬盘评测:35克,读取超900M/s?
- tomcat vue 不用 前后端_部署前后端分离项目(后端 tomcat 前端 nginx)
- 知名的开源apm(Application Performance Management)工具
- 阿里云 ECS Ubuntu 14.04 无法访问之磁盘 IO 跑满问题排查
- mysql中的like查询能否用的到索引
- RN:Android 开发记录
- C语言实现动态数字雨
- Allegro PCB 转 PADS Layout 之后的修修补补
- 误删阿里云mysql恢复数据恢复_阿里云数据库表数据误删恢复
- 小米手机android目录在哪里设置字体,在哪里修改小米手机的字体大小
- 文件资源管理器Ranger的使用
- X3D爱好者QQ群:47542302
热门文章
- python php 序列化,序列化和反序列化的详细介绍
- windows 搜索文件
- 网络安全之tcp阻截引擎 (一)
- 一个WIFI热点的脚本思路,顺记shell知识
- ORACLE删除表分区和数据
- php 解析返回的xml,php解析cas返回的xml解决思路
- 【kafka】kerberos认证下 kafka 报错Bootstrap broker host:ip (id: -1 rack: null) disconnected
- 【算法】剑指 Offer 03. 数组中重复的数字
- 1.1.0-简介-P11-分布式锁的解决方案
- 【clickhouse】clickhouse 原生监控