我需要按原样处理文件,这意味着文件内容应按文件中出现的方式处理。
例如:我有一个文件,大小为 700MB。我们如何确保文件将按其出现的方式进行处理,因为它取决于 Datanode 的可用性。在某些情况下,如果任何 Datanode 处理文件缓慢(低配置)。
解决此问题的一种方法是在文件中添加唯一的 id/key,但我们不想在文件中添加任何新内容。
有什么想法吗 :)
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 版本,可能需要稍作更改。