【问题标题】:How to force file content to be processed sequenctially?如何强制按顺序处理文件内容?
【发布时间】:2016-02-16 08:58:47
【问题描述】:
我需要按原样处理文件,这意味着文件内容应按文件中出现的方式处理。
例如:我有一个文件,大小为 700MB。我们如何确保文件将按其出现的方式进行处理,因为它取决于 Datanode 的可用性。在某些情况下,如果任何 Datanode 处理文件缓慢(低配置)。
解决此问题的一种方法是在文件中添加唯一的 id/key,但我们不想在文件中添加任何新内容。
任何想法:)
【问题讨论】:
标签:
hadoop
mapreduce
hive
hdfs
bigsql
【解决方案1】:
您可以通过编写自己的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 project。根据您的 hadoop 版本,可能需要稍作更改。