Формат пользовательского ввода Hadoop с новым API - PullRequest
0 голосов
/ 13 февраля 2012

Я новичок в Hadoop и застрял в следующей проблеме. Я пытаюсь сопоставить осколок базы данных (пожалуйста, не спрашивайте, зачем мне это нужно и т. Д.) С картографом, затем выполните определенную операцию с этими данными, выведите результаты в редукторы и снова используйте эти выходные данные. выполнить вторую фазу карты / сократить работу с теми же данными, используя тот же формат шарда. Hadoop не предоставляет какой-либо метод ввода для отправки фрагмента базы данных. Вы можете отправлять построчно только с помощью LineInputFormat и LineRecordReader. NLineInputFormat также не помогает в этом случае. Мне нужно расширить классы FileInputFormat и RecordReader, чтобы написать свой собственный InputFormat. Мне посоветовали использовать LineRecordReader, поскольку базовый код уже имеет дело с FileSplits и всеми проблемами, связанными с разбиением файлов. Все, что мне нужно сделать сейчас, это переопределить метод nextKeyValue (), который я точно не знаю, как.

   for(int i=0;i<shard_size;i++){
           if(lineRecordReader.nextKeyValue()){                               lineValue.append(lineRecordReader.getCurrentValue().getBytes(),0,lineRecordReader.getCurrentValue().getLength());

}

Приведенный выше фрагмент кода написан, но почему-то не работает. Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 25 февраля 2012

То, что я сделал, это что-то вроде этого.Я написал свой собственный читатель записей, чтобы читать n строк за раз и отправлять их мапперам как входные данные

public boolean nextKeyValue() throws IOException, 

InterruptedException {

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 5; i++) {
        if (!lineRecordReader.nextKeyValue()) {
            return false;
        }
        lineKey = lineRecordReader.getCurrentKey();
        lineValue = lineRecordReader.getCurrentValue();
        sb.append(lineValue.toString());
        sb.append(eol);
    }
    lineValue.set(sb.toString());
    //System.out.println(lineValue.toString());

    return true;

    // throw new UnsupportedOperationException("Not supported yet.");
} 

как вы худеете

0 голосов
/ 13 февраля 2012

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

...