0

我需要按原样处理文件,这意味着文件内容应按文件中出现的方式处理。

例如:我有一个文件,大小为 700MB。我们如何确保文件将按其出现的方式进行处理,因为它取决于 Datanode 的可用性。在某些情况下,如果任何 Datanode 处理文件缓慢(低配置)。

解决此问题的一种方法是在文件中添加唯一的 id/key,但我们不想在文件中添加任何新内容。

有什么想法吗 :)

4

1 回答 1

2

FileInputFormat您可以通过编写自己的设置isSplitable为 false来保证只有一个映射器计算文件的内容。例如

public class WholeFileInputFormat extends FileInputFormat<Text, BytesWritable> {
        @Override
        protected boolean isSplitable(FileSystem fs, Path filename) {
            return false;
        }


        @Override
        public RecordReader<Text, BytesWritable> getRecordReader(
          InputSplit split, JobConf job, Reporter reporter) throws IOException {
            return new WholeFileRecordReader((FileSplit) split, job);
        }
}

有关如何做到这一点的更多示例,我喜欢推荐一个github 项目。根据您的 hadoop 版本,可能需要稍作更改。

于 2016-02-16T10:06:04.593 回答