2016-05-06 3 views
1

У меня размер файла 100 МБ, а размер блока по умолчанию - 64 МБ. Если я не задаю размер разделенного входа, размер разделения по умолчанию будет размером блока. Теперь размер разделения также составляет 64 МБ.Входной бит и блок в hadoop

Когда я загружаю этот файл размером 100 МБ в HDFS, файл размером 100 МБ будет разделен на 2 блока. то есть 64 МБ и 36 МБ. Например, ниже приведен текст стихотворения размером 100 МБ. Если я загружу эти данные в HDFS, скажем, от линии 1 до половины строки 16, как ровно 64 МБ, как один сплит/блок (до «Он сделал«), а оставшуюся половину строки 16 (дети смеялись и сыграйте) до конца файла как второй блок (36 МБ). Будет два задания для сопоставления.

Мой вопрос в том, как первый картограф рассмотрит 16-ю строку (это строка 16 блока 1), так как блок имеет только половину строки или как второй картограф рассмотрит 1-ю строку блока 2, так как он также имеет половину линии.

Mary had a little lamb 
Little lamb, little lamb 
Mary had a little lamb 
Its fleece was white as snow 
And everywhere that Mary went 
Mary went, Mary went 
Everywhere that Mary went 
The lamb was sure to go 

He followed her to school one day 
School one day, school one day 
He followed her to school one day 
Which was against the rule 
It made the children laugh and play 
Laugh and play, laugh and play 
It made the children laugh and play 
To see a lamb at school 

And so the teacher turned him out 
Turned him out, turned him out 
And so the teacher turned him out 
But still he lingered near 
And waited patiently 
Patiently, patiently 
And wai-aited patiently 
Til Mary did appear 

Или, если расщепление 64 МБ, а не разделение одной линии, может ли хаоп рассмотреть всю линию 16?

ответ

1

В данных hadoop считывается на основе размера разделения и размера блока.

  • Файл разделен на несколько FileSplits на основе размера. Каждый входной бит инициализируется параметром запуска, соответствующим смещению на входе.

  • Когда мы инициализируем LineRecordReader, он пытается создать экземпляр LineReader, который начинает читать строки.

  • Если CompressionCodec определен, он заботится о границах. Итак, если начало InputSplit не равно 0, то обратный признак 1 символ, а затем пропустить первую строку (встречается с \ n или \ r \ n) .Backtrack гарантирует, что вы не пропустите действительную строку.

Вот код:

if (codec != null) { 
    in = new LineReader(codec.createInputStream(fileIn), job); 
    end = Long.MAX_VALUE; 
} else { 
    if (start != 0) { 
    skipFirstLine = true; 
    --start; 
    fileIn.seek(start); 
    } 
    in = new LineReader(fileIn, job); 
} 
if (skipFirstLine) { // skip first line and re-establish "start". 
    start += in.readLine(new Text(), 0, 
        (int)Math.min((long)Integer.MAX_VALUE, end - start)); 
} 
this.pos = start; 

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

Так как в вашем случае, первый блок B1, будет считывать данные из смещения 0 в «Это заставило детей смеяться и играть» линия

Блок B2 будет считывать данные из «Чтобы увидеть ягненок в школе " линия до последнего смещения линии.

Вы можете передать их для справок:

https://hadoopabcd.wordpress.com/2015/03/10/hdfs-file-block-and-input-split/
How does Hadoop process records split across block boundaries?

0

1-й картограф будет читать всю 16-ю строку (он будет продолжать чтение до тех пор, пока не найдет символ конца строки).

Если вы помните, для применения mapreduce ваш вход должен быть организован в парах ключ-значение. Для TextInputFormat, который по умолчанию используется в Hadoop, эти пары: (offset_from_file_beginning, line_of_text). Текст разбивается на эти пары «ключ-значение» на основе символа «\ n». Итак, если строка текста выходит за пределы размера входного разделения, картограф будет продолжать читать, пока не найдет «\ n».

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

  • Нет связанных вопросов^_^