记录一下hadoop 数据类型章节的笔记,以便后期使用,本文是边学习边记录,持续更新中
Hadoop 常用自带的数据类型和Java数据类型配比如下
在此首先明确定义下序列化
参考百度百科
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
Hadoop自定义类型必须实现的一个接口 Writable 代码如下
write 方法:Serialize the fields of this object to out
readFields:Deserialize the fields of this object from in
实现该接口后,还需要手动实现一个静态方法,在该方法中返回自定义类型的无参构造方法
for example
官方完成例子
WritableComparables can be compared to each other, typically via Comparators. Any type which is to be used as a key in the Hadoop Map-Reduce framework should implement this interface.
如果该自定义类型作为key,那么需要实现 WritableComparable 接口,这个接口实现了两个接口 ,分别为 Comparable<T>, Writable
类似上一段代码 主要新增 compareTo 方法 代码如下
特殊的类型 NullWritable
NullWritable是Writable的一个特殊类,序列化的长度为0,实现方法为空实现,不从数据流中读数据,也不写入数据,只充当占位符,如在MapReduce中,如果你不需要使用键或值,你就可以将键或值声明为NullWritable,NullWritable是一个不可变的单实例类型。
特殊的类型 ObjectWritable
ObjectWritable 是对java 基本类型的一个通用封装:用于客户端与服务器间传输的Writable对象,也是对RPC传输对象的封装,因为RPC上交换的信息只能是JAVA的基础数据类型,String或者Writable类型,而ObjectWritable是对其子类的抽象封装
ObjectWritable会往流里写入如下信息:
对象类名,对象自己的串行化结果
其序列化和反序列化方法如下:
特殊的类型 GenericWritable
例如一个reduce中的输入从多个map中获,然而各个map的输出value类型都不同,这就需要 GenericWritable 类型 map端用法如下
在reduce 中用法如下
自定义MyGenericWritable如下
Hadoop 常用自带的数据类型和Java数据类型配比如下
Hadoop类型 | Java类型 | 描述 |
BooleanWritable | boolean | 布尔型 |
IntWritable | int | 整型 |
FloatWritable | float | 浮点float |
DoubleWritable | double | 浮点型double |
ByteWritable | byte | 整数类型byte |
Text | String | 字符串型 |
ArrayWritable | Array | 数组型 |
在此首先明确定义下序列化
参考百度百科
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
Hadoop自定义类型必须实现的一个接口 Writable 代码如下
public interface Writable { void write(DataOutput out) throws IOException; void readFields(DataInput in) throws IOException; }
write 方法:Serialize the fields of this object to out
readFields:Deserialize the fields of this object from in
实现该接口后,还需要手动实现一个静态方法,在该方法中返回自定义类型的无参构造方法
for example
public static MyWritable read(DataInput in) throws IOException { MyWritable w = new MyWritable(); w.readFields(in); return w; }
官方完成例子
public class MyWritable implements Writable { // Some data private int counter; private long timestamp; public void write(DataOutput out) throws IOException { out.writeInt(counter); out.writeLong(timestamp); } public void readFields(DataInput in) throws IOException { counter = in.readInt(); timestamp = in.readLong(); } public static MyWritable read(DataInput in) throws IOException { MyWritable w = new MyWritable(); w.readFields(in); return w; } }
WritableComparables can be compared to each other, typically via Comparators. Any type which is to be used as a key in the Hadoop Map-Reduce framework should implement this interface.
如果该自定义类型作为key,那么需要实现 WritableComparable 接口,这个接口实现了两个接口 ,分别为 Comparable<T>, Writable
类似上一段代码 主要新增 compareTo 方法 代码如下
public int compareTo(MyWritableComparable w) { int thisValue = this.value; int thatValue = ((IntWritable)o).value; return (thisValue < thatValue ? -1 : (thisValue==thatValue ? 0 : 1)); }
特殊的类型 NullWritable
NullWritable是Writable的一个特殊类,序列化的长度为0,实现方法为空实现,不从数据流中读数据,也不写入数据,只充当占位符,如在MapReduce中,如果你不需要使用键或值,你就可以将键或值声明为NullWritable,NullWritable是一个不可变的单实例类型。
特殊的类型 ObjectWritable
ObjectWritable 是对java 基本类型的一个通用封装:用于客户端与服务器间传输的Writable对象,也是对RPC传输对象的封装,因为RPC上交换的信息只能是JAVA的基础数据类型,String或者Writable类型,而ObjectWritable是对其子类的抽象封装
ObjectWritable会往流里写入如下信息:
对象类名,对象自己的串行化结果
其序列化和反序列化方法如下:
public void readFields(DataInput in) throws IOException { readObject(in, this, this.conf); } public void write(DataOutput out) throws IOException { writeObject(out, instance, declaredClass, conf); } public static void writeObject(DataOutput out, Object instance, Class declaredClass, Configuration conf) throws IOException { //对象为空则抽象出内嵌数据类型NullInstance if (instance == null) { // null instance = new NullInstance(declaredClass, conf); declaredClass = Writable.class; } //先写入类名 UTF8.writeString(out, declaredClass.getName()); // always write declared /* * 封装的对象为数组类型,则逐个序列化(序列化为length+对象的序列化内容) * 采用了迭代 */ if (declaredClass.isArray()) { // array int length = Array.getLength(instance); out.writeInt(length); for (int i = 0; i < length; i++) { writeObject(out, Array.get(instance, i), declaredClass.getComponentType(), conf); } //为String类型直接写入 } else if (declaredClass == String.class) { // String UTF8.writeString(out, (String)instance); }//基本数据类型写入 else if (declaredClass.isPrimitive()) { // primitive type if (declaredClass == Boolean.TYPE) { // boolean out.writeBoolean(((Boolean)instance).booleanValue()); } else if (declaredClass == Character.TYPE) { // char out.writeChar(((Character)instance).charValue()); } else if (declaredClass == Byte.TYPE) { // byte out.writeByte(((Byte)instance).byteValue()); } else if (declaredClass == Short.TYPE) { // short out.writeShort(((Short)instance).shortValue()); } else if (declaredClass == Integer.TYPE) { // int out.writeInt(((Integer)instance).intValue()); } else if (declaredClass == Long.TYPE) { // long out.writeLong(((Long)instance).longValue()); } else if (declaredClass == Float.TYPE) { // float out.writeFloat(((Float)instance).floatValue()); } else if (declaredClass == Double.TYPE) { // double out.writeDouble(((Double)instance).doubleValue()); } else if (declaredClass == Void.TYPE) { // void } else { throw new IllegalArgumentException("Not a primitive: "+declaredClass); } //枚举类型写入 } else if (declaredClass.isEnum()) { // enum UTF8.writeString(out, ((Enum)instance).name()); //hadoop的Writable类型写入 } else if (Writable.class.isAssignableFrom(declaredClass)) { // Writable UTF8.writeString(out, instance.getClass().getName()); ((Writable)instance).write(out); } else { throw new IOException("Can't write: "+instance+" as "+declaredClass); } } public static Object readObject(DataInput in, Configuration conf) throws IOException { return readObject(in, null, conf); } /** Read a {<a href="http://my.oschina.net/link1212" class="referer" target="_blank">@link</a> Writable}, {<a href="http://my.oschina.net/link1212" class="referer" target="_blank">@link</a> String}, primitive type, or an array of * the preceding. */ @SuppressWarnings("unchecked") public static Object readObject(DataInput in, ObjectWritable objectWritable, Configuration conf) throws IOException { //获取反序列化的名字 String className = UTF8.readString(in); //假设为基本数据类型 Class<?> declaredClass = PRIMITIVE_NAMES.get(className); /* * 判断是否为基本数据类型,不是则为空,则为Writable类型, * 对于Writable类型从Conf配置文件中读取类名, * 在这里只是获取类名,而并没有反序列化对象 */ if (declaredClass == null) { try { declaredClass = conf.getClassByName(className); } catch (ClassNotFoundException e) { throw new RuntimeException("readObject can't find class " + className, e); } } //基本数据类型 Object instance; //为基本数据类型,逐一反序列化 if (declaredClass.isPrimitive()) { // primitive types if (declaredClass == Boolean.TYPE) { // boolean instance = Boolean.valueOf(in.readBoolean()); } else if (declaredClass == Character.TYPE) { // char instance = Character.valueOf(in.readChar()); } else if (declaredClass == Byte.TYPE) { // byte instance = Byte.valueOf(in.readByte()); } else if (declaredClass == Short.TYPE) { // short instance = Short.valueOf(in.readShort()); } else if (declaredClass == Integer.TYPE) { // int instance = Integer.valueOf(in.readInt()); } else if (declaredClass == Long.TYPE) { // long instance = Long.valueOf(in.readLong()); } else if (declaredClass == Float.TYPE) { // float instance = Float.valueOf(in.readFloat()); } else if (declaredClass == Double.TYPE) { // double instance = Double.valueOf(in.readDouble()); } else if (declaredClass == Void.TYPE) { // void instance = null; } else { throw new IllegalArgumentException("Not a primitive: "+declaredClass); } } else if (declaredClass.isArray()) { // array int length = in.readInt(); instance = Array.newInstance(declaredClass.getComponentType(), length); for (int i = 0; i < length; i++) { Array.set(instance, i, readObject(in, conf)); } } else if (declaredClass == String.class) { // String类型的反序列化 instance = UTF8.readString(in); } else if (declaredClass.isEnum()) { // enum的反序列化 instance = Enum.valueOf((Class<? extends Enum>) declaredClass, UTF8.readString(in)); } else { // Writable Class instanceClass = null; String str = ""; try { //剩下的从Conf对象中获取类型Class str = UTF8.readString(in); instanceClass = conf.getClassByName(str); } catch (ClassNotFoundException e) { throw new RuntimeException("readObject can't find class " + str, e); } /* * 带用了WritableFactories工厂去new instanceClass(实现了Writable接口)对象出来 * 在调用实现Writable对象自身的反序列化方法 */ Writable writable = WritableFactories.newInstance(instanceClass, conf); writable.readFields(in); instance = writable; if (instanceClass == NullInstance.class) { // null declaredClass = ((NullInstance)instance).declaredClass; instance = null; } } //最后存储反序列化后待封装的ObjectWritable对象 if (objectWritable != null) { // store values objectWritable.declaredClass = declaredClass; objectWritable.instance = instance; } return instance; }
特殊的类型 GenericWritable
例如一个reduce中的输入从多个map中获,然而各个map的输出value类型都不同,这就需要 GenericWritable 类型 map端用法如下
context.write(new Text(str), new MyGenericWritable(new LongWritable(1))); context.write(new Text(str), new MyGenericWritable(new Text("1")));
在reduce 中用法如下
for (MyGenericWritable time : values){ //获取MyGenericWritable对象 Writable writable = time.get(); //如果当前是LongWritable类型 if (writable instanceof LongWritable){ count += ((LongWritable) writable).get(); } //如果当前是Text类型 if (writable instanceof Text){ count += Long.parseLong(((Text)writable).toString()); } }
自定义MyGenericWritable如下
class MyGenericWritable extends GenericWritable{ //无参构造函数 public MyGenericWritable() { } //有参构造函数 public MyGenericWritable(Text text) { super.set(text); } //有参构造函数 public MyGenericWritable(LongWritable longWritable) { super.set(longWritable); } @Override protected Class<? extends Writable>[] getTypes() { return new Class[]{LongWritable.class,Text.class}; }
发表评论
-
Sort-based Shuffle的设计与实现
2016-03-15 08:49 760原文 http://www.cnblogs.com/hsea ... -
spark的几个重要概念
2015-12-04 14:09 0本节主要记录以下几个概念 一:RDD的五大特点 二:RDD 窄 ... -
spark部署安装调试
2015-12-02 11:28 706本节记录spark下载-->编译-->安装--&g ... -
spark基本概念
2015-11-12 10:45 738记录一下课堂笔记: ... -
hadoop计算能力调度器配置
2015-10-29 10:39 970问题出现 hadoop默认调度器是FIFO,其原理就是先按照作 ... -
HBase在各大应用中的优化和改进
2015-10-28 14:59 640Facebook之前曾经透露过Facebook的hbase架构 ... -
一篇很好的解决系统问题过程描述文章
2015-09-23 08:40 462在网上看到的一篇解决h ... -
通过GeoHash核心原理来分析hbase rowkey设计
2015-09-08 15:49 3478注:本文是结合hbase ... -
从OpenTsdb来分析rowkey设计
2015-09-06 16:04 4905讨论此问题前,先理解 ... -
HBase中asynchbase的使用方式
2015-08-25 10:32 8116Hbase的原生java 客户端是完全同步的,当你使用原生AP ... -
Mapreduce优化的点滴
2015-07-16 15:18 796注:转载 1. 使用自定义Writable 自带的Text ... -
napreduce shuffle 过程记录
2015-07-10 11:23 728在我看来 hadoop的核心是mapre ... -
ZooKeeper伪分布式集群安装及使用
2015-02-13 08:29 8821. zookeeper介绍 ZooKeeper是一个为分 ... -
hadoop-mahout 核心算法总结
2015-02-07 10:08 1506其实大家都知道hadoop为我们提供了一个大的框架,真正的 ... -
推荐引擎内部原理--mahout
2015-01-22 11:11 542转载自:https://www.ibm.com/devel ... -
hadoop 动态添加删除节点
2015-01-20 13:39 638转自:http://www.cnblogs.com/rill ... -
hbase hadoop zookeeper
2015-01-19 14:47 0hadoop 部署手册 http://www.iteblo ... -
mapreduce 开发以及部署
2015-01-16 13:56 794前面几篇文章的梳理让我对hadoop新yarn 框架有了一 ... -
hadoop yarn几个问题的记录
2015-01-13 11:48 614本文主要介绍以下几 ... -
hadoop集群部署时候的几个问题记录
2015-01-13 10:24 704本章部署一个hadoop 集群 ...
相关推荐
hadoop自定义类型编程
Hadoop学习笔记—5.自定义类型处理手机上网日志-附件资源
用户自定义函数 过滤UDF 计算UDF 加载UDF 数据处理操作 加载和存储数据 过滤数据 分组与连接数据 对数据进行排序 组合和分割数据 Pig实战 并行处理 参数代换 第12章 Hive 1.1 安装Hive ...
通过自定义数据类型,可以使用Hadoop处理单表数据查询以及多表相互关联的应用场景。
用户自定义函数 过滤UDF 计算UDF 加载UDF 数据处理操作 加载和存储数据 过滤数据 分组与连接数据 对数据进行排序 组合和分割数据 Pig实战 并行处理 参数代换 第12章 Hive 1.1 安装Hive 1.1.1 Hive外壳环境 1.2 示例 ...
您还可以找到如何在Map Reduce中编写自定义数据类型和自定义分区程序。 #trendfinder文件夹:在Trendfinder文件夹中,您将发现如何使用多个Mappers和Reducers。 在这里,我们根据推文的出现来处理推特数据。 #...
(1)统计全球每年的最高气温和最低气温。 (2)MapReduce输出结果包含年份、最高气温、...(4)结合Combiner和自定义数据类型完成全球每年最高气温和最低气温的统计。 (5)应用ToolRunner的使用和Eclipse提交MapReduce任务。
《Hadoop硬实战》包含: ·Hadoop和MapReduce的基本概念 ·85个实战和测试技术 ·真实的场景,实用的解决方案 ·如何整合MapReduce和R前言 致谢关于本书 第1 部分 背景和基本原理1 跳跃中的Hadoop1.1 什么...
(1)统计全球每年的最高气温和最低气温。 (2)MapReduce输出结果包含年份、最高气温、...(4)结合Combiner和自定义数据类型完成全球每年最高气温和最低气温的统计。 (5)应用ToolRunner的使用和Eclipse提交MapReduce任务。
目录网盘文件永久链接 1-MapReduce.rar 2 MapReducel的源简介和自定义类型rar 3 mapReducel的剩余核环节解rar 4 MapReduce的自定V排序和分组rar 5 hadoop的集群安装和安全模式个绍rar 代码部分rar
3.4.3 Hadoop 纠删码概述…·…········· ·· ·· ····· ·· ····· · ··· · ······· ·· ….... . .. .…..... .. ....................... 147 3.4.4 纠删码技术在Hadoop 中的...
HBase、 Java9 、Java10 、MySQL优化 、JVM原理 、JUC多线程、 CDH版Hadoop Impala、 Flume 、Sqoop、 Azkaban、 Oozie、 HUE、 Kettle、 Kylin 、Spark 、Mllib机器学习、 Flink、 Python、 SpringBoot、 Hadoop3.x...
集群类型Hades支持和群集,但是将来可能会支持自定义发行版。命名法服务:群集内的Hadoop组件(HDFS,Yarn等) 角色:服务实例的角色类型(资源管理器,名称节点,数据节点等。)入门克隆存储库通过安装安装依赖项...
此文件夹下主要包含2个java文件,TextPair.java和TextPair2.java,都是自定义的数据类型。 TextPair.java重写了write()和readFields()2个函数 TextPair2.java重写的函数较多 extract_mac 主要包括1个java文件和1个...
03_MapReduce数据类型及自定义数据类型 04_案例:网站基本指标分析(一) 05_案例:网站基本指标分析(二) 06_分布式安装部署:克隆虚拟机及配置网络 07_分布式安装部署:集群基本配置及服务运行规划 08_分布式安装...
3.4 自定义文件格式 3.4.1 输入输出格式 技术点18 输入和输出格式为CSV 的文件 3.4.2 output committing 的重要性 3.5 本章小结 第3 部分 大数据模式 4 处理大数据的MapReduce 模式 4.1 Join ...
2.1 序列化概述 2.2 常用数据序列化类型 2.3 自定义 bean 对象实现序列化接口(Writable) 2.4 序列化案例实操
Hadoop MapReduce Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架。...2.Mapper的输入数据是KV对的形式(KV的类型可自定义) 3.Mapper的输出数据是KV对的形式(K