你必须实现您自己的输入格式。然后您还可以定义自己的记录阅读器。
不幸的是你必须定义一个 getSplits() 方法。在我看来,这比实现记录读取器更困难:此方法必须实现一个逻辑来对输入数据进行分块。
请参阅“Hadoop - 权威指南”(我永远推荐的一本好书!)的以下摘录:
界面如下:
public interface InputFormat<K, V> {
InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
RecordReader<K, V> getRecordReader(InputSplit split,
JobConf job,
Reporter reporter) throws IOException;
}
JobClient调用getSplits()方法,传递所需数量的map任务
作为 numSplits 参数。这个数字被视为一个提示,因为 InputFormat 实现了
mentations 可以自由地将不同数量的分割返回到指定的数量
分割数。计算出分割后,客户端将它们发送到 jobtracker,jobtracker
使用它们的存储位置来安排映射任务以在任务跟踪器上处理它们。
在tasktracker上,map任务将分割传递给getRecordReader()方法
InputFormat 获取该拆分的 RecordReader。 RecordReader 只不过是
记录上的迭代器,map 任务使用它来生成记录键值对,
它传递给地图函数。代码片段(基于MapRunner中的代码)
说明了这个想法:
K key = reader.createKey();
V value = reader.createValue();
while (reader.next(key, value)) {
mapper.map(key, value, output, reporter);
}