2015-10-21 4 views
0

Основываясь на моем понимании, TextInputFormat должен делиться именно на разрывы строк, но похоже, что я ошибаюсь, основываясь на некоторых ответах, которые я видел на веб-сайте. Кто-нибудь лучше объясняет и какой вариант прав?Hadoop MapReduce TextInputFormat - как выполняется разделение файлов

Какое из следующих вариантов лучше всего описывает работы TextInputFormat?

  1. Разделители входных файлов могут пересекаться друг с другом. Строка, которая пересекает разделение файлов, считывается RecordReader разделения, содержащего конец ломаной линии.

  2. Входной файл разделяется точно на разрывы строк, поэтому каждый считыватель записей считывает ряд полных строк.

  3. Разделители входных файлов могут пересекаться между перерывами. Строка, которая пересекает разделение файлов, считывается RecordReader разделения, содержащего начало ломаной линии.

  4. Разделители входных файлов могут пересекаться между перерывами. Строка, которая пересекает разделение плитки, игнорируется.

  5. Разделители входных файлов могут пересекаться между перерывами. Строка, которая пересекает разделение файлов, считывается RecordReaders обоих разделов, содержащих ломаную линию.

ответ

3

Вариант 1. правильно. Последняя строка первого раскола была бы частью первого разделения, хотя это могло бы привести к удаленному чтению и проблеме локализации данных.

Не всегда возможно иметь конец линии, совпадающий с разделительной границей.

0

TextInputFormat в Hadoop является стандартным InputFormat MapReduce. Он обрабатывает каждую строку каждого входного файла как отдельную запись и не выполняет синтаксический анализ. Это полезно для неформатированных данных или записей на основе строк, таких как файлы журналов.

Ключ - это смещение байта начала строки внутри файла (не целой файл только один раскол), поэтому он будет уникальным в сочетании с именем файла.

Значение - это содержимое строки, за исключением терминаторов строк.

0

Посмотрите на странице документации по TextInputFormat

An InputFormat для простых текстовых файлов. Файлы разбиваются на строки. Для сигнализации конца строки используются либо возврат линии, либо возврат каретки. Ключи - это позиция в файле, а значения - строка текста.

Проверить выполнение TextInputFormat @grepcode (Вариант 1, кажется, правильный путь)

@Override 
    public RecordReader<LongWritable, Text> 
    createRecordReader(InputSplit split, 
         TaskAttemptContext context) { 
    return new LineRecordReader(); 
    } 

LineRecordReader:

public boolean nextKeyValue() throws IOException { 
    if (key == null) { 
     key = new LongWritable(); 
    } 
    key.set(pos); 
    if (value == null) { 
     value = new Text(); 
    } 
    int newSize = 0; 
    while (pos < end) { 
     newSize = in.readLine(value, maxLineLength, 
          Math.max((int)Math.min(Integer.MAX_VALUE, end-pos), 
            maxLineLength)); 
     if (newSize == 0) { 
     break; 
     } 
     pos += newSize; 
     if (newSize < maxLineLength) { 
     break; 
     } 

     // line too long. try again 
     LOG.info("Skipped line of size " + newSize + " at pos " + 
       (pos - newSize)); 
    } 
    if (newSize == 0) { 
     key = null; 
     value = null; 
     return false; 
    } else { 
     return true; 
    } 
    } 
Смежные вопросы