Постом ранее я достаточно подробно описал что же такое MapReduce. Наверное своим описанием еще больше Вас запутал. Но ничего думаю практический пример расставит все на свои места. Итак, давайте посчитаем слова! Да, это тот самый wordcount, только взгляд на него будет изнутри.
Итак, нам дан текст:
Мой дядя самых честных правил,
Когда не в шутку занемог,
Он уважать себя заставил
И лучше выдумать не мог.
Запускаем программу, смотрим на картинку и осознаем что же происходит за сценой:
1) Шаг InputFormat :
InputFormat - TextInputFormat, потому что если в Java коде явно не указывается тип входных данных, берется TextInputFormat по умолчанию.
InputFormat - TextInputFormat, потому что если в Java коде явно не указывается тип входных данных, берется TextInputFormat по умолчанию.
2) Шаг Split;
Далее входной файл разбивается на блоки данных, что бы впоследствии сассоциировать один блок с одним map. Так как текст у нас невелик - скорее всего он полностью поместиться в один блок.
3) Шаг RecordReader (RR):
после того, как мы поняли, что это текст, и что ключом, в случае текста, будет смещение, а значение - остальная строка, строчку за строчкой (пару за парой) передаем вот это вот дело
K0,V0, где K0 – смещение начала стороки относительно документа(потому что формат TextInputFormat)
(0 ; Мой дядя самых честных правил)
(31; Когда не в шутку занемог)
(54; Он уважать себя заставил)
(78; И лучше выдумать не мог)
программе map. RecordReader - цикл, который будет вызван в данном случае 4 раза. После того как отработает последний map на выходе будет что то вроде:
4) Шаг Map
5) Шаг Partitioner (+ shuffle):
На этом шаге определяется куда какая пара будет переслана, на какой сервер, на какой reduce. Если в коде специальным образом не указан класс partitioner - идет разбиенеие на основе hash функции от K1, например от "выдумать" или "честных"...
6) Шаг Sort
После пересылки запускается шаг Sort, на котром происходит преобразоавние K1, V1 к структуре K1, list(V) и сортировка по ключу. В итоге получается:
7) Ну и после того как все данные будут отсортированы они передаются на вход reduce(Java класс, который пишется програмистом, как и Map класс), который выполняет преобразование K1, list(V) в результирующие K2,V2.
Получается вот так:
Собственно все. Надеюсь после этого поста все стало намного понятнее. Если нет - welcome, задавайте вопросы!
Далее входной файл разбивается на блоки данных, что бы впоследствии сассоциировать один блок с одним map. Так как текст у нас невелик - скорее всего он полностью поместиться в один блок.
3) Шаг RecordReader (RR):
после того, как мы поняли, что это текст, и что ключом, в случае текста, будет смещение, а значение - остальная строка, строчку за строчкой (пару за парой) передаем вот это вот дело
K0,V0, где K0 – смещение начала стороки относительно документа(потому что формат TextInputFormat)
(0 ; Мой дядя самых честных правил)
(31; Когда не в шутку занемог)
(54; Он уважать себя заставил)
(78; И лучше выдумать не мог)
программе map. RecordReader - цикл, который будет вызван в данном случае 4 раза. После того как отработает последний map на выходе будет что то вроде:
4) Шаг Map
5) Шаг Partitioner (+ shuffle):
На этом шаге определяется куда какая пара будет переслана, на какой сервер, на какой reduce. Если в коде специальным образом не указан класс partitioner - идет разбиенеие на основе hash функции от K1, например от "выдумать" или "честных"...
6) Шаг Sort
После пересылки запускается шаг Sort, на котром происходит преобразоавние K1, V1 к структуре K1, list(V) и сортировка по ключу. В итоге получается:
7) Ну и после того как все данные будут отсортированы они передаются на вход reduce(Java класс, который пишется програмистом, как и Map класс), который выполняет преобразование K1, list(V) в результирующие K2,V2.
Получается вот так:
Собственно все. Надеюсь после этого поста все стало намного понятнее. Если нет - welcome, задавайте вопросы!
No comments:
Post a Comment