Как спроектировать каждый маппер для обработки каждой строки SequenceFile? - PullRequest
0 голосов
/ 12 июня 2018

У меня есть SequenceFile, который сгенерирован из предыдущего задания MapReduce.Этот SequenceFile имеет N строк, каждая строка представляет собой пару ключ и значение , оба являются текстовыми объектами.

line1: key1 \t value1

line2: key2 \t value2

line3: key3 \t value3

...

lineN: keyN \t valueN

Я использую этот SequenceFile в качестве ввода нового MapReduceработа.В этом новом задании MapReduce я хочу, чтобы каждый преобразователь обрабатывал несколько строк, например, 2 строки, этого SequenceFile, например.

line1, line2 goes to mapper1

line3, line4 goes to mapper2

.....

line(N-1), lineN goes to mapperN

Я не мог использовать NLineInputFormat , поскольку он используется толькодля текстового файла.Итак, я использовал SequenceFileInputFormat и позволил Hadoop разделить данные на 40 МБ каждый (мой размер блока = 40 МБ).Даже каждый разделитель имеет одинаковый размер, существуют средства отображения, которые получают гораздо больше данных (т. Е. Строк), чем другие.Например, 5 строк идут в mapper1, в то время как только 1 строка идет в mapper2.Таким образом, mapper2 завершается очень быстро, в то время как mapper1 занимает так много времени, и много раз он терпит неудачу из-за переполнения размера кучи Java.

enter image description here

Я попробовал следующее, но ни одно из них не сработало:

  • Изменить размер блока:
  • УвеличитьКоличество картографов: проблема все та же.Многие преобразователи заканчивают работу очень быстро, потому что нет входной строки, в то время как есть несколько преобразователей, которые почти полностью завершают ввод, что никогда не завершается.
  • Преобразование моего SequenceFile в текстовый файл, затем используйте NLineInputFormat : я получилПереполнение размера кучи Java из-за того, что текстовый файл занимает слишком много оперативной памяти.Вот почему я хочу использовать SequenceFile, потому что он поддерживает сжатие.

Мой вопрос:

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

1 Ответ

0 голосов
/ 13 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...