63
Map Reduce взгляд вглубь Павел Мезенцев [email protected]

MapReduce взгляд вглубь

  • Upload
    -

  • View
    696

  • Download
    0

Embed Size (px)

DESCRIPTION

Слайды с лекция в МГТУ им. Баумана. 11.03.2013

Citation preview

Page 1: MapReduce взгляд вглубь

Map Reduce взгляд вглубь

Павел Мезенцев

[email protected]

Page 2: MapReduce взгляд вглубь

План

● Что такое MapReduce

● Элементарные запросы

● Алгоритмы машинного обучения

Page 3: MapReduce взгляд вглубь

История MapReduce

2003 г. Презентация Google MapReduce

2005 г. Начало разработки Hadoop в Yahoo

2007 г. Первый “боевой” Hadoop в Yahoo (4 500 нод)

2011 г. Стабильный релиз Hadoop 1.0

Page 4: MapReduce взгляд вглубь

Где используется Hadoop?

Page 5: MapReduce взгляд вглубь

Из чего состоит Hadoop

Распределенная файловая система HDFS● Name Node ● Data Node

Система вычислений MapReduce● Job Tracker● Task Tracker

Page 6: MapReduce взгляд вглубь

Архитектура Hadoop

Page 7: MapReduce взгляд вглубь

Парадигма MapReduce

(k 1, v1)→ list (k 2,v2)

(k 2 , list (v2))→ list (k 3, v3)

● Map

● Reduce

● Shuffle & sort

Page 8: MapReduce взгляд вглубь

Свойства MapReduce

Отказоустойчивость● Репликация● Промежуточные данные хранятся на диске Вычислительная эффективность● Последовательная работа с диском● Data Locality● Speculative Execution

Page 9: MapReduce взгляд вглубь

Элементарные операции

● Filter● Sort● Aggregate● Join

Page 10: MapReduce взгляд вглубь

Логи Апача

ip - - [time] "GET url HTTP 1.0" responce size referrer "user agent"

