Как рассчитываются местоположения на входных разделениях
В "Hadoop - Полное руководство" говорится ->
Клиент, выполняющий задание, вычисляет разбиения для задания, вызывая getSplits(), а затем отправляет их в отслеживатель заданий, который использует свои места хранения для планирования задач сопоставления для обработки их в средствах отслеживания заданий.
public abstract class InputSplit {
public abstract long getLength() throws IOException, InterruptedException;
public abstract String[] getLocations() throws IOException,
}
Мы знаем, что getLocations() возвращает массив имен хостов.
Вопрос 1: Как клиент узнает, какие имена хостов возвращать. Разве это не работа трекера?
Вопрос 2: могут ли два разных объекта InputSplit возвращать одно и то же имя хоста? Как определяются имена хостов? Кто так делает?
Я чувствую, что клиент связывается с namenode, чтобы получить все имена хостов файла (включая реплики), выполняет некоторые математические операции, чтобы получить местоположение, установленное для каждого входного разделения. Это правда?
1 ответ
Q Как клиент знает, какие имена хостов возвращать. Разве это не работа трекера?
A. Разделение ввода создается форматом ввода, используемым в конфигурации задания. В процессе создания логического набора разделений он обращается к узлу имени, запрашивая расположение блоков, которые формируют разделение. Ответственность за отслеживание заданий состоит в том, чтобы убедиться, что он пытается запустить задачу сопоставления с учетом локальности данных на основе информации в InputSplit.
Вопрос 2: могут ли два разных объекта InputSplit возвращать одно и то же имя хоста? Как определяются имена хостов? Кто так делает?
А. Определенно. У каждого входного разбиения есть своя формула для расчета разбиений. Имейте в виду, что входное разбиение не обязательно должно быть одинакового размера блока.
Надеюсь это поможет.