файлы разбиты на блоки для хранения в HDFS?

Я понимаю, что блочная система в HDFS — это логический раздел поверх базовой файловой системы. Но как файл извлекается, когда я запускаю команду cat.

Допустим, у меня есть файл размером 1 ГБ. Мой размер блока HDFS по умолчанию составляет 64 МБ.

Я выдаю следующую команду:

hadoop -fs copyFromLocal my1GBfile.db input/data/

Приведенная выше команда копирует файл my1GBfile.db с моего локального компьютера в каталог input/data в HDFS:.

У меня есть 16 блоков для копирования и репликации (1 ГБ / 64 МБ ~ 16).

Если у меня 8 datanodes, у одного узла данных может не быть всех блоков для воссоздания файла.

когда я выдаю следующую команду

hadoop -fs cat input/data/my1GBfile.db | head 

что происходит сейчас?

Как восстанавливается файл? Хотя блоки — это просто логические разделы, как физически хранится файл размером 1 ГБ. Он хранится в HDFS. получает ли каждый узел данных некоторую физическую часть файла. поэтому, разбив входной файл размером 1 ГБ на куски по 64 МБ, мы можем сломать что-то на уровне записи (скажем, между строками). Как это обрабатывается?

Я проверил свой узел данных и вижу blk_1073741825, который при открытии в редакторе фактически отображает содержимое файла.

так что куски файлов, которые сделаны, не логичны, но происходит реальное partition данных?

пожалуйста, помогите прояснить это


person brain storm    schedule 23.07.2014    source источник
comment
возможный дубликат Как процесс Hadoop записывает записи, разделенные по блокам границы?   -  person Zeus    schedule 24.07.2014
comment
@Zeus: это не дубликат. В нем говорится о разделении ввода, которое концептуально сильно отличается от блоков HDFS.   -  person brain storm    schedule 24.07.2014
comment
ой стрелять не в ту нить. Пожалуйста, проверьте первый ответ в этой теме: stackoverflow.com/questions/10857880 /storage-format-in-hdfs   -  person Zeus    schedule 24.07.2014
comment
@Zeus: Опять же, вы должны прочитать мой вопрос выше. Спрашиваю о физическом расположении файлов в HDFS. Ни один из постов, которые вы разместили, не говорит о них, и в нем больше говорится о сжатии.   -  person brain storm    schedule 24.07.2014


Ответы (3)


Блоки — это просто файлы на узле данных. Когда вы cat создаете файл в HDFS, ваш компьютер передает эти блоки напрямую с соответствующих узлов данных и локально реконструирует весь файл.

person Mike Park    schedule 23.07.2014
comment
поэтому файл размером 1 ГБ физически разбивается на 16 файлов (которые являются блоками). Следовательно, блоки не являются абстракцией или логическим уровнем? - person brain storm; 24.07.2014
comment
Да, он физически измельчен. Я не уверен, что вы имеете в виду, говоря, что они не являются абстракцией или логическим слоем. - person Mike Park; 24.07.2014
comment
Это говорит о том, что блоки являются уровнем абстракции: заголовок stackoverflow.com/questions/13012924/ - person brain storm; 24.07.2014
comment
Семантика... можно утверждать, что блоки HDFS являются абстракцией поверх блоков уровня ОС. - person Mike Park; 24.07.2014

Насколько я понимаю из вашего вопроса, мой ответ выглядит так, как я понимаю...

Прежде всего, вам нужно понять разницу между размером черно-белого блока HDFS и размером inputSplit.

Размер блока. Размер блока HDFS (64/128/256 МБ) фактически содержит данные исходного файла (1 ГБ). И внутренне/в конечном итоге эти данные хранятся в блоках (4/8 КБ) в файловой системе (расширение и т. д.). Итак, размер блока HDFS — это физический раздел исходного файла.

InputSplit — файл разбивается на входной раздел, который является логическим разделом файла. Логический раздел означает -- он будет просто содержать информацию об адресе/местоположении блоков. Hadoop использует это логическое представление данных (разделение входных данных), хранящихся в файловых блоках. Когда клиент задания MapReduce вычисляет входные разбиения, он выясняет, где начинается первая целая запись в блоке и где заканчивается последняя запись в блоке.

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

Надеюсь, выше проясняется разница между размером черно-белого блока и размером входного разделения.

Теперь перейдем к вашему вопросу о работе 'hadoop fs -cat/'----->

Вся информация о расположении блоков хранится в NameNode в виде метаданных. Если узел разделяется на уровне записи, DataNode отправляет информацию об адресе/местоположении блоков в NameNode.

Итак, когда клиент отправляет команду «cat» в Hadoop, то в основном клиент отправляет запрос на NameNode, который: «Я хочу прочитать файл A.txt, пожалуйста, предоставьте мне расположение всех блоков этого файла, хранящихся в разных местах». Обязанностью NameNode является предоставление местоположения блоков, хранящихся на различных узлах данных.

Основываясь на этих местоположениях, клиент напрямую связывается с узлами данных для этих блоков. И, наконец, клиент считывает все эти блоки в том же порядке/способе, в котором эти блоки были сохранены (здесь NameNode возвращает адреса всех блоков файла клиенту) в HDFS, в результате чего клиент получает полный файл.

Надеюсь, я смог немного развеять ваши сомнения.

person anshuman sharma    schedule 03.01.2015
comment
Это идеальное объяснение этого вопроса. - person salmanbw; 04.07.2015
comment
Отличное объяснение!! - person TechBytes; 12.10.2017

В дополнение к предыдущему ответу вы можете получить информацию о блоках с помощью Java API. Например, вы можете использовать класс FilterFileSystem и метод FilterFileSystem в этом классе. Итак, вы могли видеть, как ваш файл разбивается на блоки и сохраняется в кластере. Ссылка на JavaAPI: http://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FilterFileSystem.html

person morsik    schedule 28.07.2014