предисловие
В прошлом разделе мы говорили оMapReduceСценарии приложений и анализ архитектуры в , и, наконец, использовалиCountWordизDemoпродемонстрировать, оMapReduceконкретная операция. Если вы еще этого не знаете, то можете прочитать предыдущую статью:Первое знакомство со сценарием приложения MapReduce (с кодом JAVA и Python)
Далее мы расскажем оMapReduceОсновная цель этой статьи — разъяснитьMapreduceСколько существует моделей программирования и как они координируются и взаимодействуют?Мы постараемся проанализировать их с точки зрения исходного кода и, наконец, объяснить, как называются разные языки.HadoopсерединаMapreduceизAPIиз.
содержание
- Фреймворк для модели программирования MapReduce
- Подробное объяснение пяти моделей программирования
- InputFormat
- OutPutFormat
- Mapper
- Reducer
- Partitioner
- Суммировать
Фреймворк для модели программирования 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является форматом ввода файла по умолчанию.
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является выходным форматом по умолчанию.
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