234.248.187.116 - - [01/May/2012:00:11:14 +0400] "GET http://news.rambler.ru/84459.html HTTP 1.0" 200 3347 - "Mozilla/5.0 (Windows; I; Windows NT 5.1; ru; rv:1.9.2.1... 234.248.187.116 - - [01/May/2012:00:12:47 +0400] "GET http://news.rambler.ru/14545.html HTTP 1.0" 200 12905 http://news.rambler.ru/84459.html "Mozilla/5.0 (Windows; I... 234.248.187.116 - - [01/May/2012:00:15:39 +0400] "GET http://news.rambler.ru/92834.html HTTP 1.0" 200 13995 http://news.rambler.ru/14545.html "Mozilla/5.0 (Windows; I... 234.248.187.116 - - [01/May/2012:00:15:50 +0400] "GET http://news.rambler.ru/59243.html HTTP 1.0" 200 15434 http://news.rambler.ru/92834.html "Mozilla/5.0 (Windows; I... 234.248.187.116 - - [01/May/2012:00:16:22 +0400] "GET http://news.rambler.ru/26836.html HTTP 1.0" 200 19972 http://news.rambler.ru/59243.html "Mozilla/5.0 (Windows; I... 234.248.187.116 - - [01/May/2012:00:17:33 +0400] "GET http://news.rambler.ru/69898.html HTTP 1.0" 200 5339 http://news.rambler.ru/26836.html "Mozilla/5.0 (Windows; I... 234.248.187.116 - - [01/May/2012:00:19:01 +0400] "GET http://news.rambler.ru/33116.html HTTP 1.0" 200 17092 http://news.rambler.ru/69898.html "Mozilla/5.0 (Windows; I... 234.248.187.116 - - [01/May/2012:00:19:44 +0400] "GET http://news.rambler.ru/70344.html HTTP 1.0" 200 17505 http://news.rambler.ru/33116.html "Mozilla/5.0 (Windows; I... 234.248.187.116 - - [01/May/2012:00:22:29 +0400] "GET http://news.rambler.ru/36486.html HTTP 1.0" 200 5631 http://news.rambler.ru/70344.html "Mozilla/5.0 (Windows; I... 234.248.187.116 - - [01/May/2012:00:22:55 +0400] "GET http://news.rambler.ru/86889.html HTTP 1.0" 200 12829 http://news.rambler.ru/36486.html "Mozilla/5.0 (Windows; I... 234.248.187.116 - - [01/May/2012:00:24:30 +0400] "GET http://news.rambler.ru/92288.html HTTP 1.0" 200 2567 http://news.rambler.ru/86889.html "Mozilla/5.0 (Windows; I... 206.93.190.212 - - [01/May/2012:00:25:31 +0400] "GET http://news.rambler.ru/19636.html HTTP 1.0" 200 18800 - "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trid... 234.248.187.116 - - [01/May/2012:00:26:17 +0400] "GET http://news.rambler.ru/71652.html HTTP 1.0" 200 9754 http://news.rambler.ru/92288.html "Mozilla/5.0 (Windows; I... 206.93.190.212 - - [01/May/2012:00:26:22 +0400] "GET http://news.rambler.ru/77419.html HTTP 1.0" 200 13543 http://news.rambler.ru/19636.html "Mozilla/5.0 (compatible... 56.134.253.176 - - [01/May/2012:00:26:22 +0400] "GET http://news.rambler.ru/22870.html HTTP 1.0" 200 4941 - "Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us... 234.248.187.116 - - [01/May/2012:00:26:59 +0400] "GET http://news.rambler.ru/16899.html HTTP 1.0" 200 16334 http://news.rambler.ru/71652.html "Mozilla/5.0 (Windows; I... 56.134.253.176 - - [01/May/2012:00:27:19 +0400] "GET http://news.rambler.ru/75525.html HTTP 1.0" 200 19956 http://news.rambler.ru/22870.html "Mozilla/5.0 (iPad; U; C... 234.248.187.116 - - [01/May/2012:00:28:21 +0400] "GET http://news.rambler.ru/89381.html HTTP 1.0" 200 2163 http://news.rambler.ru/16899.html "Mozilla/5.0 (Windows; I... 206.93.190.212 - - [01/May/2012:00:28:53 +0400] "GET http://news.rambler.ru/51517.html HTTP 1.0" 200 4098 http://news.rambler.ru/77419.html "Mozilla/5.0 (compatible... 56.134.253.176 - - [01/May/2012:00:29:18 +0400] "GET http://news.rambler.ru/82514.html HTTP 1.0" 200 15383 http://news.rambler.ru/75525.html "Mozilla/5.0 (iPad; U; C... 206.93.190.212 - - [01/May/2012:00:30:15 +0400] "GET http://news.rambler.ru/16247.html HTTP 1.0" 200 15262 http://news.rambler.ru/51517.html "Mozilla/5.0 (compatible... 234.248.187.116 - - [01/May/2012:00:30:20 +0400] "GET http://news.rambler.ru/95348.html HTTP 1.0" 200 2282 http://news.rambler.ru/89381.html "Mozilla/5.0 (Windows; I... 206.93.190.212 - - [01/May/2012:00:30:42 +0400] "GET http://news.rambler.ru/77261.html HTTP 1.0" 200 2396 http://news.rambler.ru/16247.html "Mozilla/5.0 (compatible... 56.134.253.176 - - [01/May/2012:00:32:05 +0400] "GET http://news.rambler.ru/35353.html HTTP 1.0" 200 5436 http://news.rambler.ru/82514.html "Mozilla/5.0 (iPad; U; C... 206.93.190.212 - - [01/May/2012:00:32:42 +0400] "GET http://news.rambler.ru/94600.html HTTP 1.0" 200 13284 http://news.rambler.ru/77261.html "Mozilla/5.0 (compatible... 234.248.187.116 - - [01/May/2012:00:32:43 +0400] "GET http://news.rambler.ru/33780.html HTTP 1.0" 200 14543 http://news.rambler.ru/95348.html "Mozilla/5.0 (Windows; I... 206.93.190.212 - - [01/May/2012:00:32:58 +0400] "GET http://news.rambler.ru/63754.html HTTP 1.0" 200 7173 http://news.rambler.ru/94600.html "Mozilla/5.0 (compatible... 206.93.190.212 - - [01/May/2012:00:33:10 +0400] "GET http://news.rambler.ru/53586.html HTTP 1.0" 200 6737 http://news.rambler.ru/63754.html "Mozilla/5.0 (compatible... 234.248.187.116 - - [01/May/2012:00:34:27 +0400] "GET http://news.rambler.ru/66747.html HTTP 1.0" 200 4256 http://news.rambler.ru/33780.html "Mozilla/5.0 (Windows; I... ….................................................................................................................................................................................................................................................................................................

Page 11: MapReduce взгляд вглубь

Filter

Только map стадия

Пример: Найти все логи поисковых переходов

Page 12: MapReduce взгляд вглубь

Пример Java кода

