Подтвердить что ты не робот

Как Hadoop выполняет входные расщепления?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Итак, коротко расскажем: загрузите данные в HDFS и запустите MR Job. Hadoop позаботится об оптимальном выполнении.

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

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

введите описание изображения здесь

Посмотрите на связанные quesitons

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

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

Ответ 4

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

Ответ 5

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

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

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

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

Пример:

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

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

Короткий ответ - InputFormat позаботится о разделении файла.

Способ, которым я подхожу к этому вопросу, - это посмотреть его класс TextInputFormat по умолчанию:

Все классы InputFormat являются подклассом FileInputFormat, которые заботятся о расколе.

В частности, функция getSplit FileInputFormat генерирует список InputSplit из списка файлов, определенных в JobContext. Разбиение основано на размере байтов, чьи Min и Max могут быть определены произвольно в файле проекта xml.

Ответ 9

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

Ответ 10

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

conf.setInputFormat(TextInputFormat.class);

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

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

Ответ 11

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

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

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

Пример:

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

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

Вывод:

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

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