Ты прав.Если вы смотрите на класс FileInputFormat
и метод getSplits()
.Он ищет блокировки:
BlockLocation[] blkLocations = fs.getFileBlockLocations(file, 0, length);
Это подразумевает запрос FileSystem.Это происходит внутри JobClient
, результаты записываются в SequenceFile (на самом деле это просто необработанный байтовый код).Таким образом, Jobtracker читает этот файл позже во время инициализации задания и в значительной степени просто назначает задачу входному разделу.
НО распределение данных - это задание NameNodes.
На ваш вопрос сейчас: Обычно вы расширяетесь от FileInputFormat
.Таким образом, вы будете вынуждены вернуть список InputSplit
, и на этапе инициализации для такой вещи необходимо указать местоположение разбиения.Например, FileSplit
:
public FileSplit(Path file, long start, long length, String[] hosts)
Таким образом, на самом деле вы сами не реализуете локальность данных, а просто указываете, на каком хосте можно найти разделение.Это легко запрашивается с помощью интерфейса FileSystem
.