public static class FilterMapper extends Mapper <LongWritable, Text, Text, NullWritable> { protected void map (LongWritable key, Text logLine, Context context) {

ApacheLogLine apacheLogLine = new ApacheLogLine (logLine.toString ());

if (apacheLogLine.getReferrer ().contains ("yandex.ru")) { context.write(logLine, NullWritable.get ()); } } }

Page 13: MapReduce взгляд вглубь

Драйвер задачи

public class FilterPrimitive{ public static int main (String [] args) throws Exception { Job job = new Job (); job.setJarByClass(FilterPrimitive.class); job.setMapperClass(FilterMapper.class);

job.setNumReduceTasks (0);

job.setOutputKeyClass (Text.class); job.setOutputValueClass(NullWritable.class);

FileInputFormat.addInputPath(job, new Path (args [0])); FileOutputFormat.setOutputPath(job, new Path (args [1]));

int returnCode = job.waitForCompletion(true) ? 1 : 0; return returnCode; }}

Page 14: MapReduce взгляд вглубь

Sort

Используется 1 редьюсер

Пример: отсортировать логи по IP

Page 15: MapReduce взгляд вглубь

Пример Java кода

public static class SortMapper extends Mapper <LongWritable, Text, Text, NullWritable> { @Override protected void map (LongWritable key, Text logLine, Context context) throws IOException, InterruptedException { context.write(logLine, NullWritable.get ()); } }

public static class SortReducer extends Reducer <Text, NullWritable, Text, NullWritable> { @Override protected void reduce (Text logline, Iterable <NullWritable> clicks, Context context) throws IOException, InterruptedException { for (NullWritable click : clicks) { context.write(logline, click); } } }

Page 16: MapReduce взгляд вглубь

Aggregate

Map-Reduce операция общего вида

Пример:

посчитать число кликов, сделанных с кажого из ip

Page 17: MapReduce взгляд вглубь

Пример Java кода

public static class AggregateMapper extends Mapper <LongWritable, Text, Text, NullWritable> { protected void map (LongWritable key, Text logLine, Context context) { ApacheLogLine apacheLogLine = new ApacheLogLine (logLine.toString ()); context.write(new Text (apacheLogLine.getIp ()), NullWritable.get ()); } }

public static class AggregateReducer extends Reducer <Text, NullWritable, Text, LongWritable> { protected void reduce (Text ip, Iterable <NullWritable> clicks, Context context) { int clicksCount = 0; for (NullWritable click : clicks) { clicksCount ++; } context.write (ip, new LongWritable (clicksCount)); } }

Page 18: MapReduce взгляд вглубь

Join

Как можно сделать Join при помощи MapReduce?

Пример задачи: имея таблицу соотвия “IP–география” отфильтровать логи, сделанные с московских IPшников.

Page 19: MapReduce взгляд вглубь

Join

Как можно сделать Join при помощи MapReduce?

● Map-Side Join● Reduce-Side Join

Пример задачи: имея таблицу соотвия “IP–география” отфильтровать логи, сделанные с московских IPшников.

Page 20: MapReduce взгляд вглубь

Join

MultipleInputs.addInputPath (conf, hdfsPath, TextInputFormat.class, JoinMapper.class);

Page 21: MapReduce взгляд вглубь

Пример Java кода

public static class Join1Mapper extends Mapper <LongWritable, Text, Text, Text> { public void map (LongWritable lineNum, Text logLine, Context context) { ApacheLogLine apacheLogLine = new ApacheLogLine (logLine.toString ()); context.write(new Text (apacheLogLine.getIp ()), new Text ("log:" + logLine.toString ())); } }

public static class Join2Mapper extends Mapper <LongWritable, Text, Text, Text> { protected void map (LongWritable key, Text logLine, Context context) { String [] fields = logLine.toString ().split ("\t"); context.write(new Text (fields [0]), new Text ("city_name:" + fields [1])); } }

Мапперы:

Page 22: MapReduce взгляд вглубь

Пример Java кода

