Карта Уменьшить в Hadoop
#HadoopОдним из трех компонентов Hadoop является Map Reduce. Первый компонент Hadoop — распределенная файловая система Hadoop (HDFS) — отвечает за хранение файла. Второй компонент, Map Reduce, отвечает за обработку файла.
Предположим, есть файл слов, содержащий текст. Давайте sample.txt этот файл как sample.txt . Обратите внимание, что мы используем Hadoop для работы с большими файлами, но для простоты объяснения здесь мы берем текстовый файл в качестве примера. Итак, давайте предположим, что этот файл sample.txt содержит несколько строк в виде текста. Содержание файла выглядит следующим образом:
Hello I am Data Science How can I help you How can I assist you Are you an engineer Are you looking for coding Are you looking for interview questions what are you doing these days what are your strengths
Следовательно, вышеуказанные 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
- query.jar : файл запроса, который должен быть обработан во входном файле.
- sample.txt : входной файл.
- result.output : каталог, в который будет получен результат обработки.
Итак, теперь Job Tracker перехватывает этот запрос и просит Name Node выполнить этот запрос на sample.txt . Затем Name Node предоставляет метаданные для Job Tracker. Теперь трекер заданий знает, что sample.txt хранится в first.txt , second.txt , third.txt и fourth.txt . Поскольку все эти четыре файла имеют три копии, хранящиеся в HDFS, Job Tracker связывается с Task Tracker (ведомой службой) каждого из этих файлов, но связывается только с одной копией каждого файла, который находится ближе всего к нему.
Примечание. Применение требуемого кода к локальным first.txt , second.txt , third.txt и fourth.txt является процессом. Этот процесс называется Map .
В терминологии Hadoop основной файл sample.txt называется входным файлом, а четыре его подфайла называются входными разбиениями. Итак, в Hadoop количество картографов для входного файла равно количеству входных разбиений этого входного файла . В приведенном выше случае входной файл sample.txt имеет четыре входных разбиения, поэтому для его обработки будут работать четыре преобразователя. Ответственность за обработку этих картографов лежит на 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 . Теперь предположим, что мы хотим посчитать количество каждого слова в файле. То есть содержимое файла выглядит так:
Hello I am Data Science How can I help you How can I assist you Are you an engineer Are you looking for coding Are you looking for interview questions what are you doing these days what are your strengths
Тогда вывод кода «количество слов» будет выглядеть так:
Hello - 1 I - 1 am - 1 Data Science - 1 How - 2 (How is written two times in the entire file) Similarly Are - 3 are - 2 ….and so on
Таким образом, чтобы получить этот вывод, пользователь должен будет отправить свой запрос на данные. Предположим, что запрос 'count count' находится в файле wordcount.jar . Итак, запрос будет выглядеть так:
J$hadoop jar wordcount.jar DriverCode sample.txt result.output
Типы форматов файлов в Hadoop
Теперь, когда мы знаем, что существует четыре входных разбиения, будут работать четыре преобразователя. Один на каждый вход разделить. Но Mappers не запускаются непосредственно на входных разбиениях. Это потому, что входные разбиения содержат текст, но средства отображения не понимают текст. Картографы понимают только пары (ключ, значение). Таким образом, текст во входных разделениях сначала должен быть преобразован в пары (ключ, значение). Это достигается рекордсменами . Таким образом, мы также можем сказать, что, поскольку существует много входных сплитов, существует много читателей.
В терминологии Hadoop каждая строка в тексте называется «записью» . Как программа чтения записей преобразует этот текст в пару (ключ, значение), зависит от формата файла. В Hadoop существует четыре формата файла. Эти форматы являются предопределенными классами в Hadoop.
Четыре типа форматов:
- TextInputFormat
- KeyValueTextInputFormat
- SequenceFileInputFormat
- SequenceFileAsTextInputFormat
По умолчанию файл находится в TextInputFormat. Читатель читает одну запись (строку) за раз. При чтении не учитывается формат файла. Но он преобразует каждую запись в пару (ключ, значение) в зависимости от ее формата. В настоящее время предположим, что первый входной разделитель first.txt находится в TextInputFormat. Теперь читатель, работающий с этим входным разбиением, преобразует запись в виде (смещение байта, вся строка) . Например, first.txt имеет содержимое:
Hello I am Data Science How can I help you
Итак, на выходе устройства чтения записей есть две пары (поскольку в файле есть две записи). Первая пара выглядит как (0, Здравствуйте, я geeksforgeeks), а вторая пара выглядит как (26, Как я могу вам помочь) . Обратите внимание, что вторая пара имеет байтовое смещение 26, потому что в первой строке 25 символов, а оператор новой строки (/ n) также считается символом. Таким образом, после того, как в считывателе записано столько записей, сколько там пар (ключ, значение). Теперь маппер будет запускаться один раз для каждой из этих пар. Точно так же другие преобразователи также работают для (ключ, значение) пар различных входных разбиений. Таким образом, таким образом, Hadoop разбивает большую задачу на более мелкие задачи и выполняет их параллельно.
Перемешивание и сортировка
Теперь преобразователь обеспечивает вывод, соответствующий каждой паре (ключ, значение), предоставляемой устройством чтения записей. Давайте возьмем первый входной сплит first.txt . Две пары, сгенерированные для этого файла программой чтения записей: (0, Здравствуйте, я — GeeksforGeeks) и (26, Как я могу вам помочь). Теперь mapper принимает одну из этих пар за раз и выдает выходные данные, такие как (Hello, 1), (I, 1), (am, 1) и (GeeksforGeeks, 1) для первой пары и (How, 1), (может , 1), (I, 1), (help, 1) и (you, 1) для второй пары. Точно так же у нас есть выходные данные всех картографов. Обратите внимание, что эти данные содержат дубликаты ключей, такие как (I, 1) и далее (как, 1) и т. Д. С этими дубликатами также необходимо позаботиться. Эти данные также называются промежуточными данными . Перед передачей этих промежуточных данных в редуктор они сначала проходят еще два этапа, которые называются перемешивание и сортировка .
- Фаза перемешивания: эта фаза объединяет все значения, связанные с идентичным ключом. Например, (Are, 1) есть три раза во входном файле. Таким образом, после фазы тасования выходной сигнал будет таким (Are, [1,1,1]).
- Фаза сортировки: После завершения перемешивания выходные данные отправляются на фазу сортировки, где все пары (ключ, значение) сортируются автоматически. В Hadoop сортировка происходит автоматически из-за наличия встроенного интерфейса WritableComparableInterface .
После завершения фазы перемешивания и сортировки результирующий вывод затем отправляется в редуктор. Теперь, если после фазы перемешивания и сортировки существует n пар (ключ, значение), то редуктор запускается n раз и, таким образом, дает конечный результат, в котором находится окончательно обработанный вывод. В приведенном выше случае результирующий вывод после обработки редуктора будет сохранен в каталоге result.output, как указано в коде запроса, записанном для обработки запроса данных.