Уменьшение карты в Hadoop

Опубликовано: 30 Ноября, 2021

Один из трех компонентов Hadoopis Map Reduce. Первый компонент Hadoop, то есть распределенная файловая система Hadoop (HDFS), отвечает за хранение файла. Второй компонент, Map Reduce, отвечает за обработку файла.

Предположим, есть текстовый файл, содержащий некоторый текст. Назовем этот файл sample.txt . Обратите внимание, что мы используем Hadoop для работы с огромными файлами, но для простоты объяснения здесь мы берем текстовый файл в качестве примера. Итак, предположим, что этот sample.txt содержит несколько строк в виде текста. Содержимое файла выглядит следующим образом:

Привет, я GeeksforGeeks
Чем я могу помочь вам
Как я могу помочь вам
Вы инженер
Вы ищете кодирование
Вы ищете вопросы для собеседования?
Что ты делаешь в эти дни
Каковы Ваши сильные стороны

Следовательно, указанные выше 8 строк являются содержимым файла. Предположим, что при сохранении этого файла в Hadoop HDFS разбила этот файл на четыре части и назвала каждую часть как first.txt , second.txt , third.txt и fourth.txt . Итак, вы можете легко увидеть, что указанный выше файл будет разделен на четыре равные части, и каждая часть будет содержать по 2 строки. Первые две строки будут в файле first.txt , следующие две строки - в second.txt , следующие две - в third.txt а последние две строки будут сохранены в fourth.txt . Все эти файлы будут храниться в узлах данных, а узел имени будет содержать метаданные о них. Все это задача HDFS.

Теперь предположим, что пользователь хочет обработать этот файл. Вот что проявляется в Map-Reduce. Предположим, этот пользователь хочет выполнить запрос к этому файлу sample.txt. Таким образом, вместо того, чтобы sample.txt на локальный компьютер, мы отправим этот запрос к данным. Чтобы отслеживать наш запрос, мы используем Job Tracker (мастер-сервис). Job Tracker перехватывает наш запрос и отслеживает его.

Теперь предположим, что пользователь хочет выполнить свой запрос к sample.txt и получить результат в файле result.output Пусть имя файла, содержащего запрос, - query.jar . Итак, пользователь напишет такой запрос:

J $ hadoop jar query.jar DriverCode sample.txt result.output
  1. query.jar : файл запроса, который необходимо обработать для входного файла.
  2. sample.txt : входной файл.
  3. result.output : каталог, в который будет получен результат обработки.

Итак, теперь Job Tracker перехватывает этот запрос и просит Name Node запустить этот запрос на sample.txt . Затем Name Node предоставляет метаданные в Job Tracker. Теперь приложение Job Tracker знает, что sample.txt хранится в first.txt , second.txt , third.txt и fourth.txt . Поскольку все эти четыре файла имеют три копии, хранящиеся в HDFS, средство отслеживания заданий взаимодействует с средством отслеживания задач (подчиненной службой) каждого из этих файлов, но взаимодействует только с одной копией каждого файла, который находится ближе всего к нему.

Примечание. Применение желаемого кода к локальным first.txt , second.txt , third.txt и fourth.txt является процессом. Этот процесс называется Map .

В терминологии Hadoop основной файл sample.txt называется входным файлом, а его четыре подфайла - входными разделениями. Итак, в Hadoop количество преобразователей для входного файла равно количеству входных разбиений этого входного файла . В приведенном выше случае входной файл sample.txt имеет четыре входных разбиения, поэтому для его обработки будут запущены четыре модуля сопоставления. За работу с этими картографами отвечает Job Tracker.

Обратите внимание, что трекеры задач являются подчиненными службами для Job Tracker. Таким образом, если какая-либо из локальных машин выйдет из строя, обработка этой части файла остановится, и это остановит весь процесс. Таким образом, каждый трекер задач отправляет пульс и количество слотов в Job Tracker каждые 3 секунды. Это называется статусом трекеров задач . В случае, если какой-либо трекер задач выходит из строя, трекер заданий затем ожидает 10 контрольных интервалов, то есть 30 секунд, и даже после этого, если он не получает никакого статуса, он предполагает, что либо трекер задач не работает, либо очень занят. . Затем он связывается с трекером задач другой копии того же файла и направляет его на обработку желаемого кода поверх него. Точно так же информация о слотах используется средством отслеживания заданий для отслеживания того, сколько задач в настоящее время обслуживается средством отслеживания задач и сколько еще задач может быть ему назначено. Таким образом, Job Tracker отслеживает наш запрос.
Теперь предположим, что система сгенерировала вывод для отдельных first.txt , second.txt , third.txt и fourth.txt . Но это не желаемый результат пользователя. Чтобы получить желаемый результат, все эти отдельные выходы должны быть объединены или сведены к одному выходу. Это сокращение нескольких выходов до одного также является процессом, выполняемым REDUCER . В Hadoop, как много редукторов, создается такое большое количество выходных файлов. По умолчанию на кластер всегда есть один редуктор.

Примечание. Map и Reduce - это два разных процесса второго компонента Hadoop, то есть Map Reduce. Их также называют этапами уменьшения карты . Таким образом, можно сказать, что Map Reduce состоит из двух этапов. Фаза 1 - это карта, а фаза 2 - сокращение.

Функционирование Map Reduce

