Подробно объясните пять моделей программирования в MapReduce.

Hadoop

предисловие

В прошлом разделе мы говорили оMapReduceСценарии приложений и анализ архитектуры в , и, наконец, использовалиCountWordизDemoпродемонстрировать, оMapReduceконкретная операция. Если вы еще этого не знаете, то можете прочитать предыдущую статью:Первое знакомство со сценарием приложения MapReduce (с кодом JAVA и Python)

Далее мы расскажем оMapReduceОсновная цель этой статьи — разъяснитьMapreduceСколько существует моделей программирования и как они координируются и взаимодействуют?Мы постараемся проанализировать их с точки зрения исходного кода и, наконец, объяснить, как называются разные языки.HadoopсерединаMapreduceизAPIиз.

содержание

  • Фреймворк для модели программирования MapReduce
  • Подробное объяснение пяти моделей программирования
    • InputFormat
    • OutPutFormat
    • Mapper
    • Reducer
    • Partitioner
  • Суммировать

Фреймворк для модели программирования MapReduce

Давайте сначала посмотрим на картинку, оMapReduceмодель программирования

MapReduce`的框架图

  • Слой пользовательской программы

Уровень пользовательской программы означает, что пользователь использует написанный код для вызоваMapReduceинтерфейсный слой.

  • слой инструментов

    • Управление заданиями предназначено для мониторингаHadoopсерединаMapReduceОтправьте сложные задания в кластер, и после отправки заданий в кластер сформированное задание представляет собой ориентированный граф. Каждая задача имеет два методаsubmit()а такжеwaitForCompletion(boolean),submit()Метод заключается в том, чтобы отправить задание в кластер, а затем немедленно вернуться,waitForCompletion(boolean)Дождаться завершения задания в кластере, если оно завершено, то полученный результат можно использовать как вход следующей задачи.
    • chain Mapperа такжеchain ReducerЭтот модуль предназначен для того, чтобы пользователи могли писать связанные задания в видеMap + Reduce Map *, а это значит, что существует только одинReduce,существуетReduceДо и после может быть несколькоMap
    • Hadoop StreamingПоддерживает языки сценариев, такие как Python, PHP и т. д. для вызоваHadoopбазовый интерфейс,Hadoop PipesподдерживаетсяC++звонить.
  • Уровень интерфейса программирования, весь этот слой состоит изJavaязык, если онJavaЕсли вы хотите развиваться, вы можете использовать этот слой напрямую.

Подробно объясните пять моделей программирования.

InputFormat

эффект

для вводаMapReduceСтандартизированная обработка документов, в основном включающаяInputSplitа такжеRecordReaderдве части.TextOutputFormatявляется форматом ввода файла по умолчанию.

InputForMat中的流程图

InputSplit

Это относится к логическому разрезанию входного файла на пары.Key-Valueстоимость. Есть два параметра, которые можно определитьInputSplitразмер блока соответственноmapred.max.split.size(обозначается какminSize)а такжеmapred.min.split.size(обозначается какmaxSize).

RecordReader

значит работать вInputSplitПосле того, как средняя резка завершена, выходKey-ValueДа, тогда поRecordReaderчитать один за другимMapperв файле. Если конкретно не определено,MapperРазмер файла определяетсяHadoopизblock_sizeрешенный,Hadoop 1.xсерединаblock_sizeда64M,существуетHadoop 2.xсерединаblock_sizeразмер128M.

размер вырезаемого блока

существуетHadoop2.xВ приведенной выше версии аsplitSizeФормула расчета

splitSize = max\{minSize,min\{maxSize, blockSize\}\}

OutputFormat

эффект

Стандартизируйте выходной файл, основная работа состоит из двух частей: одна - проверить, существует ли уже выходной каталог, если он существует, будет сообщено об ошибке, другая - вывести окончательный файл результата в файловую систему,TextOutputFormatявляется выходным форматом по умолчанию.

OnputForMat中的流程图

OutputCommiter

OutputCommiterЕсть шесть функций:

  • Операция(job) инициализация
//进行作业的初始化,建立临时目录。
//如果初始化成功,那么作业就会进入到 Running 的状态
public abstract void setupJob(JobContext var1) throws IOException;
  • Удалить задание после завершения выполнения задания
//如果这个job完成之后,就会删除掉这个job。
//例如删除掉临时的目录,然后会宣布这个job处于以下的三种状态之一,SUCCEDED/FAILED/KILLED
@Deprecated
    public void cleanupJob(JobContext jobContext) throws IOException {
    }
  • инициализацияTask
//初始化Task的操作有建立Task的临时目录
public abstract void setupTask(TaskAttemptContext var1) throws IOException;
  • проверить на фиксациюTaskрезультат
//检查是否需要提交Task,为的是Task不需要提交的时候提交出去
public abstract boolean needsTaskCommit(TaskAttemptContext var1) throws IOException;
  • представитьTask
//任务结束的时候,需要提交任务
public abstract void commitTask(TaskAttemptContext var1) throws IOException;
  • вернитесьTask
//如果Task处于KILLED或者FAILED的状态,这Task就会进行删除掉临时的目录
//如果这个目录删除不了(例如出现了异常后,处于被锁定的状态),另一个同样的Task会被执行
//然后使用同样的attempt-id去把这个临时目录给删除掉,也就说,一定会把临时目录给删除干净
 public abstract void abortTask(TaskAttemptContext var1) throws IOException;

Обработка файла побочных эффектов задачи

существуетHadoopЕсть специальный файл и специальная операция, т.е.Side-Eddect File, этот файл существует для решения определенныхTaskИз-за производительности сети или машины время выполнения слишком велико, что замедляет ход всей работы, поэтому для каждой задачи будет запускаться другая подзадача на другом узле, а затем будет выполняться та, которая обрабатывается двумя. Задание с самым быстрым результатом является конечным результатом. В это время, во избежание ввода всех файлов в один файл, файл, выводимый задачей запасного колеса, принимается какSide-Effect File

RecordWriter

это результатKEY-VALUEв файл.

Мапперы и редукторы

Объясните Mapper подробно

InputFormatдля каждогоInputSplitгенерироватьmapЗадача,mapperдостигается за счетjobсерединаsetMapperClass(Class)метод настройки написанногоmapтакой класс

//设置要执行的mapper类
job.setMapperClass(WordMapper.class);

Внутренне он вызываетmap(WritableComparable, Writable, Context)Этот метод для записи каждой пары ключ-значение вInputSplit, программа вызоветcleanup(Context)метод для выполнения задач очистки, очистки промежуточных значений, которые не нужны.

Тип входной пары "ключ-значение" не обязательно должен совпадать с типом выходной пары "ключ-значение", а входная пара "ключ-значение" может быть сопоставлена ​​с 0 или более парами "ключ-значение". позвонивcontext.write(WritableComparable, Writable)для сбора выходных пар ключ-значение. Использование программыCounterдля подсчета количества пар ключ-значение,

существуетMapperПосле того, как выходные данные отсортированы, они делятся наReducer, общее количество чанков иreduceКоличество заданий одинаковое.

Сколько задач Mapper требуется

О том, сколько машинных узлов подходит дляmapзадача, официальная документация предполагает, что узел имеет10к100задача лучше всего, если онаcpuЕсли потребление меньше,300Это тоже возможно, самая разумная задача карты - запустить более1минута.

Подробно объясните Редуктор

ReducerЗадача состоит в том, чтобыMapperПосле статистического объединения выходных результатов они выводятся в файловую систему. Пользователь может настроитьReducerколичество, используяJob.setNumReduceTasks(int)Сюда. вызовReducer, с использованиемJob.setReducerClass(Class)метод, который вызывается внутриreduce(WritableComparable, Iterable<Writable>, Context)Этот метод, в конце, программа вызоветcleanup(Context)помыть. Нравится:

//设置要执行的reduce类
job.setReducerClass(WordReduce.class);

ReducerНа самом деле он делится на три этапа, которыеShuffle,Sortа такжеSecondary Sort.

shuffle

Этот этап означаетReducerвходной каскад, система будетReduceзадача, чтобы получить все кускиHTTPПуть

sort

Этот этап относится к вводуReducerЗначение этапа сгруппировано,sortа такжеshuffleЭто выполняется одновременно, поэтому можно понять, что при вводе одновременно выполняется сортировка.

Secondary Sort

Этот этап необязателен, только в середине процессаkeyотсортировано и вreduceперед вводомkeyЭтот процесс будет запущен только тогда, когда правила сортировкиJob.setSortComparatorClass(Class)указатьComparatorсортировать, а затем объединятьJob.setGroupingComparatorClass(Class)Чтобы сгруппировать, и, наконец, можно добиться вторичной сортировки.

На протяженииreduceВывод не отсортирован

Сколько требуется задач Reducer

Предложение0.95или1.75*mapred.tasktracker.reduce.tasks.maximum. если0.95, тогда ты можешьmapperКогда задача закончена, ее можно сразу же приступить к работеReducerЗадача. если1.75, то быстро работающий узел может бытьmapКогда задача выполнена, вычисляется первый раунд, а затем можно вычислить второй раунд, когда другие узлы будут выполнены. Конечно,ReduceЧем больше количество задач, тем лучше, чем больше количество задач увеличит нагрузку на систему, но может улучшить балансировку нагрузки, тем самым уменьшив негативное влияние, вызванное сбоем.

Partitioner

Этот модуль используется для разделения пространства ключ-значение и управляетmapв задачеkeyРаздел сегментации значений, используемый по умолчанию алгоритм - хеш-функция,HashPartitionerпо умолчаниюPartitioner.

Суммировать

В этой статье в основном говорится оMapReduceМодель каркаса разделена на три уровня: уровень пользовательской программы, уровень инструментов и уровень интерфейса программирования.На уровне интерфейса программирования имеется пять моделей программирования, которыеInputFomat,MapperReduce,Partitioner,OnputFomatа такжеReducer. В основном частичная теория, справочный пример кода может относиться к официальному примеру:WordCount_v2.0

ЭтоMapReduceВторая часть серии, о которой напишу в следующейMapReduceКонфигурация домашнего задания и окружающая среда в сочетании с кратким изложением некоторых вопросов интервью, так что следующая статья все еще полна галантереи, просто ждите ее с нетерпением.

Для получения дополнительной галантереи, пожалуйста, обратите внимание на мой публичный аккаунт: spacedong

image