一、《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));
}
}
}
相关推荐
当键是自定义的 `Writable` 类型时,需要自定义 `WritableComparator`。这允许我们为自定义键类型提供比较规则。创建此类时,需要指定键的类类型,并在 `compare` 方法中实现具体的比较逻辑。 在实现自定义排序和...
- **数据类型**:为了支持序列化操作,键和值的类必须实现`Writable`接口;同时,键还必须实现`WritableComparable`接口以便进行排序操作。 ##### 2. 实际案例:WordCount WordCount是Hadoop提供的经典示例之一,...
4. **数据类型和I/O**:讨论Hadoop中的基本数据类型,如Writable接口,以及自定义数据类型的实现。此外,还涵盖输入格式(InputFormat)和输出格式(OutputFormat)的定制。 5. **优化技巧**:探讨如何提高...
实现定制的Writable类型 序列化框架 Avro 依据文件的数据结构 写入SequenceFile MapFile 第5章 MapReduce应用开发 配置API 合并多个源文件 可变的扩展 配置开发环境 配置管理 辅助类...
实现定制的Writable类型 序列化框架 Avro 依据文件的数据结构 写入SequenceFile MapFile 第5章 MapReduce应用开发 配置API 合并多个源文件 可变的扩展 配置开发环境 配置管理 辅助类GenericOptionsParser,Tool和...
- **序列化需求**:为了支持MapReduce和HDFS组件间的通信,Hadoop设计了一套定制化的序列化机制,而不是使用Java内置的序列化机制。 - **Writable接口**:`org.apache.hadoop.io`包下的类通常实现了`Writable`接口...
1. **io**: 包含了数据编码和解码的实现,比如Writable接口,使得数据能在网络中高效传输。所有可序列化的对象,如MyWritable示例,都实现了这个接口。 2. **ipc**: 提供了一个简单的远程过程调用(RPC)框架,这是...
例如,`MyWritable`类实现了`Writable`接口,通过`write`和`readFields`方法来编写和读取特定类型的数据,如整数和长整数,这确保了数据在网络传输过程中的高效性和安全性。 综上所述,Hadoop通过对Google技术栈的...
- 用toString()方法定制输出格式,方便后续处理。 - 若作为key,还需实现Comparable接口,因MapReduce的shuffle过程会排序key。 8. **FileInputFormat切片机制** - 在job提交过程中,FileInputFormat会根据输入...
`DBWritable`接口类似于Hadoop中常见的`Writable`接口,但针对数据库操作进行了定制。该接口定义了`write`和`readFields`方法,用于将对象写入数据库以及从数据库读取对象。这两个方法的具体实现依赖于特定的数据...
- `committer`:定制与Task生命周期相关的特殊处理,如提交任务。 - `outputFormat`:定义任务的输出格式。 - `spilledRecordsCounter`, `taskProgress`, `counters`等:统计和监控任务的运行状态。 2. **核心...
《深入剖析Hadoop源代码:Java技术在大数据处理中的应用》 Hadoop,作为开源大数据处理框架...通过学习Hadoop的源代码,开发者可以更好地优化和定制自己的大数据处理解决方案,从而在Java世界中拓展更广阔的应用领域。