Некоторые подробности ниже (от Hadoop Definitive Guide 4-е издание)
«Клиент создает файл, вызвав создать() на DistributedFileSystem (шаг 1 в Рисунок 3-4). DistributedFileSystem делает вызов RPC для namenode для создания нового файла в пространстве имен файловой системы без каких-либо блоков, связанных с ним (шаг 2). Namenode выполняет различные проверки, чтобы убедиться, что файл еще не существует и что клиент имеет право разрешать создание файла. Если эти check pass, namenode записывает новый файл; в противном случае создание файла завершается с ошибкой, и клиент получает значение IOException. DistributedFileSystem возвращает FSDataOutputStream для клиента , чтобы начать запись данных. Как и в случае чтения, FSDataOutputStream обертывает DFSOutputStream, который обрабатывает связь с datanodes и namenode. Как клиент пишет данные (шаг 3), DFSOutputStream разбивает его на пакеты, которые он записывает во внутреннюю очередь, называемую очереди данных. "
Добавление больше информации в ответ на комментарий на этот пост:
Вот пример клиентская программа для копирования файла в HDFS (Source-Hadoop Definitive Guide)
public class FileCopyWithProgress {
public static void main(String[] args) throws Exception {
String localSrc = args[0];
String dst = args[1];
InputStream in = new BufferedInputStream(new FileInputStream(localSrc));
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(dst), conf);
OutputStream out = fs.create(new Path(dst), new Progressable() {
public void progress() {
System.out.print(".");
}
});
IOUtils.copyBytes(in, out, 4096, true);
}
}
Если вы посмотрите на реализацию метода create() в классе FileSystem, он имеет getDefaultBlockSize() в качестве одного из своих аргументов, который inturn извлекает значения из конфигурации, которая является поворотом, обеспечивается наменоведением. Именно так клиент узнает размер блока, настроенный на кластере hadoop.
Надеется, что это помогает
Клиент связывается с namenode перед записью в datanodes –
, так что вы говорите, когда клиент сначала делает вызов RPC с помощью create ("log.txt") для этого вызова, узел имени возвращает размер блока hdfs обряд? –
Замените 'log.txt' на любое имя файла, тогда да, но есть еще несколько шагов, связанных с процессом. –