Как Hadoop выполняет разбиение ввода? - PullRequest
34 голосов
/ 14 мая 2010

Это концептуальный вопрос, касающийся Hadoop / HDFS. Допустим, у вас есть файл, содержащий 1 миллиард строк. И для простоты, давайте рассмотрим, что каждая строка имеет форму <k,v>, где k - смещение строки от начала, а значение - содержимое строки.

Теперь, когда мы говорим, что хотим запустить N задач карты, разделяет ли фреймворк входной файл на N разбиений и запускает каждую задачу карты в этом разбиении? или мы должны написать функцию разбиения, которая разделяет N, и запускать каждую задачу карты в сгенерированном разбиении?

Все, что я хочу знать, это то, выполняется ли разбиение внутри системы или мы должны разделить данные вручную?

В частности, каждый раз, когда вызывается функция map (), каковы ее параметры Key key and Value val?

Спасибо, Дипак

Ответы [ 11 ]

23 голосов
/ 14 мая 2010

InputFormat отвечает за разделение.

Как правило, если у вас есть n узлов, HDFS распределяет файл по всем этим n узлам. Если вы начнете работу, по умолчанию будет n мапперов. Благодаря Hadoop средство отображения на компьютере будет обрабатывать часть данных, хранящихся на этом узле. Я думаю, что это называется Rack awareness.

Короче говоря: загрузите данные в HDFS и запустите работу MR. Hadoop позаботится об оптимизированном исполнении.

14 голосов
/ 22 апреля 2011

Файлы разбиты на блоки HDFS и блоки реплицированы. Hadoop назначает узел для разделения на основе принципа локальности данных. Hadoop попытается выполнить отображение на узлах, где находится блок. Из-за репликации существует несколько таких узлов, на которых размещается один и тот же блок.

Если узлы недоступны, Hadoop попытается выбрать узел, ближайший к узлу, на котором размещен блок данных. Например, он может выбрать другой узел в той же стойке. Узел может быть недоступен по разным причинам; все слоты карты могут быть заняты или узел может просто не работать.

8 голосов
/ 13 декабря 2015

К счастью, все позаботится о структуре.

MapReduce обработка данных основана на концепции входных разбиений . Количество входных разбиений, рассчитанных для конкретного приложения, определяет количество задач сопоставления.

Количество карт обычно определяется количеством блоков DFS во входных файлах.

Каждая из этих задач сопоставления назначается, где это возможно, подчиненному узлу, где хранится разделение ввода. Диспетчер ресурсов (или JobTracker, если вы находитесь в Hadoop 1) делает все возможное, чтобы обеспечить локальную обработку входных разбиений.

Если локальность данных не может быть достигнута из-за разделения входных данных, пересекающего границы узлов данных, некоторые данные будут перенесены из одного узла данных в другой узел данных.

Предположим, что имеется блок 128 МБ, а последняя запись не помещается в Блок a и распространяется в Блок b , тогда данные в Блок b будут скопировано на узел, имеющий Block a

Посмотрите на эту диаграмму.

enter image description here

Посмотрите на похожие вопросы

О разделении файлов Hadoop / HDFS

Как записи процесса Hadoop разбиваются по границам блоков?

6 голосов
/ 02 сентября 2014

Для лучшего понимания того, как InputSplits работает в hadoop, я бы рекомендовал прочитать статью , написанную hadoop для чайников . Это действительно полезно.

4 голосов
/ 19 марта 2015

Я думаю, что Дипак спрашивал больше о том, как определяется ввод для каждого вызова функции карты, а не данные, присутствующие на каждой карте узла . Я говорю это, основываясь на второй части вопроса: В частности, каждый раз, когда вызывается функция map (), каковы ее параметры Key key и Value val?

На самом деле, тот же вопрос привел меня сюда, и если бы я был опытным разработчиком Hadoop, я мог бы истолковать его как ответы выше.

Чтобы ответить на вопрос,

файл в данном узле карты разделяется на основе значения, установленного для InputFormat . (это делается в Java с использованием setInputFormat () !)

Пример:

