Большой размер блока в HDFS! Как объясняется неиспользуемое пространство?

Мы все знаем, что размер блока в HDFS довольно большой (64M или 128M) по сравнению с размером блока в традиционных файловых системах. Это делается для того, чтобы уменьшить процент времени поиска по сравнению с временем передачи (улучшения скорости передачи были намного выше, чем улучшения времени поиска диска, поэтому цель при разработке файловой системы всегда сводить количество запросов по сравнению с объемом данных, подлежащих передаче). Но это связано с дополнительным недостатком внутренней фрагментации (поэтому традиционные размеры блоков файловой системы не так высоки и составляют порядка нескольких КБ - обычно 4 КБ или 8 КБ).

Я просматривал книгу - Hadoop, The Definitive Guide и нашел, что это где-то написано, что файл размером меньше размера блока HDFS не занимает полный блок и не учитывает полное пространство блока, но не может понять как? Может кто-нибудь, пожалуйста, пролил свет на это.

Ответы

Ответ 1

Разделение блоков в HDFS просто логически построено поверх физических блоков базовой файловой системы (например, ext3/fat). Файловая система физически не разделена на блоки (скажем, 64 МБ или 128 МБ или все, что может быть размером блока). Это просто абстракция для хранения метаданных в NameNode. Поскольку NameNode должен загружать все метаданные в память, поэтому существует ограничение на количество записей метаданных, объясняющее необходимость большого размера блока.

Таким образом, три 8 МБ файла, хранящихся на HDFS, логически занимают 3 блока (3 записи метаданных в NameNode), но физически занимают 8 * 3 = 24 МБ пространства в базовой файловой системе.

Большой размер блока должен учитывать правильное использование пространства для хранения при рассмотрении ограничения на память NameNode.

Ответ 2

В соответствии с Hadoop - окончательное руководство

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

Каждый блок в HDFS хранится как файл в Data Node в базовой файловой системе ОС (ext3, ext4 и т.д.), а соответствующие данные хранятся в имени Node. Предположим, что размер файла составляет 200 МБ, а размер блока - 64 МБ. В этом случае для файла будет 4 блока, которые будут соответствовать 4 файлам в Data Node размером 64 МБ, 64 МБ, 64 МБ и 8 МБ (предполагается с репликацией 1).

An ls -ltr в Data Node покажет детали блока

-rw-rw-r-- 1 тренировочное обучение 11 21 окт. 15:27 blk_-7636754311343966967_1002.meta
-rw-rw-r-- 1 учебное обучение 4 21 окт. 15:27 blk_-7636754311343966967
-rw-rw-r-- 1 тренировочное обучение 99 21 окт 15:29 blk_-2464541116551769838_1003.meta
-rw-rw-r-- 1 учебное обучение 11403 21 окт 15:29 blk_-2464541116551769838
-rw-rw-r-- 1 учебное обучение 99 21 окт 15:29 blk_-2951058074740783562_1004.meta
-rw-rw-r-- 1 учебное обучение 11544 21 окт 15:29 blk_-2951058074740783562

Ответ 3

В обычной файловой системе, если мы создаем пустой файл, тогда он также содержит размер 4k, поскольку он хранится на блоке. В HDFS этого не произойдет, для 1GB файла используется только 1 ГБ памяти, а не 4 ГБ. Чтобы быть более ясным.

В ОС: размер файла 1 КБ, размер блока: 4 КБ, используемая память: 4 КБ, Wastage: 3 КБ. IN HDFS: Размер файла 1 ГБ, Размер блока: 4 ГБ, Используемая память: 1 ГБ, Wastage: 0 ГБ, Остальные 3 ГБ могут использоваться другими блоками.

* Не принимайте цифры серьезно, они готовят цифры, чтобы четко указать точку.

Если у вас есть 2 разных файла 1 ГБ, тогда будет 2 блока по 1 ГБ каждый. В файловой системе, если вы храните 2 файла по 1 КБ каждый, тогда у вас будет 2 разных файла 4 КБ + 4 КБ = 8 КБ с потерей 6 КБ.

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