Размер блока HDFS с фактическим размером файла

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

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

Ответ 1

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

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

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

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

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

  • 1 файл и каталоги, 0 блоков = 1 всего
  • Используемый DFS: 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 всего
  • Используемый DFS: 122.15 KB
  • Осталось DFS: 19.82 GB

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

Ответ 2

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

Ответ 3

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