Сделайте что-нибудь вроде этого. Если вы загружаете файл размером 500 МБ в HDFS. Если 100 МБ данных были успешно загружены в HDFS, и другой клиент собирается прочитать загруженные данные, пока загрузка еще не завершена. Что тогда будет? Будут ли отображаться те 100МБ данных, которые выгружены, или нет? Размер блока по умолчанию для Hadoop1x составляет 64 МБ, а для Hadoop2x - 128 МБ.
Пусть размер блока равен 100 МБ, то есть пять блоков должны реплицироваться три раза (коэффициент репликации по умолчанию)
Ниже описывается процедура записи блока в HDFS:
Если у нас есть A, B, C, D и E - пять блоков для клиента, файла, имени-узла и данных- узел. Затем сначала клиент берет блок A и приближается к узлу имени для расположения узла данных, чтобы сохранить этот текущий блок и его реплицированные копии. Как только информация об узле данных станет доступной для клиента, он достигнет непосредственно узла данных и начнет копирование блока A, который в то же время будет реплицирован на второй узел данных. Когда блок копируется и реплицируется на узел данных, подтверждение хранилища блока A будет доставлено клиенту, затем, далее, клиент перезапустит ту же процедуру для следующего блока, то есть блока B.
Таким образом, если вы загружаете файл размером 500 МБ в HDFS, где 100 МБ данных были успешно загружены в HDFS, а другой клиент собирается прочитать загруженные данные, пока загрузка еще не завершена, тогда только текущий блок который пишется, не будет виден читателям.