`
cocoIT
  • 浏览: 48464 次
  • 性别: Icon_minigender_1
  • 来自: 福建
文章分类
社区版块
存档分类
最新评论

Hadoop中如何正确编写继承自Writable接口的子类

阅读更多

Hadoop中可以编写自己的类,用作hadoop job的key或者value类型,自己编写的类要实现接口Writable。

我编写了一个HttpContent类,主要用于保存爬取网页的源码,返回状态和编码格式信息,他在mapper中别实例化保存网页内容,然后传输到reducer中被使用,在编写中遇到了一些问题:

(1)首先是没有编写默认的构造函数类,因为java中的反馈机制需要一个参数为空的默认构造函数,如果没有这个类就不能利用反馈机制实例化这个类。

(2)然后是类型在序列化的时候写入后读取值不正确,一定要统一类型中write(DataOutput out)和readFields(DataInput in)中写入和读取参数的方法,例如一个int类型如果你在write()中使用writeInt写出,在readFields()中就应该使用readInt()读入,否则读取的值是不正确的。多个值写出读入的时候,写出读入的顺序要保持一致的,否则读取也是不正确的。

(3)Writable中用于写出的DataOutput类型没有针对String类型的序列化方法,需要先将String类型转换成为Byte数组类型,然后在进行序列化。

下面是HttpContent的类型的源码,重点是write(DataOutput out)和readFields(DataInput in)方法:

<span style="font-size:14px;">package bbs.http;

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

import org.apache.hadoop.io.Writable;

/**
 * 
 */
public class HttpContent implements Writable{

	
	private byte[] content;
	
	private int status;
	
	private String encoding;

	public HttpContent(){
	}
	
	public HttpContent(byte[] content, int status, String encoding) {
		this.content = content;
		this.status = status;
		if (encoding == null)
			this.encoding = "GBK";
		else
			this.encoding = encoding;

	}

	public byte[] getByte() {
		return this.content;
	}

	public String getData() {
		String data =null;
		try {
			if(content==null){
				//System.out.println("content涓簄ull:"+getStatus());
				
				return null;
			}
			data = new String(content, encoding);
			
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return data;
	}

	public int getStatus() {
		return this.status;
	}

	public String getEncoding() {
		return encoding;
	}

	@Override
	public String toString() {
		return "Content: " + getData() + "\n" + "status: " + status + "\n"
				+ "encoding: " + encoding + "\n";
	}

	@Override
	public void readFields(DataInput in) throws IOException {
		int size=in.readInt();
//		System.out.println("HttpContent readFields: size="+size);
		if(size>0){
			content=new byte[size];
			in.readFully(this.content);
		}else{
			content=null;
		}
		
		this.status=in.readInt();
//		System.out.println("status="+status);
		int encodeSize=in.readInt();
		byte[] encodeBytes=new byte[encodeSize];
		in.readFully(encodeBytes);
		this.encoding=new String(encodeBytes,"GBK");
//		System.out.println("encoding="+this.encoding);
		
	}

	@Override
	public void write(DataOutput out) throws IOException {
		if(content==null){
			out.writeInt(0);
		}else{
//			System.out.println("HttpContent write(): content.length="+content.length);
			out.writeInt(content.length);
			out.write(content);
		}
//		System.out.println("Status="+status);
		out.writeInt(status);
//		System.out.println("encoding="+encoding);
		byte[] temp=encoding.getBytes("GBK");
		out.writeInt(temp.length);
		out.write(temp);
//		out.writeBytes(encoding);
		
	}
}
</span>


分享到:
评论

相关推荐

    hadoop运行python编写的mapreduce程序

    利用hadoop-streaming框架运行python脚本指令

    Hadoop 2.7.1 中文文档

    Hadoop 2.7.1 中文文档 Hadoop 2.7.1 中文文档 Hadoop 2.7.1 中文文档

    hadoop2.7.3 hadoop.dll

    在windows环境下开发hadoop时,需要配置HADOOP_HOME环境变量,变量值D:\hadoop-common-2.7.3-bin-master,并在Path追加%HADOOP_HOME%\bin,有可能出现如下错误: org.apache.hadoop.io.nativeio.NativeIO$Windows....

    hadoop2.7中文文档

    hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文文档hadoop2.7中文...

    hadoop-3.3.4 版本(最新版)

    在 Hadoop 中,MapReduce 底层的分布式文件系统是独文模块,用户可按照约定 的一套接口实现自己的分布式文件系统,然后经过简单的配置后,存储在该文件 系统上的数据便可以被 MapReduce 处理。 官网下载速度非常缓慢...

    在Windows上使用eclipse编写Hadoop应用程序

    hadoop 云计算 mdfs mapreduce

    hadoop 中文手册

    hadoop 中文手册 Hadoop文档 下面的文档是一些概念介绍和操作教程,可帮助你开始使用Hadoop。如果遇到了问题,你可以向邮件列表求助或者浏览一下存档邮件。 Hadoop快速入门 Hadoop集群搭建 Hadoop分布式文件系统...

    Hadoop 中的调度

    Hadoop 中的调度

    Hadoop2.7.1中文文档

    Hadoop2.7.1中文文档

    新版Hadoop视频教程 段海涛老师Hadoop八天完全攻克Hadoop视频教程 Hadoop开发

    第一天 hadoop的基本概念 伪分布式hadoop集群安装 hdfs mapreduce 演示 01-hadoop职位需求状况.avi 02-hadoop课程安排.avi 03-hadoop应用场景.avi 04-hadoop对海量数据处理的解决思路.avi 05-hadoop版本选择和...

    Hadoop中Flume安装指南

    Hadoop中的Flume安装指南,不会的童鞋可以下载哦,有助于学习

    Hadoop实战 中文版

    本书分为3 个部分,深入浅出地介绍了hadoop 框架、编写和运行hadoop 数据处理程序所需的实践技能及hadoop 之外更大的生态系统。 《hadoop实战》适合需要处理大量离线数据的云计算程序员、架构师和项目经理阅读参考...

    Hadoop:Hadoop编程

    Hadoop 伙计们, 在这里,您将找到一些... #pdf文件夹:它包含如何在hadoop中编写我们自己的Custome FileInPutFormat,RecordReader类以处理PDF文件。 #Java到HDFS的连接在此软件包中,您将找到如何从Java连接到HD

    Hadoop权威指南 第二版(中文版)

     从Hadoop URL中读取数据  通过FileSystem API读取数据  写入数据  目录  查询文件系统  删除数据  数据流  文件读取剖析  文件写入剖析  一致模型  通过 distcp并行拷贝  保持 HDFS 集群的均衡  ...

    Hadoop 2.6.0 API CHM版 自制

    自己下载完整的API文档后编译的,Hadoop 2.6.0 API CHM版

    【大数据入门笔记系列】第五节 SpringBoot集成hadoop开发环境(复杂版的WordCount)

    【大数据入门笔记系列】第五节 SpringBoot集成hadoop开发环境(复杂版的WordCount)前言环境清单创建SpringBoot项目创建包创建yml添加集群主机名映射hadoop配置文件环境变量HADOOP_HOME编写代码添加hadoop依赖jar包...

    Hadoop的shell接口和java接口

    在上传文件和下载文件时一定要把路径写...在做java接口操作时,一定要将jar包导正确,最好导入Hadoop-2.9.1的解压文件jar包,Hadoop-2.7.7的会失败,否则运行会出现错误,按住“shift+ctrl+o”键可以将需要的包导进去。

    HADOOP课程大纲.pdf

    模块二 Hadoop生态系统介绍和演示 Hadoop HDFS 和 MapReduce Hadoop数据库之HBase Hadoop数据仓库之Hive Hadoop数据处理脚本Pig Hadoop数据接口Sqoop和Flume,Scribe DataX Hadoop工作流引擎 Oozie 运用Hadoop...

    Hadoop开发环境的插件hadoop-eclipse-plugin-2.10.1

    Hadoop Eclipse是Hadoop开发环境的插件,用户在创建Hadoop程序时,Eclipse插件会自动导入Hadoop编程接口的jar文件,这样用户就可以在Eclipse插件的图形界面中进行编码、调试和运行Hadop程序,也能通过Eclipse插件...

    hadoop 中文文档

    hadoop 中文文档 hadoop命令 hadoop入门

Global site tag (gtag.js) - Google Analytics