问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

hadoop mapreduce处理中是不是自动对writable进行序列化的

发布网友 发布时间:2022-04-14 07:37

我来回答

2个回答

懂视网 时间:2022-04-14 11:59

序列化 序列化 (serialization)是指将结构化的对象转化为字节流,以便在网络上传输或者写入到硬盘进行永久存储;相对的 反序列化 (deserialization)是指将字节流转回到结构化对象的过程。 在分布式系统中进程将对象序列化为字节流,通过网络传输到另一进

序列化

序列化(serialization)是指将结构化的对象转化为字节流,以便在网络上传输或者写入到硬盘进行永久存储;相对的反序列化(deserialization)是指将字节流转回到结构化对象的过程。

在分布式系统中进程将对象序列化为字节流,通过网络传输到另一进程,另一进程接收到字节流,通过反序列化转回到结构化对象,以达到进程间通信。在Hadoop中,Mapper,Combiner,Reducer等阶段之间的通信都需要使用序列化与反序列化技术。举例来说,Mapper产生的中间结果()需要写入到本地硬盘,这是序列化过程(将结构化对象转化为字节流,并写入硬盘),而Reducer阶段读取Mapper的中间结果的过程则是一个反序列化过程(读取硬盘上存储的字节流文件,并转回为结构化对象),需要注意的是,能够在网络上传输的只能是字节流,Mapper的中间结果在不同主机间洗牌时,对象将经历序列化和反序列化两个过程。

序列化是Hadoop核心的一部分,在Hadoop中,位于org.apache.hadoop.io包中的Writable接口是Hadoop序列化格式的实现。

Writable接口

Hadoop Writable接口是基于DataInput和DataOutput实现的序列化协议,紧凑(高效使用存储空间),快速(读写数据、序列化与反序列化的开销小)。Hadoop中的键(key)和值(value)必须是实现了Writable接口的对象(键还必须实现WritableComparable,以便进行排序)。

以下是Hadoop(使用的是Hadoop 1.1.2)中Writable接口的声明:

package org.apache.hadoop.io;

import java.io.DataOutput;
import java.io.DataInput;
import java.io.IOException;

public interface Writable {
 /** 
 * Serialize the fields of this object to out.
 * 
 * @param out DataOuput to serialize this object into.
 * @throws IOException
 */
 void write(DataOutput out) throws IOException;

 /** 
 * Deserialize the fields of this object from in. 
 * 
 * 

For efficiency, implementations should attempt to re-use storage in the * existing object where possible.

* * @param in DataInput to deseriablize this object from. * @throws IOException */ void readFields(DataInput in) throws IOException; }

Writable类

Hadoop自身提供了多种具体的Writable类,包含了常见的Java基本类型(boolean、byte、short、int、float、long和double等)和集合类型(BytesWritable、ArrayWritable和MapWritable等)。这些类型都位于org.apache.hadoop.io包中。

writable-classes

(图片来源:safaribooksonline.com)

定制Writable类

虽然Hadoop内建了多种Writable类提供用户选择,Hadoop对Java基本类型的包装Writable类实现的RawComparable接口,使得这些对象不需要反序列化过程,便可以在字节流层面进行排序,从而大大缩短了比较的时间开销,但是当我们需要更加复杂的对象时,Hadoop的内建Writable类就不能满足我们的需求了(需要注意的是Hadoop提供的Writable集合类型并没有实现RawComparable接口,因此也不满足我们的需要),这时我们就需要定制自己的Writable类,特别将其作为键(key)的时候更应该如此,以求达到更高效的存储和快速的比较。

下面的实例展示了如何定制一个Writable类,一个定制的Writable类首先必须实现Writable或者WritableComparable接口,然后为定制的Writable类编写write(DataOutput out)和readFields(DataInput in)方法,来控制定制的Writable类如何转化为字节流(write方法)和如何从字节流转回为Writable对象。

package com.yoyzhou.weibo;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.VLongWritable;
import org.apache.hadoop.io.Writable;

/**
 *This MyWritable class demonstrates how to write a custom Writable class 
 *
 **/
public class MyWritable implements Writable{
		
		
	private VLongWritable field1;
	private VLongWritable field2;
		
	public MyWritable(){
		this.set(new VLongWritable(), new VLongWritable());
	}
		
		
	public MyWritable(VLongWritable fld1, VLongWritable fld2){
			
		this.set(fld1, fld2);
			
	}
		
