Большой размер блока в 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 использует локальную файловую систему, и в итоге она заканчивается той же проблемой.