2013-05-21 2 views
0

Я написал простую задачу карты для hadoop 0.20.2, входной набор данных состоит из 44 файлов, каждый составляет около 3-5 МБ. Каждая строка любого файла имеет формат int,int. Формат ввода - это значение по умолчанию TextInputFormat, а работа картографа - синтаксический анализ ввода Text в целые числа.hadoop textinputformat читать только одну строку в файле

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

Кто-нибудь знает, в чем проблема, и где я могу найти решение?

Благодарим вас за продвижение.

Редактировать 1

Входные данные были получены с помощью другой карты-уменьшения задачи, выход которого формат TextOutputFormat<NullWritable, IntXInt>. Метод toString()IntXInt должен содержать строку int,int.

Edit 2

Мой картографа выглядит следующим образом

static class MyMapper extends MapReduceBas 
    implements Mapper<LongWritable, Text, IntWritable, IntWritable> { 

    public void map(LongWritable key, 
        Text value, 
        OutputCollector<IntWritable, IntWritable> output, 
        Reporter reporter) { 

    String[] s = value.toString().split(","); 
    IntXInt x = new IntXInt(s[0], s[1]); 
    output.collect(x.firstInt(), x.secondInt()); 
    } 
} 

Edit 3

Я только проверил, картограф на самом деле читает только 1 строку для каждого файла, НЕ весь файл как один Text значение.

+0

Вы должны взглянуть на ваш вывод? – smttsp

+0

@ greedybuddha: да. – user1906342

+0

@smttsp: выход - 44 записи. – user1906342

ответ

0

InputFormat определяет, как читать данные из файла в экземплярах Mapper. По умолчанию TextInputFormat читает строки текстовых файлов. Ключ, который он испускает для каждой записи, - это смещение байта строки read (как LongWritable), а значение - это содержимое строки до завершающего символа «\ n» (в качестве объекта Text). Если у вас есть несколько -line записывает каждый, разделенный символом $, вы должны написать свой собственный InputFormat, который вместо этого анализирует файлы на записи, разделенные на этом символе.

+0

Я отредактировал мой вопрос, чтобы быть более конкретным. – user1906342

0

Я подозреваю, что ваш картограф получает весь текст в качестве ввода и печатает вывод. Не могли бы вы продемонстрировать отклонение класса Mapper и преобразование функции mapper? т.е.

static class MyMapper extends Mapper <LongWritable,Text,Text,Text>{ 
    public void map (LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
     //do your mapping here 

    } 
} 

Интересно, есть ли что-то другое в этой строке

+0

Я отредактировал свой вопрос. И я использую старый API. – user1906342

Смежные вопросы