`
ghost_face
  • 浏览: 54396 次
社区版块
存档分类
最新评论

MapReduce定制Writable类型

 
阅读更多

一、《Hadoop权威指南》一书中的示例,测试了一下。

定制的Writable类型:TextPair

功能:存储一对Text对象。代码如下:

package testWritable;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;

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

public class TextPair implements WritableComparable<TextPair> {
    private Text first;
    private Text second;
    public TextPair() {
        set(new Text(), new Text());
    }

    public TextPair(String first, String second) {
        set(new Text(first), new Text(second));
    }

    public TextPair(Text first, Text second) {
        set(first, second);
    }

    private void set(Text first, Text second) {
        this.first = first;
        this.second = second;
    }

    @Override
    public int compareTo(TextPair o) {
        int i = first.compareTo(o.first);
        if (i == 0) {
            return second.compareTo(o.second);
        }
        return i;
    }

    @Override
    public void write(DataOutput dataOutput) throws IOException {
        first.write(dataOutput);
        second.write(dataOutput);
    }

    @Override
    public void readFields(DataInput dataInput) throws IOException {
        first.readFields(dataInput);
        second.readFields(dataInput);
    }

    @Override
    public String toString() {
        return first + "\t" + second;
    }
}

 TextPair类,继承了WritableComparable,分别实现三个方法,compareTo, write,readFields。

write方法:实现序列化; readFields方法:实现反序列化。

当TextPair被用作MapReduce中的键时,需要将数据流反序列化为对象,再调用compareTo进行比较;也可以直接比较序列化得出结果(需要自已定义comparator,继承自WritableComparator,具体参考《Hadoop权威指南》Page.99)

二、定制的Writable:Record (成员变量有int,String类型)

class Record implements WritableComparable<Record> {
        private int id;
        private String name;

        Record() {
            id = -1;
            name = "null";
        }
        @Override
        public int compareTo(Record o) {
            if (this.id > o.id)
                return 1;
            else if (this.id < o.id)
                return -1;
            else
                return 0;
        }

        @Override
        public void write(DataOutput dataOutput) throws IOException {
            dataOutput.writeInt(id);
            dataOutput.writeUTF(name);
        }

        @Override
        public void readFields(DataInput dataInput) throws IOException {
            id = dataInput.readInt();
            name = dataInput.readUTF();
        }

        @Override
        public String toString() {
            return id + "," + name ;
        }
    }

 三、使用定制的Writable时需要注意的地方(如下面的代码所示)

    static class Reduce extends Reducer<IntWritable, Record, Record, IntWritable> {
        @Override
        protected void reduce(IntWritable key, Iterable<Record> values, Context context) throws IOException, InterruptedException {
            ArrayList<Record> array = new ArrayList<Record>();
            for (Record rec : values) {
                if (一个条件) {
                    //使用了values的迭代,不能够直接array.add(),否则array里面的对象都是初始值,得不到修改后的对象值,因此一定要重新创建一个新的对象,很重要
                    Record record = new Record();
                    record.id = rec.id;
                    record.name = rec.name;
                    array.add(record);
                }
            }
            for (Record rec : array) {
                ...其他操作
                context.write(rec, new IntWritable(1));
            }
        }
    }

  

1
2
分享到:
评论

相关推荐

    MapReduce2中自定义排序分组

    当键是自定义的 `Writable` 类型时,需要自定义 `WritableComparator`。这允许我们为自定义键类型提供比较规则。创建此类时,需要指定键的类类型,并在 `compare` 方法中实现具体的比较逻辑。 在实现自定义排序和...

    MapReduce源码分析完整版

    - **数据类型**:为了支持序列化操作,键和值的类必须实现`Writable`接口;同时,键还必须实现`WritableComparable`接口以便进行排序操作。 ##### 2. 实际案例:WordCount WordCount是Hadoop提供的经典示例之一,...

    Hadoop MapReduce Cookbook

    4. **数据类型和I/O**:讨论Hadoop中的基本数据类型,如Writable接口,以及自定义数据类型的实现。此外,还涵盖输入格式(InputFormat)和输出格式(OutputFormat)的定制。 5. **优化技巧**:探讨如何提高...

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

     实现定制的Writable类型  序列化框架  Avro  依据文件的数据结构  写入SequenceFile  MapFile 第5章 MapReduce应用开发  配置API  合并多个源文件  可变的扩展  配置开发环境  配置管理  辅助类...

    Hadoop权威指南(中文版)2015上传.rar

    实现定制的Writable类型 序列化框架 Avro 依据文件的数据结构 写入SequenceFile MapFile 第5章 MapReduce应用开发 配置API 合并多个源文件 可变的扩展 配置开发环境 配置管理 辅助类GenericOptionsParser,Tool和...

    hadoop代码分析

    - **序列化需求**:为了支持MapReduce和HDFS组件间的通信,Hadoop设计了一套定制化的序列化机制,而不是使用Java内置的序列化机制。 - **Writable接口**:`org.apache.hadoop.io`包下的类通常实现了`Writable`接口...

    Hadoop源代码分析(完整版).doc

    1. **io**: 包含了数据编码和解码的实现,比如Writable接口,使得数据能在网络中高效传输。所有可序列化的对象,如MyWritable示例,都实现了这个接口。 2. **ipc**: 提供了一个简单的远程过程调用(RPC)框架,这是...

    Hadoop源代码分析(完整版)

    例如,`MyWritable`类实现了`Writable`接口,通过`write`和`readFields`方法来编写和读取特定类型的数据,如整数和长整数,这确保了数据在网络传输过程中的高效性和安全性。 综上所述,Hadoop通过对Google技术栈的...

    最新Hadoop的面试题总结

    - 用toString()方法定制输出格式,方便后续处理。 - 若作为key,还需实现Comparable接口,因MapReduce的shuffle过程会排序key。 8. **FileInputFormat切片机制** - 在job提交过程中,FileInputFormat会根据输入...

    hadoop开发者第三期

    `DBWritable`接口类似于Hadoop中常见的`Writable`接口,但针对数据库操作进行了定制。该接口定义了`write`和`readFields`方法,用于将对象写入数据库以及从数据库读取对象。这两个方法的具体实现依赖于特定的数据...

    Hadoop源代码分析(类Task)

    - `committer`:定制与Task生命周期相关的特殊处理,如提交任务。 - `outputFormat`:定义任务的输出格式。 - `spilledRecordsCounter`, `taskProgress`, `counters`等:统计和监控任务的运行状态。 2. **核心...

    Software-Architecture-Project:分析hadoop的源代码

    《深入剖析Hadoop源代码:Java技术在大数据处理中的应用》 Hadoop,作为开源大数据处理框架...通过学习Hadoop的源代码,开发者可以更好地优化和定制自己的大数据处理解决方案,从而在Java世界中拓展更广阔的应用领域。

Global site tag (gtag.js) - Google Analytics