Как распределить данные между Datanodes/Slavenodes в Hadoop?

У меня есть многоузловой кластер в Hadoop, состоящий из двух машин. на первой машине (настроенной ведущей и ведомой) работают узел имени и узел данных, а на второй машине (настроенная ведомая) работает узел данных.

Я хочу загружать и распределять данные между ними почти поровну?

У меня есть два сценария:

Во-первых: предположим, у меня есть файл file1 размером 500 МБ, и я загрузил его на первую машину, используя:

hadoop fs -put file1 hdfspath

Будет ли он разделен на оба узла данных или будет храниться только на первой машине?

Когда произойдет раздача: это после превышения размера блока на первой машине, тогда она раздастся или есть другие критерии.

Будут ли поровну разделены 250мб на каждую ноду данных?


Во-вторых: предположим, у меня есть 250 файлов размером 2 МБ каждый, и я загрузил папку, содержащую их, dir1 на первую машину, используя:

hadoop fs -put dir1 hdfspath

тот же вопрос: будут ли данные распределяться на обеих машинах или только на первой машине. Также когда и как будет происходить раздача?

Спасибо.


person Mosab Shaheen    schedule 24.03.2017    source источник


Ответы (1)


Когда мы записываем файл в HDFS, он разбивается на части, называемые блоками данных, а размер блоков контролируется параметром dfs.block.size в файле hdfs-site.xml (обычно 128 МБ). Каждый блок хранится на одном или нескольких узлах, что контролируется параметром dfs.replication в том же файле (по умолчанию 3). Каждая копия блока в узлах называется репликой.

Как это делается: -

При записи данных в файл HDFS данные сначала записываются в локальный кэш клиента. Когда кеш достигает определенного порога (размер блока, по умолчанию 128 МБ), клиент запрашивает и извлекает список узлов данных из узла имен (который поддерживает метаданные). Этот список содержит узлы данных, в которых есть место и которые могут иметь реплику этого блока. Количество узлов данных, которые могут иметь данные реплики, зависит от коэффициента репликации. Затем клиент создает конвейер между узлами данных для сброса данных. Первый DataNode начинает получать данные (базовый io.file.buffer.size равен 4 КБ, Hadoop использует для операций ввода-вывода), записывает буферизованные данные в локальный каталог узла и передает те же буферизованные данные второму DataNode в списке. . Второй DataNode, в свою очередь, начинает получать буферизованные данные блока данных, записывает их в свой локальный каталог, а затем сбрасывает те же данные в третий DataNode. Наконец, третий DataNode записывает данные в свой локальный каталог.

Когда первый блок заполнен, клиент запрашивает новые DataNodes, которые будут выбраны из NameNode для размещения реплик следующего блока. Этот поток продолжается до последнего блока файла. Выбор DataNodes для каждого блока может быть разным.

person Deepan Ram    schedule 24.03.2017
comment
Спасибо за ответ, я думаю, что данные должны быть перебалансированы, иначе все они будут храниться в одном узле данных. Я читал, что мы должны использовать: балансировщик hdfs hdfs. Кстати, как посмотреть данные по каждому узлу в веб-интерфейсе Hadoop, т.е. какой URL для этого? - person Mosab Shaheen; 24.03.2017