Это седьмой день моего участия в августовском испытании обновлений, подробности о мероприятии:Испытание августовского обновления
текст
Модель программирования MapReduce
Модель программирования MapReduce проста в разработке и мощна и специально разработана для параллельной обработки больших объемов данных.Далее для описания рабочего процесса MapReduce используется диаграмма, как показано на рисунке.
Для получения более подробной информации о модели программирования MapReduce, пожалуйста, обратитесь к этому моему блогу -Что такое модель программирования MapReduce?
Общий процесс
На приведенном выше рисунке рабочий процесс MapReduce можно условно разделить на 5 шагов следующим образом:
Разделение и форматирование источников данных
Входные данные источника данных на этапе карты должны пройти операции фрагментации и форматирования.
- Операция фрагментации: относится к разделению исходного файла на небольшие блоки данных одинакового размера (по умолчанию 128 МБ в Hadoop 2.x), то есть разделение (split), Hadoop создаст задачу Map для каждого сегмента, и задача будет запускать пользовательскую функцию map() для обработки каждой записи в сегменте;
- Операция форматирования: отформатируйте разделенные осколки ( split ) в данные в виде пары ключ-значение , где ключ представляет смещение, а значение представляет содержимое каждой строки.
Выполнить MapTask
Каждая задача карты имеет буфер памяти (размер буфера составляет 100 МБ), и промежуточные результаты входных фрагментированных (разделенных) данных, обработанных задачей карты, будут записаны в буфер памяти. Если записанные данные достигают порога буфера памяти (80 МБ), будет запущен поток для записи данных переполнения в памяти на диск, а промежуточные результаты Карты будут продолжать записываться в буфер. Во время процесса переполнения инфраструктура MapReduce сортирует ключи. Если промежуточный результат относительно велик, будет сформировано несколько файлов переполнения, а окончательные данные буфера будут переполнены на диск для формирования файла переполнения. наконец, объединить все перезаписываемые файлы в один файл.
Выполнить процесс перемешивания
Во время рабочего процесса MapReduce то, как данные, обработанные на этапе Map, передаются на этап Reduce, является ключевым процессом в структуре MapReduce и называется Shuffle. Shuffle будет распределять данные результатов обработки, выводимые MapTask, в ReduceTask, а в процессе распределения разбивать и сортировать данные по ключу.
Выполнить задачу уменьшения
Входной поток данных в ReduceTask имеет форму . Пользователи могут настроить метод сокращения () для логической обработки и, наконец, вывести в виде .
записать в файл
Платформа MapReduce автоматически передаст
MapTask
- Фаза чтения: MapTask анализирует ключ/значение из ввода InputSplit через RecordReader, записанный пользователем.
- Этап карты: проанализированный ключ/значение передается функции Map(), написанной пользователем для обработки, и генерируется серия новых ключей/значений.
- Стадия сбора: в функции map(), написанной пользователем, после завершения обработки данных обычно вызывается outputCollector.collect() для вывода результата Внутри этой функции он разделит сгенерированный ключ/значение (путем вызова разделитель), И запись в кольцевой буфер памяти (размер буфера по умолчанию 100 МБ).
- Стадия переполнения: то есть «переполнение».Когда буфер вот-вот переполнится (по умолчанию он достигает 80% размера буфера), в локальной файловой системе будет создан файл переполнения, и данные буфера будут быть записаны в этот файл.
Перед записью данных на локальный диск данные должны быть отсортированы локально, а при необходимости данные будут объединены, сжаты и выполнены другие операции. Перед записью на диск поток будет разбивать данные в соответствии с количеством ReduceTasks, и одна задача Reduce соответствует данным одного раздела. Цель этого состоит в том, чтобы избежать неловкой ситуации, когда некоторым задачам Reduce выделяется большой объем данных, а некоторым задачам Reduce выделяется очень мало данных или даже нет данных. Если в это время установлен Combiner, отсортированные результаты будут объединены, и цель этого состоит в том, чтобы выполнить как можно меньше операций записи данных на диск.
- Этап объединения: когда вся обработка данных завершена, MapTask объединит все временные файлы один раз, чтобы гарантировать, что в конце будет создан только один файл данных.
В процессе слияния операции сортировки и объединения будут выполняться непрерывно. Есть две цели: во-первых, минимизировать объем данных, записываемых на диск каждый раз, во-вторых, минимизировать объем данных, передаваемых по сети на следующем этапе репликации. Наконец объединены в один разделенный и отсортированный файл.
ReduceTask
- Стадия копирования: Reduce удаленно скопирует часть данных из каждой MapTask (данные из каждой MapTask в порядке), а для части данных, если ее размер превышает определенный порог, она будет записана на диск, в противном случае она будет быть прямо в памяти
- Стадия слияния: при удаленном копировании данных ReduceTask запустит два фоновых потока для слияния файлов в памяти и на диске соответственно, чтобы предотвратить чрезмерное использование памяти или чрезмерное количество файлов на диске.
- Фаза сортировки: пользователь пишет метод reduce().Входные данные представляют собой набор данных, которые агрегируются по ключу.
Чтобы сгруппировать данные с одним и тем же ключом, Hadoop использует стратегию на основе сортировки. Поскольку каждая MapTask уже реализовала частичную сортировку своих собственных результатов обработки, ReduceTask нужно выполнить сортировку слиянием для всех данных только один раз.
- Этап сокращения: вызовите метод reduce() для отсортированных пар ключ-значение, вызовите метод reduce() один раз для пар ключ-значение с одинаковыми ключами, каждый вызов будет генерировать ноль или более пар ключ-значение и, наконец, поместите выходные пары ключ-значение Записать в HDFS
- Этап записи: функция reduce() записывает результаты вычислений в HDFS.
В процессе слияния будет много промежуточных файлов (записанных на диск), но MapReduce сделает так, чтобы данных, записываемых на диск, было как можно меньше, а результат последнего слияния не записывается на диск, а напрямую вводится в Уменьшить функцию.