Как заставить содержимое файла обрабатываться последовательно?
Я получил требование обрабатывать файл как есть, значит, содержимое файла должно быть обработано так, как оно отображается в файле.
Например: у меня есть файл размером 700 МБ. Как мы можем убедиться, что файл будет обработан так, как он выглядит, поскольку это зависит от доступности Datanode. В некоторых случаях, если какой-либо из Datanode обрабатывает файл медленно (низкая конфигурация).
Один из способов исправить это, добавить уникальный идентификатор / ключ в файл, но мы не хотим добавлять что-либо новое в файл.
Какие-нибудь мысли:)
1 ответ
Вы можете гарантировать, что только один маппер вычислит содержимое файла, написав свой собственный FileInputFormat
который устанавливает isSplitable
ложно. Например
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 могут потребоваться небольшие изменения.