public static class JoinReducer extends Reducer <Text, Text, Text, NullWritable> { protected void reduce (Text ip, Iterable <Text> logsAndGeo, Context context) { List <String> logsList = new LinkedList <String> (); boolean isChosenCity = false;

while (logsAndGeo.hasNext()) { String logOrGeo = logsAndGeo.next ().toString (); if (logOrGeo == "city_name:Moscow") { isChosenCity = true; } else { logsList.add (logOrGeo.substring (5)); } }

if (isChosenCity) { for (String logLine : logsList) { context.write(new Text (logLine), NullWritable.get ()); } } }

Page 23: MapReduce взгляд вглубь

Языки высокого уровня

Apache HiveApache Pig

vs

● Скриптовый язык● Разработан в Yahoo

● SQL подобный язык● Разработан в Facebook

Page 24: MapReduce взгляд вглубь

Загрузка данных

Apache HiveApache Pig

vs

logs = LOAD '/user/mezentsev/logs' as ( ip:chararray, empty1:chararray, empty2:chararray, human_time:chararray, request:chararray, return_code:int, size:int, referrer:chararray, user_agent:chararray);

create table logs ( ip STRING, empty1 STRING, empty2 STRING, human_time STRING, request STRING, return_code INT, size INT, referrer STRING, user_agent STRING) LOCATION '/user/mezentsev/logs';

Page 25: MapReduce взгляд вглубь

Фильтрация

Apache HiveApache Pig

vsfiltered_logs = FILTER logs by (referrer matches '.*yandex.ru.*');

dump filtered_logs;

select * from logs where referrer like "%yandex.ru%";

Page 26: MapReduce взгляд вглубь

Сортировка

Apache HiveApache Pig

vssorted_logs = ORDER logs BY ip, human_time;

dump sorted_logs;

SELECT ip, human_time, request FROM logs ORDER BY ip, human_time;

Page 27: MapReduce взгляд вглубь

Агрегация

Apache HiveApache Pig

vs

logs_by_ip = GROUP logs BY ip;

ip_clicks = FOREACH logs_by_ip generate group, COUNT($1);

DUMP ip_clicks;

SELECT ip, count (1) FROM logs GROUP BY ip;

Page 28: MapReduce взгляд вглубь

Join

Apache HiveApache Pig

vs

moscow_geo = FILTER geo BY (city_name == 'Moscow');

logs_with_geo = JOIN logs BY ip, moscow_geo BY ip;

DUMP logs_with_geo;

SELECT logs.* FROM logs join geo ON logs.ip = geo.ip WHERE geo.city_name = "Moscow";

Page 29: MapReduce взгляд вглубь

Как обрабатывать данные быстро?

Page 30: MapReduce взгляд вглубь

Как обрабатывать данные быстро?

● 2010 г. Google Dremel

● 2012 г. Cloudera Impala ● 2012 г. Amazon Redshift

● 2013 г. Apache Drill

Page 31: MapReduce взгляд вглубь

Как обрабатывать данные быстро?

● SQL образный синтаксис запросов

● Результаты вычислений “не большие”

● Отсутствует отказоустойчивость

Page 32: MapReduce взгляд вглубь

MPP Архитектура

Page 33: MapReduce взгляд вглубь

Impala vs Hive

● Работают с одним хранилищем метаданных

● Производительность Impala в 4-30 раз больше

Page 34: MapReduce взгляд вглубь

Часть II

Машинное обучение на MapReduce

Page 35: MapReduce взгляд вглубь

Что такое машинное обучение?

Алгоритмы искуственного интеллекта, способные

обучаться [Wikipedia]

Page 36: MapReduce взгляд вглубь

Классификация

Page 37: MapReduce взгляд вглубь

Кластеризация

Page 38: MapReduce взгляд вглубь

Регрессия

Page 39: MapReduce взгляд вглубь

Рекомендации

Page 40: MapReduce взгляд вглубь

Apache Mahout

● появился в 2008 году● 300 тыс. строк кода● означает “погонщик слона”● правильно произносить “махут”● вышла книга “Mahout in Action”

Page 41: MapReduce взгляд вглубь

Реализованные алгоритмы

Классификация● Логистическая регрессия

● Байесовские классификаторы

● Случайный лес

● Скрытые марковские цепи

Кластеризация● К-средних

● Нечеткий алгоритм K-средних

● Минимизация ожидания

● Minhash кластеризация

….............

А также● Коллаборативная фильтрация

● Генетические алгоритмы

● Алгоритмы уменьшения размерностей

Page 42: MapReduce взгляд вглубь

Машинное обучение на MapReduce

● статья “MapReduce for Machine Learning on Multicore” (2008)

● Алгоритм должен быть представим в аддитивной форме по входным данным

Page 43: MapReduce взгляд вглубь

Наивный Байес

Признаки x⃗=(x(1)

...x(n)) Класс y = {0, 1}

Формула Байеса:

P( y∣x(1) , .... , x(n))=P ( y)

P(x(1) , .... , x(n)∣y)

P(x(1) , .... , x(n))

P( y∣x(1) , .... , x(n))=P ( y)

∏iP(x(i)∣y )

С

Наивное предположение:

Page 44: MapReduce взгляд вглубь

Наивный Байес на MapReduce 1

P( y)=ν( y)ν(all)

=∑ j

1( y j= y)

∑ j1

( y j ,Σsub) (total ,Σsub)

( y j ,Σ) (total ,Σ)

● Выражение

● Map: выдаем

● Reduce: выдаем

Page 45: MapReduce взгляд вглубь

Наивный Байес на MapReduce 2

P(x(i)∣y)=ν(x(i) , y)

ν( y )

((x i , y j);Σsub)

((x i , y j);Σ)

● Выражение

● Map: выдаем

● Reduce: выдаем

Page 46: MapReduce взгляд вглубь

Кластеризация K средних

Page 47: MapReduce взгляд вглубь

Реализация на MapReduce

(x , ynearest)

( y j ,(Σs ub x ,N ))

( y j , x)

Отнесение объектов к кластерам

Map: выдаем

Поиск новых центров кластеров

Map: выдаем

Reduce: выдаем

Page 48: MapReduce взгляд вглубь

Логистическая регрессия

Page 49: MapReduce взгляд вглубь

Вероятность класса

Pw (x)=1

1+exp(−w⋅x)

Page 50: MapReduce взгляд вглубь

Максимум правдоподобия

Lw (x)=∏iPw (xi)

yi(1−Pw (xi))1− y i

l(w)=∑i=1

nyi log p (xi)+(1− y i) log(1−p (xi))

w=argmaxw l(w )

Page 51: MapReduce взгляд вглубь

Метод Ньютона-Рафсона

w=w−l ' (w)

l ' ' (w)

В скалярном виде: В векторном виде

w=w−H−1∇w l(w)

∇w l(w )=(∂ l(w)

∂w1

...∂ l(w)

∂wn

) H=(∂

2 l(w)

∂w1∂w1

...∂

2 l(w)

∂w1∂wn

... ... ...∂

2 l(w)

∂wn∂w1

...∂

2 l(w)

∂wn∂wn

)

Page 52: MapReduce взгляд вглубь

MapReduce для Градиента● Выражение

● Map: вычисляем

выдаем

● Reduce: вычисляем

выдаем

∂ l(w )

∂wk

=∑i=1

m( yi−pw (x i))x i

(k)

(k , grad sub[k ])

grad [k ]=∑ grads ub[k ]

(k , grad [k ])

grads ub[k ]=∑i( y−pw (xi)) x

(k i)

Page 53: MapReduce взгляд вглубь

MapReduce для Гамильтониана

∂2 l(w)

∂wk ∂w j

=∑i=1

mpw (x i)(pw(x i)−1) xi

( j) xi(k)● Выражение

● Map: вычисляем

выдаем

● Reduce: вычисляем

выдаем

H sub [k , j ]=∑s ub....

((k , j); H sub[k , j])

H [k , j ]=H sub [k , j ]

((k , j); H [k , j])

Page 54: MapReduce взгляд вглубь

Асимптотика

Алгоритм Классическая сложность

Сложность MapReduce

Наивный Байес

K-средних

Логистическая регрессия

n – размерность пространства признаковm – число обучающих примеровP – число ядер, на которых делается обучение

O(mn+nc) O(mnP

+nc log P)

O(mnc)

O(mn2+n3)

O(mncP

+mn log P)

O(m2nP

+n3

P+n2 log P)

Page 55: MapReduce взгляд вглубь

Недостаток

Page 56: MapReduce взгляд вглубь

Недостаток

Итерационные алгоритмы машинного обучения читают с диска раз за разом одну и ту же обучающую выборку, что приводит к большим накладным расходам

Page 57: MapReduce взгляд вглубь

Vowpal Wabbit

● Проект написан на C++● Начат в 2007 году в Yahoo● Сейчас разрабатывается в MicrosoftResearch

Page 58: MapReduce взгляд вглубь

Предложенное решение

● Итерационые алгоритмы должны обучаться в одну map-стадию

● Все данные загружаются в оперативную память мапперов

● Мапперы “находят” друг друга. Выстраиваются в бинарное дерево

● Взаимодействие через операцию AllReduce

Page 59: MapReduce взгляд вглубь

AllReduce: sum - 1

1

2 3

4 5 6 7

Page 60: MapReduce взгляд вглубь

AllReduce: sum - 2

1

11 16

4 5 6 7

Page 61: MapReduce взгляд вглубь

AllReduce: sum - 3

28

11 16

4 5 6 7

Page 62: MapReduce взгляд вглубь

AllReduce: sum - 4

28

28 28

28 28 28 28

Page 63: MapReduce взгляд вглубь

Реализованные алгоритмы

● Метод сопряженных градиентов

● LBFGS