MapReduce framework có một cách định nghĩa cặp khóa key/value tuần tự để có thể gửi qua mạng, và chỉ các lớp hỗ trợ kiểu tuần tự mới được dùng làm giá trị của key và value.
Cụ thể hơn, các lớp implement giao diện Writable có thể làm value, và các lớp implement giao diện WritableComparable<T> có thể làm cả key và value. Lưu ý rằng giao diện WritableComparable<T> là một sự kết hợp của Writable và giao diện java.lang.Comparable<T> dùng cho việc so sánh các khóa bởi vì chúng sẽ được sắp xếp ở giai đoạn reduce, các giá trị đơn thì không cần.
Hadoop đi cung cấp một số lớp được định nghĩa trước đã implement
WritableComparable, bao gồm các lớp bao cho tất cả các loại dữ liệu cơ bản như trong Bảng 1.1.
Bảng 1.1 Danh sách các kiểu dữ liệu cơ bản của Hadoop
Tên lớp Miêu tả
BooleanWritable Lớp bao (wapper) của biến kiểu Boolean chuẩn
ByteWritable Lớp bao của biến kiểu byte
DoubleWritable Lớp bao của biến kiểu double
FloatWritable Lớp bao của biến kiểu float
IntWritable Lớp bao của biến kiểu int
LongWritable Lớp bao của biến kiểu long
Text Lớp bao của biến kiểu văn bản định dạng UTF-8
NullWritable Lớp để giữ chỗ khi mà key hoặc value không cần thiết
Chúng ta cũng có thể tùy chỉnh một kiểu dữ liệu bằng cách implement
Writable (hay WritableComparable<T>). Ví dụ sau minh họa lớp biểu diễn các cạnh (Edge) trong đồ thị:
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.WritableComparable;
public class Edge implements WritableComparable<Edge> { private String departureNode; //Node khoi hanh
private String arrivalNode; //Node den
public String getDepartureNode(){
return departureNode; }
public void readFields(DataInput in) throws IOException { departureNode = in.readUTF();
arrivalNode = in.readUTF(); } @Override
public void write(DataOutput out) throws IOException { out.writeUTF(departureNode);
out.writeUTF(arrivalNode); }
@Override
public int compareTo(Edge o) {
return (departureNode.compareTo (o.departureNode)!= 0)?
departureNode.compareTo(departureNode):
arrivalNode.compareTo(o.arrivalNode);
} }
Lớp Edge thực hiện hai phương thức readFields() và write() của giao diện Writeable. Chúng làm việc với lớp DataInput và DataOutput
để tuần tự nội dung của các lớp. Thực hiện phương pháp compareTo() cho interface Comparable.
Với kiểu dữ liệu được định nghĩa tại giao diện, chúng ta có thể tiến hành giai đoạn đầu tiên của xử lý luồng dữ liệu như trong Hình 1.11–mapper.