предисловие
В прошлом разделе мы говорили о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