2014-08-28 3 views
2

У меня есть один файл 300MB. Размер block составляет 128MB. Таким образом, входной файл делится на следующие куски и помещается в HDFS.У блоков HDFS есть информация о смещении байтов, хранящаяся в Hadoop?

Block1: 128MB 
Block2: 128MB 
Block3: 64MB. 

В настоящее время данные каждого блока содержат byte offset информацию, содержащуюся в нем. То есть, блоки имеют следующие offset информации?

Block1: 0-128MB of File 
Block2 129-256MB of File 
Block3: 257MB-64MB of file 

Если да, то как я могу получить информацию байтового смещения для block2 (То есть начинается 129MB) в Hadoop. Это только для понимания. Любые инструменты командной строки hadoop для получения таких метаданных о блоках?

EDIT

Если информация байтового смещения нет, картостроитель выполняет свою карту задание на блоке начнет потреблять строки с самого начала. Если присутствует информация о смещении, то он будет пропустить, пока не найдет следующий EOL, а затем начнет обработку записей. Итак, я думаю, что информация о смещении байтов присутствует внутри блоков.

+0

Идею не знаю, но я бы начал с написания небольшого сценария, который генерирует файл размером 300 МБ. – admdrew

+1

@admdrew: Меня не интересует получение 300 МБ файла. но больше на внутренностях того, как хранятся метаданные блока (внутри блока) –

+1

Согласовано. Отмеченный; Надеюсь, кто-то ответит! – admdrew

ответ

0

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

В принципе, datanodes управляют блоками, которые являются просто большими каплями для них. Они знают идентификатор блока, но это его. Наменоде известно все, особенно сопоставление между файловым путем и всеми идентификаторами блоков этого файла и где хранится каждый блок. Каждый идентификатор блока может быть сохранен в одном или нескольких местах в зависимости от настроек репликации.

Я не думаю, что вы найдете общедоступный API для получения требуемой информации из идентификатора блока, потому что HDFS не нужно делать сопоставление таким образом. Наоборот, вы можете легко узнать блоки и их расположение файла. Вы можете попробовать исследовать source code, особенно пакет blockmanager.

Если вы хотите узнать больше, this article about the HDFS architecture может быть хорошим началом.

+0

Прошу прощения, но это не отвечает на вопрос в каком-то смысле. Я знаю, как происходит сопоставление блоков между NameNode и Datanodes. Но вопрос здесь больше связан с байтом-смещением информации в блоках. Если такой информации нет, картограф, выполняющий свое картографическое задание на блоке, начнет потреблять строки с самого начала. Если имеется информация о смещении, то он перескакивает, пока не найдет следующий EOL, а затем начнет обработку записей. –

+0

Если вы хотите знать, как DFSInputStream выполняет свою работу, мы можем прочитать исходный код. В ctor вы увидите, что 'dfsclient.getLocatedBlock' вызывается, чтобы получить' Расположенные блоки '.Затем, когда вы достигаете конца блока (или ищете вне блока), 'blockEnd' устанавливается в -1, который вызовет вызов' seekToBlockSource', который будет вызывать 'SelectedBlocks.findBlock'. У «Расположенного Блока» есть размер и смещение, они сортируются, бинарный поиск выполняется, чтобы найти правильный блок. Я считаю, что для получения хороших ответов вам нужно четко определить контекст вопроса. –

0

Вы можете запустить hdfs fsck /path/to/file -files -blocks, чтобы получить список блоков.

A Block не содержит информацию о смещении, только длину. Но вы можете использовать LocatedBlocks, чтобы получить все блоки файла, и из этого вы можете легко восстановить каждый блок, с какого начального значения оно начинается.

+0

Вы можете увидеть мое редактирование выше в вопросе. Информация о смещении блока должна присутствовать где-то. В противном случае граница записи не будет правильно установлена. –

+1

записи представляют собой концепцию с изображением. Блоки - это концепция HDFS, не связанная с отображением. блоки не содержат смещений, но смещения могут быть переданы в inputformat. –

+0

каждый блок обычно соответствует inputSplit, которые являются просто логическими разделами. В этом случае, чтобы inputSplit знал, какой блок он обрабатывает, он должен знать, что смещение байта от sowmehow правильное? –