# Лабораторная работа №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?