# Лабораторная работа №2. Реализация алгоритма MapReduce ## Цель * Научиться реализовывать алгоритмы в парадигме MapReduce ## Выполнение Защита лабораторной работы подразумевает наличие отчета, который должен содержать пункты задания, команды, которые вы вводите и ответы системы на них. При необходимости - комментарии по полученным результатам. ### Задачи * Разработать на языке Python алгоритм в парадигме MapReduce в соответствии с вариантом. * Разработку и тестирование допускается проводить в локальной системе. * Запустить разработанный алгоритм в среде Hadoop. * Убедиться в корректности полученных результатов. * Сформировать отчет о выполненной работе. В отчете показать финальный результат работы (или его часть). ### Варианты заданий #### 1. Сравнение посещаемости сайтов в разное время __Дано__: ежедневные журналы посещений сайтов за три дня: * [День 1](assets/visits1.txt) * [День 2](assets/visits2.txt) * [День 3](assets/visits3.txt) Формат данных: ``` 19:05:44 telegram.com 622 01:08:01 vk.com 935 22:28:55 mail.ru 154 17:15:16 mail.ru 100 ``` Первый столбец - время посещения. Второй столбец - сайт. Третий столбец - продолжительность посещения в секундах. __Требуется__: определить среднюю за три дня продолжительность посещения в первой и второй половине дня. Алгоритм должен включать этап `combiner`. Первая половина дня: с 00:00:00 по 12:59:59 Вторая половина дня: с 13:00:00 по 23:59:59 Формат вывода: ``` telegram.com 510 234 vk.com 384 651 mail.ru 154 324 ``` Первый столбец - сайт. Второй столбец - средняя продожительность посещения в первой половине дня в секундах. Третий столбец - средняя продожительность посещения во второй половине дня в секундах. #### 2. Определение минимального расстояния до каждой вершины __Дано__: [структура графа](assets/graph.txt) в виде списка смежности: ``` 1 0 {2,3,4} 2 INF {5,6} 6 INF {} ``` Первый столбец - номер вершины. Второй столбец - известное расстояние до данной вершины. Третий столбец - список смежных вершин. __Требуется__: рассчитать минимальное расстояние до каждой вершины используя метод поиска в ширину (BFS). Формат вывода: ``` 1 0 {2,3,4} 2 1 {5,6} 6 2 {} ``` Структура такая же, как и у входного файла. Вес всех ребер равен единице. Обратить внимание, что данный алгоритм итеративный, т.е. требует нескольких запусков задачи MapReduce. Итоговый результат должен отображать расстояние до __всех__ вершин графа. #### 3. PageRank __Дано__: [Структура графа сети](assets/pagerank.txt) в виде ключа, веса PageRank и смежных вершин ``` 1 0.200 {2,4} 2 0.200 {3,5} 3 0.200 {4} ... ``` Параметры: ``` alpha = 0.1 ``` __Требуется__: рассчитать веса PageRank по прошествии 3 итераций. ``` 1 0.080 {2,4} 2 0.170 {3,5} 3 0.170 {4} ... ``` Структура такая же, как и у входного файла. Все округления до 3 знаков после запятой. #### 4. TF-IDF __Дано__: [Текст трех произведений](assets/shakespear.txt). В начале каждой строки указан номер произведения. __Требуется__: рассчитать tf-idf вес каждого слова в каждом произведении. Формат вывода: ``` Слово1#1 0.123 Слово1#2 0.234 Слово2#1 0.678 ``` После слова через решетку идет номер документа, далее через отступ - tf-idf вес данного слова в данном документе. ### Вопросы 1. Какие этапы существуют у MapReduce задач? 2. Какие принцип должны закладываться в алгоритмы, написанные в парадигме MapReduce? 2. В каком виде осуществляется передача данных между Map и Reduce? 3. Как определяется число mapper-процессов в MapReduce задаче? 4. Как могут представляться графы в математическом виде? Как они обычно представляются в задачах MapReduce? 5. В чем заключается и как работает алгоритм PageRank?