	public void set(VLongWritable fld1, VLongWritable fld2){
		//make sure the smaller field is always put as field1
		if(fld1.get() <= fld2.get()){
			this.field1 = fld1;
			this.field2 = fld2;
		}else{
				
			this.field1 = fld2;
			this.field2 = fld1;
		}
		}
				
	//How to write and read MyWritable fields from DataOutput and DataInput stream
	@Override
	public void write(DataOutput out) throws IOException {
			
		field1.write(out);
		field2.write(out);
	}

	@Override
	public void readFields(DataInput in) throws IOException {
			
		field1.readFields(in);
		field2.readFields(in);
	}

	/** Returns true if o is a MyWritable with the same values. */
	@Override
	public boolean equals(Object o) {
		 if (!(o instanceof MyWritable))
		 return false;
		
		 MyWritable other = (MyWritable)o;
		 return field1.equals(other.field1) && field2.equals(other.field2);
		
	}
		
	@Override
	public int hashCode(){
			
		return field1.hashCode() * 163 + field2.hashCode();
	}
		
	@Override
	public String toString() {
		return field1.toString() + "	" + field2.toString();
	}
		
}

未完待续,下一篇中将介绍Writable对象序列化为字节流时占用的字节长度以及其字节序列的构成。

参考资料

Tom White, Hadoop: The Definitive Guide, 3rd Edition

---To Be Continued---

热心网友 时间:2022-04-14 09:07

Hadoop对MapRece中Key与Value的类型是有要求的,简单说来,这些类型必须支持Hadoop的序列化。为了提高序列化的性能,Hadoop还为Java中常见的基本类型提供了相应地支持序列化的类型,如IntWritable,LongWritable,并为String类型提供了Text类型。
不过,这些Hadoop内建的类型并不足以支持真实遇到的业务。此时,就需要自定义Writable类,使得它既能够作为Job的Key或者Value,又能体现业务逻辑。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
江西蓝天学院和赣江职业技术学院哪个好? 江西有什么好的中专学校 什么是单点登录(SSO),以及单点登录的实现流程 前端实现单点登录(SSO) 前端单点登录如何实现 面试官:来说说单点登录的三种实现方式 为什么很多人不买哈弗H9 座机如何开通国内长途 座机如何申请 辽宁省出租车手续怎么办? 怎样点亮QQ情侣红钻的图标 黄连为什么能下火 长期坚持跑步的人对比不运动的人,有什么区别? 爱跑步尤其是长跑的人都是什么个性? 请问喝黄连水去火吗?是去的哪里的火啊? 黄连有什麼作用,可以下火吗? 黄连是不是有去火的功能 我最近一直和黄连水 怎么反而上火了 无比惆怅中 还呗用支付宝怎么还? 如何在还呗借到钱? 还呗688免息券在哪里 数控技术究竟是什么 什么是开放式数控系统,开放式数控系统有哪些实现途径 杀了的鸽子肉的颜色为什么是鲜红色的? 如何开发一个数控系统?简单的,学习用的。 防水品牌十大名牌排名有哪些? 数控系统怎样开发 全国各地的珠宝知名品牌 CNC数控系统开发需要什么 如果爱节目 里的vivo手机是什么型号的 ivvi型号SK3-02手机价格及参数 滴滴快车发生事故保险公司拒赔,滴滴平台有责任么? 每天坚持跑步的人,究竟是哪些原因激励着他们? 怎么点亮QQ情侣红钻 天冷时眼镜片遇热容易发雾气,使人看不请东西。有什么好的方法可以... 黄连可以降火,喝多了有坏处吗? 每天跑步的人是什么样的人 qq情侣红钻怎么点亮 我吃了黄连上清丸反而上火是怎么回事? 喝牛奶或是茶上火吗?喝黄连或是王老吉下火吗? 那些天天慢跑10公里的人,身材为什么都那么好? QQ情侣红钻图标怎么点亮?具体步骤 萝卜腿怎么变细变直? 属羊和属羊的人相配吗? 瘦萝卜腿要怎么拉伸 学数据结构和算法应该用什么书? 数据结构与算法的哪本书比较好,推荐一下。20分 怎样才可以防止打过皮的地瓜变黑? 地瓜切片如何保存不发黑 my mother is mine英文版整首诗 手机反厂家真的可靠吗