`
cocoIT
  • 浏览: 50977 次
  • 性别: 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中文乱码问题

    解决Hadoop中文乱码问题的关键在于识别和匹配数据的正确编码,并在Hadoop组件和工具中设置相应的编码选项。在实际操作中,可能需要结合日志信息和源码调试来定位问题。同时,建立良好的编码规范,统一数据的编码格式...

    Hadoop源代码分析(三)

    `Writable`接口是Hadoop中数据序列化的基础,它定义了两个关键方法:`write()`和`readFields()`。`write()`方法用于将对象的数据写入`DataOutput`流,而`readFields()`则从`DataInput`流中读取数据,实现反序列化。...

    Hadoop的shell接口和java接口

    ### Hadoop的Shell接口和Java接口知识点解析 #### 一、Shell接口操作 **1. 文件上传** - **步骤**: 使用`hadoop fs -put &lt;from&gt; &lt;to&gt;`命令进行文件上传。 - **注意事项**: - 需要确保文件已存在于本地文件系统...

    大数据第二次作业1

    WritableComparable 接口继承自 Writable 接口,并添加了 compareTo() 方法。compareTo() 方法用于比较两个数据对象的大小。 ```java public interface WritableComparable&lt;T&gt; { public void write(DataOutput out...

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

    1. **编写DFSOperator.java**:在Eclipse中打开DFSOperator.java文件,编写如下示例代码,用于演示如何向Hadoop的分布式文件系统(HDFS)写入数据。 ```java import java.io.IOException; import org.apache.hadoop...

    hadoop运行python编写的mapreduce程序

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

    hadoop几个实例

    7. **编程接口**:Hadoop提供了Java API来编写MapReduce程序,但也有如Hadoop Streaming这样的接口,允许使用其他语言(如Python、Perl)编写Mapper和Reducer。 8. **数据处理范式**:MapReduce遵循“批处理”处理...

    Hadoop中单词统计案例运行的代码

    在这个“单词统计”案例中,我们需要编写两个类:一个继承自`Mapper`,负责分词和生成中间结果;另一个继承自`Reducer`,负责合并和总计单词的出现次数。此外,还需要一个主程序来配置和提交作业。 **标签相关性**...

    hadoop-3.1.1 bin目录文件-含hadoop.dll、winutils

    在IT行业中,Hadoop是一个...确保它们正确配置并可被系统找到,可以避免许多与环境配置相关的错误,使得开发者能够专注于Hadoop应用的编写和测试。了解和掌握这些基础知识,对于在Windows上高效地使用Hadoop至关重要。

    Hadoop 2.7.1 中文文档

    8. **编程接口**:对于开发人员,文档会讲解如何编写MapReduce程序,包括Java API的使用以及Hadoop Streaming,允许使用其他语言(如Python或Perl)编写Map和Reduce函数。 9. **性能优化**:文档还会涵盖如何优化...

    实战hadoop中的源码

    【标题】"实战hadoop中的源码"涵盖了在大数据处理领域深入理解并应用Apache Hadoop的核心技术。Hadoop是开源的分布式计算框架,它允许在大规模集群上存储和处理海量数据。通过研究Hadoop的源码,开发者可以深入了解...

    Hadoop 源代码分析 [完整版]

    由于篇幅限制,这里将不会涵盖所有给出的信息,而是重点介绍Hadoop的核心组件和概念,以及它们如何从Google的相应技术中继承而来。 Hadoop是Apache的一个开源分布式计算框架,它为在大数据集上进行分布式处理提供了...

    Hadoop源码分析(完整版)

    实现Writable接口的类可以将对象数据编码成适合网络传输的格式,并能够从这种格式中解码。 Hadoop的MapReduce实现了高度的可扩展性和容错能力。其设计包括了任务的调度、分配、监控和容错机制。HDFS作为Hadoop项目...

    hadoop2.7.3 Winutils.exe hadoop.dll

    在IT行业中,Hadoop是一个广泛使用的开源框架,主要用于大数据处理和分布式存储。Hadoop 2.7.3是这个框架的一个稳定版本,它包含了多个改进和优化,以提高性能和稳定性。在这个版本中,Winutils.exe和hadoop.dll是两...

    Hadoop2.7.1中文文档

    Hadoop2.7.1是Hadoop发展中的一个重要版本,它在前一个版本的基础上进行了一系列的优化和改进,增强了系统的稳定性和性能。这个压缩包文件包含的是Hadoop2.7.1的中文文档,对于学习和理解Hadoop的运作机制、配置以及...

    hadoop.dll & winutils.exe For hadoop-2.7.1

    为了在Windows上运行Hadoop,你需要正确配置HADOOP_HOME环境变量,并将winutils.exe和hadoop.dll添加到PATH环境变量中。同时,还需要配置Hadoop的相关配置文件,如core-site.xml和hdfs-site.xml,以指定HDFS的存储...

    HadoopCommon包分析1

    在Hadoop中,ObjectWritable是一个关键类,它封装了各种Java基本类型、字符串、枚举、空值以及Writable子类,适应了字段需要使用多种类型的需求。在RPC过程中,序列化和反序列化参数,或者在一个SequenceFile的值中...

    hadoop2.6.5中winutils+hadoop

    在Hadoop生态系统中,Windows平台上的开发和运行通常比Linux环境更为复杂,因为Hadoop主要设计为在Linux上运行。然而,随着Hadoop的普及,开发者们也找到了在Windows上搭建和测试Hadoop环境的方法。标题提到的"hadop...

    用python编写nagios hadoop监控脚本

    在描述中,虽然没有具体的信息,但我们可以推断博主HeiPark分享了一篇关于如何使用Python编写监控脚本来检查Hadoop组件状态的文章。通过博文链接(已提供但无法直接访问),读者可以了解到详细的步骤和代码实现。 ...

Global site tag (gtag.js) - Google Analytics