Пост 11. Запись файлов в HDFS.
Доброго времени суток. Подумалось мне, что
о самом главном я еще и не рассказывал. А точнее о том как файлы записываются в
HDFS. Иллюстрирует это
действо картинка ниже.
Клиент, инициируя запись файла обращается к
NameNode (NN) и сообщает в какую
директорию HDFS и он хочет записать файл. NN проверяет наличие прав у клиента, факт существования файла
и.т.п. Если все хорошо – передает список DN на которые надо записать файл.
Клиент «пилит» файл на своей стороне и
по блокам начинает передавать его в кластер, где внутри кластера по
интерконнекту происходит репликация. Затем это действо повторяется со следующим
блоком и так далее пока не будут записаны все блоки. Рядом с каждым блоком пишется файл контрольной суммы, который каждый раз сверяется с расчетной при чтении блока.
Запись блоков происходит последовательно. Как
говорил Сталин Черчилю на ялтинской конференции: “доверяй, но проверяй” –
давайте проверим.
Файл из прошлого поста (он у меня около 4.2
Мб) загружаем с разными размерами блока.
Сначала 1 Мб (это 5 блоков).
hadoop fs -D dfs.blocksize=1048576 -put /tmp/alpha.txt /tmp/
загрузка произошла практически моментально.
Теперь попробуем записать с блоком 1 Кб (я
не сошел с ума – просто экспериментирую).
hadoop fs -D dfs.blocksize=1024 -put /tmp/alpha.txt /tmp/
Время загрузки значительно увеличилось
(идет запись 4400 блоков вместо 5), что позволило нам не спеша открыть рядышком
вторую консольку и командой
netstat -na|grep 50010|grep EST
Воочию убедиться что открыто не 4400 сессий с
DataNodes (порт 50010),
а периодически открываются разные сессии. Кстати, эта особенность framework - еще одно
объяснение почему Hadoop любит большие блоки.
Mijatovic,
ReplyDeleteПравильно ли я понимаю, что если входящий файл был распилен на 10 блоков, то эти блоки будут распределены на все DataNodes, т.е. каждая нода будет содержать полный файл?
Таким образом мы все входящие файлы при переводе их в hdfs множим на кол-во DataNode?
Maijatovic,
ReplyDeleteЕсть еще вопрос. В твоем примере ты играешься с размером блока. А есть ли какое-то "золотое правило" как выбрать размер блока оптимально?
Хотелось бы понять как правильно варьировать данный параметр, т.к. от него (как я понимаю) будет сильно зависеть скорость выполнения задач.
>Правильно ли я понимаю, что если входящий файл был распилен на 10 блоков, то эти блоки будут распределены на все DataNodes, т.е. каждая нода будет содержать полный файл?
ReplyDeleteНет. Если файл будет разбит на 10 блоков, то каждый блок будет содержаться в replication factor раз в кластере (по умолчанию replication factor = 3). В итоге часть файла (блок) будет содержаться на dn1, другая часть на dn3 и.т.д.
> Есть еще вопрос. В твоем примере ты играешься с размером блока. А есть ли какое-то "золотое правило" как выбрать размер блока оптимально?
Золотого правила нет. Систем где есть параметр fast, который можно выставить = true. Я чуть позже напишу о том чем надо руководствоваться выбирая размер блока.