Получить уникальный номер строки из входного файла в MapReduce mapper

Я скопировал один файл с 10 миллионами строк в HDFS. Необходимо обработать строку с номером от 5000 до 500000 в маппере. Как мне это сделать?

Я попытался переопределить метод run() в картографе и попытался использовать счетчик. Но когда файл разделен и работает несколько преобразователей, конечно же, работает несколько счетчиков. Так что это не помогает. Вставка кода ниже.

@Override
public void run(Mapper<LongWritable, Text, Text, Text>.Context context)
        throws IOException, InterruptedException {

    setup(context);

    Integer counter = 0;
    while (context.nextKeyValue()) {

        LongWritable currentKey = context.getCurrentKey();
        Text currentValue = context.getCurrentValue();

        System.out.println(currentKey.toString());

        map(currentKey, currentValue, context);
        counter++;
    }

    System.out.println("Counter: " + counter + " Time: "
            + System.currentTimeMillis());
}

Кроме того, КЛЮЧ, который я получаю в картографе, - это не номер строки, а смещение строки. Можем ли мы получить КЛЮЧ, указывающий на номер строки? Если да, то будет ли он уникальным для нескольких картографов? (текущий KEY, смещение, не уникален среди картографов).

Как я могу сделать это правильно?


person Gireesh Puthumana    schedule 22.04.2015    source источник
comment
Содержит ли ваш входной файл номер строки или просто запись? В противном случае это будет сложно, поскольку вы можете не получить от 5000 до 500000 строк при распределении данных.   -  person USB    schedule 22.04.2015
comment
Входной файл не имеет номера строки. Только записи.   -  person Gireesh Puthumana    schedule 22.04.2015
comment
Если ваши данные имеют небольшой размер, вы можете продолжить с WholeFileInputFormat   -  person USB    schedule 22.04.2015
comment
Мои данные огромны. Десятки миллионов.   -  person Gireesh Puthumana    schedule 22.04.2015
comment
Если у вас есть номер строки, то это будет довольно просто. Вы не сможете поместить номера строк в задание mapreduce, поскольку данные разделены.   -  person USB    schedule 22.04.2015


Ответы (2)


  • Форматы ввода по умолчанию, такие как TextInputFormat, будут давать смещение записи в байтах, а не фактический номер строки — это в основном связано с невозможностью определить истинный номер строки, когда входной файл является разделяемым и обрабатывается двумя или более преобразователями.

  • Вы можете создать свой собственный InputFormat для получения номеров строк, а не смещений в байтах, но вам нужно настроить формат ввода, чтобы он возвращал false из метода isSplittable (большой входной файл не будет обрабатываться несколькими преобразователями). Если у вас есть небольшие файлы или файлы, которые по размеру близки к размеру блока HDFS, то это не проблема.

  • Вы также можете использовать свинью для очистки ваших данных и получения конкретных заинтересованных строк и обработки этих конкретных данных.

    Я считаю, что это недостаток Hadoop: Hadoop терпит неудачу, когда вы хотите поделиться глобальным состоянием между разными системами.

person Karthik    schedule 22.04.2015

Я бы попытался добавить эти номера строк в первое задание MapReduce. Затем вы можете выполнить задание MapReduce, включив в Mapper некоторый код, отвечающий за проверку номера строки, чтобы отбросить всю строку или выполнить анализ.

РЕДАКТИРОВАТЬ: Теперь я думаю, что первое задание MR не может быть реализовано, поскольку проблема у картографов будет такой же, как и исходная проблема: они получат разбиения без какой-либо ссылки на его позиция во всем большом файле.

person frb    schedule 22.04.2015
comment
Спасибо. Но нет ли другого способа, кроме написания отдельного задания MR для добавления номера строки? Я имею в виду, нельзя ли это каким-либо образом сделать за одну работу? - person Gireesh Puthumana; 22.04.2015
comment
Теперь я думаю, что первое задание MR не может быть реализовано ... у вас будет такая же проблема при получении сплитов у мапперов! - person frb; 22.04.2015
comment
Да, вы не можете написать первое задание mapreduce, так как входные данные разделены. И мы не будем уверены, экскат это 5000 или 5001-я линейка - person USB; 22.04.2015