conf.setInputFormat (TextInputFormat.class); Здесь, передавая TextInputFormat в функцию setInputFormat, мы сообщаем hadoop обрабатывать каждую строку входного файла в узле карты как входные данные для функции карты. Перевод строки или возврат каретки используются для обозначения конца строки. больше информации на TextInputFormat !

В этом примере: Ключи - это позиция в файле, а значения - строка текста.

Надеюсь, это поможет.

1 голос
/ 15 августа 2017

Разница между размером блока и размером входного разбиения.

Разделение ввода - это логическое разделение ваших данных, в основном используемое при обработке данных в программе MapReduce или других методах обработки. Размер входного разделения - это пользовательское значение, и Hadoop Developer может выбрать размер разделения в зависимости от размера данных (объем обрабатываемых данных).

Input Split в основном используется для управления числом Mapper в программе MapReduce. Если вы не определили размер разделения ввода в программе MapReduce, то разделение блока HDFS по умолчанию будет рассматриваться как разделение ввода при обработке данных.

Пример:

Предположим, у вас есть файл размером 100 МБ и конфигурация блока HDFS по умолчанию составляет 64 МБ, тогда он будет разделен на 2 части и займет два блока HDFS. Теперь у вас есть программа MapReduce для обработки этих данных, но вы не указали входное разбиение, тогда основанное на количестве блоков (2 блока) будет рассматриваться как входное разделение для обработки MapReduce, и два маппера будут назначены для этого задания. Но предположим, что вы указали размер разделения (скажем, 100 МБ) в вашей программе MapReduce, тогда оба блока (2 блока) будут рассматриваться как один разделитель для обработки MapReduce, и для этого задания будет назначен один Mapper.

Теперь предположим, что вы указали размер разделения (скажем, 25 МБ) в своей программе MapReduce, тогда для программы MapReduce будет 4 входных разделения, и для задания будет назначено 4 Mapper.

Вывод:

  1. Разделение ввода - это логическое разделение входных данных, в то время как блок HDFS - это физическое разделение данных.
  2. Размер блока HDFS по умолчанию - это размер разделения по умолчанию, если входное разделение не указано в коде.
  3. Разделение определяется пользователем, и пользователь может контролировать размер разделения в своей программе MapReduce.
  4. Одно разделение может быть сопоставлено нескольким блокам, и может быть несколько разделений одного блока.
  5. Количество задач карты (Mapper) равно количеству входных разбиений.

Источник: https://hadoopjournal.wordpress.com/2015/06/30/mapreduce-input-split-versus-hdfs-blocks/

1 голос
/ 01 августа 2016

Когда запускается задание Hadoop, он разбивает входные файлы на куски и назначает каждое разбиение мапперу для обработки; это называется InputSplit.

1 голос
/ 25 ноября 2013

FileInputFormat - абстрактный класс, который определяет, как входные файлы читаются и выводятся. FileInputFormat предоставляет следующие функциональные возможности: 1. выберите файлы / объекты, которые должны быть использованы в качестве входных данных 2. Определяет значения inputplits, которые разбивают файл на задачу.

Согласно базовым функциям hadoopp, если n разделений, то будет n mapper.

0 голосов
/ 01 июля 2015

FileInputFormat.addInputPath (задание, новый путь (args [0])); или

conf.setInputFormat (TextInputFormat.class);

class FileInputFormat funcation addInputPath , setInputFormat заботится о входных данных, также этот код определяет количество создаваемых картографов. Можно сказать, что inputslit и число картографов прямо пропорциональны количеству блоков, используемых для хранения входного файла в HDFS.

Ex. если у нас есть входной файл размером 74 МБ, этот файл хранится в HDFS в двух блоках (64 МБ и 10 МБ). поэтому для этого файла входные данные разделены на два и два экземпляра преобразователя для чтения этого входного файла.

0 голосов
/ 19 марта 2014

Существует отдельное задание уменьшения карты, которое разбивает файлы на блоки. Используйте FileInputFormat для больших файлов и CombineFileInput Format для маленьких. Вы также можете проверить, можно ли разделить ввод на блоки методом issplittable. Каждый блок затем подается на узел данных, где карта сокращает количество выполненных заданий для дальнейшего анализа. размер блока будет зависеть от размера, который вы упомянули в параметре mapred.max.split.size.

...