У меня есть 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.
Я попробовал следующее, но ни одно из них не сработало:
- Изменить размер блока:
- УвеличитьКоличество картографов: проблема все та же.Многие преобразователи заканчивают работу очень быстро, потому что нет входной строки, в то время как есть несколько преобразователей, которые почти полностью завершают ввод, что никогда не завершается.
- Преобразование моего SequenceFile в текстовый файл, затем используйте NLineInputFormat : я получилПереполнение размера кучи Java из-за того, что текстовый файл занимает слишком много оперативной памяти.Вот почему я хочу использовать SequenceFile, потому что он поддерживает сжатие.
Мой вопрос:
Как заставить каждый маппер получать одинаковое (или эквивалентное) количество входных строкфайла последовательности?