Несколько подходов, некоторые грязнее другие:
правильный путь
Вы, возможно, придется определить свой собственный 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-строчная запись.
Спасибо за ваш ответ, я думал о втором подходе вы предложили, но не то, что также пронизан с той же проблемой? Как я могу читать четыре строки в момент добавления их вместе и создания одной строки? – Gitmo
Вы могли бы написать что-то в Perl или Python, которые могли бы сделать трюк. Вот что я имел в виду. –
Используйте [SequenceFile] (http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/io/SequenceFile.html) с сжатием для лучшей производительности, если предварительная обработка файла выполнена , –