Как заставить содержимое файла обрабатываться последовательно?

Я получил требование обрабатывать файл как есть, значит, содержимое файла должно быть обработано так, как оно отображается в файле.

Например: у меня есть файл размером 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 могут потребоваться небольшие изменения.

Другие вопросы по тегам