Несколько подходов, некоторые грязнее других:
Правильный путь
Возможно, вам придется определить свой собственный RecordReader , InputSplit и InputFormat .В зависимости от того, что именно вы пытаетесь сделать, вы сможете повторно использовать некоторые из уже существующих из трех приведенных выше.Вам, вероятно, придется написать свой собственный RecordReader, чтобы определить пару ключ / значение, и вам, вероятно, придется написать свой собственный InputSplit, чтобы помочь определить границу.
Другой правильный путь, который можетне возможно
Вышеуказанная задача довольно сложна.Есть ли у вас контроль над вашим набором данных?Можете ли вы каким-то образом предварительно обработать его (во время его поступления или в состоянии покоя)?Если это так, то вам настоятельно рекомендуется попытаться преобразовать ваш набор данных в нечто, что будет легче считывать из коробки в Hadoop.
Что-то вроде:
ALine1
ALine2 ALine1;Aline2;Aline3;Aline4
ALine3
ALine4 ->
BLine1
BLine2 BLine1;Bline2;Bline3;Bline4;
BLine3
BLine4
Вниз и грязный
Есть ли у вас контроль над размерами файлов ваших данных?Если вы вручную разбиваете данные на границе блоков, вы можете заставить Hadoop не заботиться о разделении записей.Например, если размер вашего блока составляет 64 МБ, запишите свои файлы в виде фрагментов по 60 МБ.
Не беспокоясь о разбиениях ввода, вы можете сделать что-то грязное: в вашей функции карты добавьте новую пару ключ / значение всписок объектов.Если объект списка содержит 4 элемента, выполните обработку, отправьте что-либо, затем очистите список.В противном случае ничего не испускайте и двигайтесь дальше, ничего не делая.
Причина, по которой вам нужно разделить данные вручную, заключается в том, что вам не гарантируется, что целая запись из 4 строк будет переданата же задача на карте.