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组件和工具中设置相应的编码选项。在实际操作中,可能需要结合日志信息和源码调试来定位问题。同时,建立良好的编码规范,统一数据的编码格式...
`Writable`接口是Hadoop中数据序列化的基础,它定义了两个关键方法:`write()`和`readFields()`。`write()`方法用于将对象的数据写入`DataOutput`流,而`readFields()`则从`DataInput`流中读取数据,实现反序列化。...
### Hadoop的Shell接口和Java接口知识点解析 #### 一、Shell接口操作 **1. 文件上传** - **步骤**: 使用`hadoop fs -put <from> <to>`命令进行文件上传。 - **注意事项**: - 需要确保文件已存在于本地文件系统...
WritableComparable 接口继承自 Writable 接口,并添加了 compareTo() 方法。compareTo() 方法用于比较两个数据对象的大小。 ```java public interface WritableComparable<T> { public void write(DataOutput out...
1. **编写DFSOperator.java**:在Eclipse中打开DFSOperator.java文件,编写如下示例代码,用于演示如何向Hadoop的分布式文件系统(HDFS)写入数据。 ```java import java.io.IOException; import org.apache.hadoop...
利用hadoop-streaming框架运行python脚本指令
7. **编程接口**:Hadoop提供了Java API来编写MapReduce程序,但也有如Hadoop Streaming这样的接口,允许使用其他语言(如Python、Perl)编写Mapper和Reducer。 8. **数据处理范式**:MapReduce遵循“批处理”处理...
在这个“单词统计”案例中,我们需要编写两个类:一个继承自`Mapper`,负责分词和生成中间结果;另一个继承自`Reducer`,负责合并和总计单词的出现次数。此外,还需要一个主程序来配置和提交作业。 **标签相关性**...
在IT行业中,Hadoop是一个...确保它们正确配置并可被系统找到,可以避免许多与环境配置相关的错误,使得开发者能够专注于Hadoop应用的编写和测试。了解和掌握这些基础知识,对于在Windows上高效地使用Hadoop至关重要。
8. **编程接口**:对于开发人员,文档会讲解如何编写MapReduce程序,包括Java API的使用以及Hadoop Streaming,允许使用其他语言(如Python或Perl)编写Map和Reduce函数。 9. **性能优化**:文档还会涵盖如何优化...
【标题】"实战hadoop中的源码"涵盖了在大数据处理领域深入理解并应用Apache Hadoop的核心技术。Hadoop是开源的分布式计算框架,它允许在大规模集群上存储和处理海量数据。通过研究Hadoop的源码,开发者可以深入了解...
由于篇幅限制,这里将不会涵盖所有给出的信息,而是重点介绍Hadoop的核心组件和概念,以及它们如何从Google的相应技术中继承而来。 Hadoop是Apache的一个开源分布式计算框架,它为在大数据集上进行分布式处理提供了...
实现Writable接口的类可以将对象数据编码成适合网络传输的格式,并能够从这种格式中解码。 Hadoop的MapReduce实现了高度的可扩展性和容错能力。其设计包括了任务的调度、分配、监控和容错机制。HDFS作为Hadoop项目...
在IT行业中,Hadoop是一个广泛使用的开源框架,主要用于大数据处理和分布式存储。Hadoop 2.7.3是这个框架的一个稳定版本,它包含了多个改进和优化,以提高性能和稳定性。在这个版本中,Winutils.exe和hadoop.dll是两...
Hadoop2.7.1是Hadoop发展中的一个重要版本,它在前一个版本的基础上进行了一系列的优化和改进,增强了系统的稳定性和性能。这个压缩包文件包含的是Hadoop2.7.1的中文文档,对于学习和理解Hadoop的运作机制、配置以及...
为了在Windows上运行Hadoop,你需要正确配置HADOOP_HOME环境变量,并将winutils.exe和hadoop.dll添加到PATH环境变量中。同时,还需要配置Hadoop的相关配置文件,如core-site.xml和hdfs-site.xml,以指定HDFS的存储...
在Hadoop中,ObjectWritable是一个关键类,它封装了各种Java基本类型、字符串、枚举、空值以及Writable子类,适应了字段需要使用多种类型的需求。在RPC过程中,序列化和反序列化参数,或者在一个SequenceFile的值中...
在Hadoop生态系统中,Windows平台上的开发和运行通常比Linux环境更为复杂,因为Hadoop主要设计为在Linux上运行。然而,随着Hadoop的普及,开发者们也找到了在Windows上搭建和测试Hadoop环境的方法。标题提到的"hadop...
在描述中,虽然没有具体的信息,但我们可以推断博主HeiPark分享了一篇关于如何使用Python编写监控脚本来检查Hadoop组件状态的文章。通过博文链接(已提供但无法直接访问),读者可以了解到详细的步骤和代码实现。 ...