阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

98次阅读
没有评论

共计 3014 个字符,预计需要花费 8 分钟才能阅读完成。

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 数组类型,然后在进行序列化。

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

搭建 Hadoop 环境(在 Winodws 环境下用虚拟机虚拟两个 Ubuntu 系统进行搭建)http://www.linuxidc.com/Linux/2011-12/48894.htm

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

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);
 
 }
}

更多 Hadoop 相关信息见 Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计3014字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中