Файловую систему HDFS размер блока против реальный размер файла

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

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

4 ответов


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

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

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

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

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

  • 1 файлов и каталогов, 0 блоков = 1 всего
  • используемый DFS: 112 KB
  • DFS осталось: 19.82 ГБ

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

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

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

  • 12 файлов и каталогов, 10 блоков = 22 итого
  • используемый DFS: 122.15 KB
  • DFS осталось: 19.82 ГБ

таким образом, 10 файлов не потребляли 10 раз 64 МБ (без изменения "DFS Remaining").


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


'доступные блоки останутся на 79 (посмотреть здесь). Во всяком случае, я не думаю, что HDFS решает, достаточно ли у него свободного места с точки зрения "доступных блоков".


размер блока HDFS и размер блока Ext-это не одно и то же. Самый простой способ поставить его-размер блока HDFS-это размер блока "репликация", а не размер блока" хранение".

для хранения он будет использовать тот же объем пространства, что и ваша локальная файловая система, потому что это то, что он использует, но он будет копировать не меньше, чем один блок между узлами, даже если используется только 1KB