Теперь вернемся к нашему sample.txt с тем же содержимым. Он снова делится на четыре входных first.txt , second.txt , third.txt и fourth.txt . Теперь предположим, что мы хотим подсчитать количество каждого слова в файле. То есть содержимое файла выглядит так:

Привет, я GeeksforGeeks
Чем я могу помочь вам
Как я могу помочь вам
Вы инженер
Вы ищете кодирование
Вы ищете вопросы для собеседования?
Что ты делаешь в эти дни
Каковы Ваши сильные стороны

Тогда вывод кода «подсчета слов» будет таким:

Привет - 1
Я - 1
утра - 1
geeksforgeeks - 1
Как - 2 (Как пишется два раза во всем файле) 
по аналогии
Аре - 3
являются - 2
….и так далее

Таким образом, чтобы получить этот вывод, пользователю нужно будет отправить свой запрос к данным. Предположим, что запрос «количество слов» находится в файле wordcount.jar . Итак, запрос будет выглядеть так:

J $ hadoop jar wordcount.jar DriverCode sample.txt result.output
Типы форматов файлов в Hadoop

Теперь, когда мы знаем, что существует четыре разделения ввода, поэтому будут работать четыре сопоставителя. По одному на каждый входной разделитель. Но Mappers не запускаются непосредственно на входных разделах. Это потому, что входные разделы содержат текст, но картографы не понимают его. Составители карт понимают только пары (ключ, значение). Таким образом, текст во входных разделах сначала необходимо преобразовать в пары (ключ, значение). Это достигается с помощью считывателей записей . Таким образом, мы также можем сказать, что чем больше количество разделений ввода, тем больше количество считывателей записей.

В терминологии Hadoop каждая строка текста называется «записью» . Как программа чтения преобразует этот текст в пару (ключ, значение), зависит от формата файла. В Hadoop существует четыре формата файла. Эти форматы являются предопределенными классами в Hadoop.

Четыре типа форматов:

  1. TextInputFormat
  2. KeyValueTextInputFormat
  3. SequenceFileInputFormat
  4. SequenceFileAsTextInputFormat

По умолчанию файл находится в формате TextInputFormat. Считыватель записей читает по одной записи (строке) за раз. При чтении не учитывается формат файла. Но он преобразует каждую запись в пару (ключ, значение) в зависимости от ее формата. А пока предположим, что первый разделенный вход first.txt находится в TextInputFormat. Теперь программа чтения записей, работающая с этим разделением ввода, преобразует запись в форму (смещение в байтах, целая строка) . Например, first.txt имеет содержимое:

Привет, я GeeksforGeeks
Чем я могу помочь вам

Итак, на выходе устройства чтения записей две пары (поскольку в файле две записи). Первая пара выглядит как (0, Здравствуйте, я geeksforgeeks), а вторая пара выглядит как (26, Чем могу вам помочь) . Обратите внимание, что вторая пара имеет смещение в байтах 26, потому что в первой строке 25 символов, а оператор новой строки ( n) также считается символом. Таким образом, после считывателя записей находится столько же номеров записей, сколько есть количество пар (ключ, значение). Теперь картограф будет запускаться один раз для каждой из этих пар. Точно так же другие сопоставители также работают для пар (ключ, значение) различных входных разбиений. Таким образом, Hadoop разбивает большую задачу на более мелкие и выполняет их параллельно.

Перемешивание и сортировка

Теперь преобразователь предоставляет выходные данные, соответствующие каждой паре (ключ, значение), предоставленной устройством чтения записей. Давайте возьмем первый входной first.txt . Две пары, сгенерированные таким образом для этого файла программой чтения записей: (0, Здравствуйте, я GeeksforGeeks) и (26, Чем могу вам помочь). Теперь mapper берет одну из этих пар за раз и выдает такие выходные данные, как (Hello, 1), (I, 1), (am, 1) и (GeeksforGeeks, 1) для первой пары и (How, 1), (can , 1), (I, 1), (help, 1) и (you, 1) для второй пары. Точно так же у нас есть выходы всех картографов. Обратите внимание, что эти данные содержат повторяющиеся ключи, такие как (I, 1) и далее (как, 1) и т. Д. Об этих повторяющихся ключах также необходимо позаботиться. Эти данные также называются промежуточными данными . Прежде чем передать эти промежуточные данные редуктору, они сначала проходят еще два этапа, называемые перемешиванием и сортировкой .

  1. Фаза перемешивания: эта фаза объединяет все значения, связанные с одним и тем же ключом. Например, (Are, 1) присутствует во входном файле три раза. Таким образом, после фазы перетасовки вывод будет похож на (Are, [1,1,1]).
  2. Фаза сортировки: после перетасовки вывод отправляется на фазу сортировки, где все пары (ключ, значение) сортируются автоматически. В Hadoop сортировка - это автоматический процесс из-за наличия встроенного интерфейса WritableComparableInterface .

После завершения фазы перемешивания и сортировки результирующий вывод отправляется редуктору. Теперь, если есть n пар (ключ, значение) после фазы перемешивания и сортировки, то редуктор запускается n раз и, таким образом, выдает окончательный результат, в котором есть окончательный обработанный результат. В приведенном выше случае результирующий вывод после обработки редуктором будет сохранен в каталоге result.output, как указано в коде запроса, написанном для обработки запроса к данным.