2013-02-25 6 views
11

Я знаю, что HDFS хранит данные, используя обычную файловую систему Linux в узлах данных. Размер блока HDFS: 128 MB. Допустим, что у меня есть 10 GB дискового пространства в моем кластере hadoop, что означает, что HDFS изначально имеет в качестве доступного хранилища.Размер блока HDFS Vs фактический размер файла

Если я создаю небольшой файл, скажем 12.8 MB, #доступные блоки HDFS станут 79. Что произойдет, если я создам еще один небольшой файл 12.8 MB? Будут ли блокировку #availbale находиться на отметке 79 или она снизится до 78? В первом случае HDFS в основном пересчитывает #доступные блоки после каждого распределения блоков на основе свободного свободного места на диске, поэтому #доступные блоки становятся 78 только после того, как потребляется более 128 МБ дискового пространства. Просьба уточнить.

ответ

18

Лучший способ узнать, попробовать, см. Мои результаты ниже.

Но прежде чем пытаться, я предполагаю, что даже если вы можете выделить только 80 полных блоков в вашей конфигурации, вы можете выделить более 80 непустых файлов. Это связано с тем, что я считаю, что HDFS не использует полный блок каждый раз, когда вы выделяете непустой файл. С другой стороны, блоки HDFS не являются единиц хранения, но репликацией единиц. Я думаю, что блок распределения памяти HDFS является единицей базовой файловой системы (если вы используете ext4 с размером блока 4 КБ и создаете файл размером 1 КБ в кластере с коэффициентом репликации 3, вы потребляете 3 раза 4 КБ = 12 КБ свободного места на жестком диске).

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

  • Hadoop версия 1.0.4
  • 4 узла данных, каждый из которых немного меньше, чем 5,0 г свободного пространства, ext4 размер блока 4К
  • блока размером 64 МБ , тиражирование 1

по умолчанию После запуска HDFS, у меня есть следующее резюме NameNode:

  • 1 файлы и каталоги, 0 блока S = 1 общий
  • ДФС Б: 112 Кб
  • DFS Оставшийся: 19,82 GB

Затем я следующие команды:

  • hadoop fs -mkdir /test
  • for f in $(seq 1 10); do hadoop fs -copyFromLocal ./1K_file /test/$f; done

С этими результатами:

  • 12 файлов и каталогов, 10 блоков = 22 всего
  • ДФС Б: 122,15 KB
  • DFS Оставшийся: 19,82 GB

Так 10 файлов не потребляют в 10 раз 64 Мб (без модификация «оставшегося DFS»).

+0

Это то, что я догадывался. Теперь это яснее. Спасибо за подробное объяснение и эксперимент! – sachin2182

1

HDFS использует только то, что необходимо для локальной файловой системы. Таким образом, блок, представляющий 12 МБ-файл, будет занимать 12 МБ при хранении (в каждом дататаноде, где он хранится). Таким образом, вы сможете иметь столько блоков, сколько вам нужно, если у вас есть место для данных.

+1

Но я думаю, HDFS решает, имеет ли он достаточно свободного места в терминах доступных # блоков. Гипотетически, если у нас есть дисковое пространство размером 128 МБ и создается 1 МБ-файл, тогда #доступные блоки становятся 0 (поскольку 127 МБ не могут составить полный блок HDFS), и HDFS не сможет создать еще один файл размером 1 МБ, даже если есть достаточно места на диске. Правильно ли это звучит? – sachin2182

+0

Из моего опыта - HDFS попытается создать блок и вернет ошибку в пространстве на конкретных узлах. –

+0

Спасибо за разъяснение @David – sachin2182

0

«Доступные блоки» будут оставаться на уровне 79 (see this question). Во всяком случае, я не думаю, что HDFS решает, имеет ли он достаточно свободного места в терминах «доступных блоков».

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