Разработка функциональности функций «маппер» и «редуктор» для hadoop? - PullRequest
0 голосов
/ 26 января 2019

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

Вход в мой картограф - это подключение большого ориентированного графа.Это входные данные из двух столбцов, где каждая строка является отдельным соединением ребер.Первый столбец - это идентификатор начального узла, а второй столбец - это идентификатор конечного узла каждого ребра.Я пытаюсь вывести число соседей для каждого идентификатора начального узла в текстовый файл с двумя столбцами, где первый столбец отсортирован в порядке увеличения идентификатора начального узла.

Мои вопросы:

(1) Вход уже настроен так, что каждая строка представляет собой пару ключ-значение, где ключ - это идентификатор начального узла, а значение - это идентификатор конечного узла.Будет ли картограф просто читать в каждой строке и записывать это?Это кажется излишним.

(2) Происходит ли сортировка между картографом и редуктором или же сортировка может быть выполнена с помощью самого редуктора?

1 Ответ

0 голосов
/ 30 января 2019

Если мое понимание верно, вы хотите посчитать, сколько различных значений будет иметь ключ.

Простое излучение пар «ключ-значение» в преобразователе, а затем подсчет различных значений для каждого ключа (например, путем добавления их в набор и вывода размера набора в качестве значения редуктора) в редукторе.это один из способов сделать это, но, как вы говорите, немного излишним

Как правило, вы хотите уменьшить сетевой трафик, поэтому вы можете захотеть сделать еще несколько вычислений перед перетасовкой (да, это делает Hadoop).

Два простых способа повышения эффективности:

1) Используйте сумматор, который будет выводить наборы значений, а не отдельные значения.Таким образом, вы будете отправлять меньше пар ключ-значение в редукторы, а также некоторые значения могут быть пропущены, поскольку они уже были в локальном наборе значений того же ключа.

2) Использовать агрегацию на стороне карты.Вместо непосредственного вывода входных пар ключ-значение сохраните их локально в преобразователе (в памяти) в структуре данных (например, hashmap или multimap).Ключ может быть ключом ввода карты, а значение может быть набором значений, которые до сих пор рассматривались для этого ключа.Каждый тип вы встречаете новое значение для этого ключа, вы добавляете его к этой структуре.В конце каждого преобразователя вы генерируете эту структуру (или конвертируете значения в массив) из метода close () (если я помню имя).

Вы можете искать оба метода, используя ключевые слова "объединитель" и "агрегация на стороне карты".

Глобальная сортировка по ключу немного сложнее.Опять же, два основных варианта, но они не очень хороши: 1) вы используете один редуктор, но затем вы ничего не получите от параллелизма, 2) вы используете разделитель общего порядка, который требует дополнительного кодирования.

Кроме этого, вы можете перейти к Spark для более интуитивного и эффективного решения.

...