2016-10-24 5 views
4

Клиент HDFS находится вне кластера HDFS. Когда клиент HDFS пишет файл, чтобы клиенты HDFS разбивали файлы на блоки, а затем записывали блок в datanode.Как клиент HDFS знает размер блока при записи?

Вопрос в том, как клиент HDFS знает Blocksize? Размер блока настраивается в узле «Имя», и клиент HDFS не имеет представления о размере блока, а затем как он разделяет файл на блоки?

+1

Клиент связывается с namenode перед записью в datanodes –

+0

, так что вы говорите, когда клиент сначала делает вызов RPC с помощью create ("log.txt") для этого вызова, узел имени возвращает размер блока hdfs обряд? –

+0

Замените 'log.txt' на любое имя файла, тогда да, но есть еще несколько шагов, связанных с процессом. –

ответ

0

Некоторые подробности ниже (от Hadoop Definitive Guide 4-е издание)

Anatomy of File Write from Hadoop Definitive Guide

«Клиент создает файл, вызвав создать() на 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.

Надеется, что это помогает

+0

Я прочитал это ... но нет упоминания о том, как клиент знает, имеет ли размер блока 64 МБ или 128 МБ, который настроен в NameNode. Как DFSOutputStream разбивает данные, как он знает размер блока .... Предположим, что я клиент, и я хочу записать файл в HDFS ... и позволяет сказать, что файл не существует в HDFS .. проверка но как я узнаю размер блока, настроенный в HDFS .. на основе информации только я могу разделить файлы на блоки ... –

+0

Клиент не получает размер блока из NN, он не является частью какого-либо протокола, клиент имеет его собственная конфигурация, и это его собственное единственное право определять размер блока, с которым он хочет сохранить файл. getDefaultBlockSize - это операция на стороне клиента, которая не переходит к NameNode только к локальному объекту Configuration или к жесткой константе 128MB, если в config не содержится dfs.blocksize или dfs.block.size (последнее не рекомендуется). – pifta

0

Говоря простые слова, когда вы клиент URI развертывания, он будет размещать сервера URI в клиенте или загрузить и вручную заменить на клиенте. Поэтому всякий раз, когда клиент запрашивает информацию, он переходит в NameNode и извлекает требуемую информацию или помещает новую информацию в DataNodes.

P.S: Клиент = EdgeNode

2

HDFS разработан таким образом, где размером блока для конкретного файла является частью метаданных.

Давайте просто посмотрим, что это значит?

Клиент может указать NameNode, что он поместит данные в HDFS с определенным размером блока. Клиент имеет свой собственный hdfs-site.xml, который может содержать это значение, и может также указывать его по каждому запросу, используя параметр -Ddfs.blocksize.

Если конфигурация клиента не определяет этот параметр, то по умолчанию используется значение org.apache.hadoop.hdfs.DFSConfigKeys.DFS_BLOCK_SIZE_DEFAULT, которое равно 128 МБ.

NameNode может вызывать ошибку для клиента, если он задает размер блока, размер которого меньше, чем dfs.namenode.fs-limits.min-block-size (по умолчанию 1 МБ).

В этом нет ничего волшебного, NameNode ничего не знает о данных и позволяет клиенту решить оптимальное расщепление, а также определить коэффициент репликации для блоков файла.

+0

Пожалуйста, исправьте мое понимание. Вы говорите, что у клиента есть hdfs.site.xml, у которого есть соединение наменования, а также размер блока. Клиент hdfs.site.xml может иметь размер блока, такой как 128mb или 256mb ... Эта конфигурация будет разделять файл и который будет записан в datanode ... Если у клиента нет блока, тогда он будет иметь размер по умолчанию 128 Мбайт, который также читается со стороны клиента (org.apache.hadoop.hdfs.DFSConfigKeys.DFS_BLOCK_SIZE_DEFAULT). Это верно ? –

+0

Допустим, если размер клиентского размера блокирует конфигурацию в файле dhfs.site.xml - 256 МБ, а в Namenode размер размера блока в hdfs.site.xml равен 128 МБ, что произойдет? .. где размер блока в Namenode меньше размера блока в клиенте ... что будет в случае с наоборот ... –

+0

Жаль, что у меня не было времени, чтобы проверить его раньше. Поэтому, если конфигурация клиентской стороны определяет размер 256 МБ в качестве размера блока, тогда файл будет создан с этим размером блока. Параметр NN стороны ничего не говорит об этом, так как размер блока является частью данных INode. NN обеспечивает только минимальный размер блока. Вы можете проверить это на grepcode, в клиенте блокировка выполняется на основе конфигурации на стороне клиента, и она отправляется в NN, которая полностью продвигает его к объекту INodeFile, хранящему данные inode. Проверьте методы создания в org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer. – pifta

 Смежные вопросы

  • Нет связанных вопросов^_^