多行文本到单个地图

2023-11-21

我一直在尝试使用 Hadoop 将 N 行发送到单个映射。我不需要分割线。

我尝试使用 NLineInputFormat,但是它将 N 行文本从数据发送到每个映射器,一次一行[在第 N 行后放弃]。

我尝试设置该选项,只需要 N 行输入,一次将 1 行发送到每个地图:

    job.setInt("mapred.line.input.format.linespermap", 10);

我发现一个邮件列表建议我重写 LineRecordReader::next,但这并不是那么简单,因为内部数据成员都是私有的。

我刚刚检查了 NLineInputFormat 的源代码,它对 LineReader 进行了硬编码,因此覆盖不会有帮助。

另外,顺便说一句,我使用 Hadoop 0.18 是为了与 Amazon EC2 MapReduce 兼容。


你必须实现您自己的输入格式。然后您还可以定义自己的记录阅读器。

不幸的是你必须定义一个 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);
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多行文本到单个地图 的相关文章

随机推荐