Upload
-
View
696
Download
0
Embed Size (px)
DESCRIPTION
Слайды с лекция в МГТУ им. Баумана. 11.03.2013
Citation preview
План
● Что такое MapReduce
● Элементарные запросы
● Алгоритмы машинного обучения
История MapReduce
2003 г. Презентация Google MapReduce
2005 г. Начало разработки Hadoop в Yahoo
2007 г. Первый “боевой” Hadoop в Yahoo (4 500 нод)
2011 г. Стабильный релиз Hadoop 1.0
Где используется Hadoop?
Из чего состоит Hadoop
Распределенная файловая система HDFS● Name Node ● Data Node
Система вычислений MapReduce● Job Tracker● Task Tracker
Архитектура Hadoop
Парадигма MapReduce
(k 1, v1)→ list (k 2,v2)
(k 2 , list (v2))→ list (k 3, v3)
● Map
● Reduce
● Shuffle & sort
Свойства MapReduce
Отказоустойчивость● Репликация● Промежуточные данные хранятся на диске Вычислительная эффективность● Последовательная работа с диском● Data Locality● Speculative Execution
Элементарные операции
● Filter● Sort● Aggregate● Join
Логи Апача
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... ….................................................................................................................................................................................................................................................................................................
Filter
Только map стадия
Пример: Найти все логи поисковых переходов
Пример 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 ()); } } }
Драйвер задачи
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; }}
Sort
Используется 1 редьюсер
Пример: отсортировать логи по IP
Пример 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); } } }
Aggregate
Map-Reduce операция общего вида
Пример:
посчитать число кликов, сделанных с кажого из ip
Пример 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)); } }
Join
Как можно сделать Join при помощи MapReduce?
Пример задачи: имея таблицу соотвия “IP–география” отфильтровать логи, сделанные с московских IPшников.
Join
Как можно сделать Join при помощи MapReduce?
● Map-Side Join● Reduce-Side Join
Пример задачи: имея таблицу соотвия “IP–география” отфильтровать логи, сделанные с московских IPшников.
Join
MultipleInputs.addInputPath (conf, hdfsPath, TextInputFormat.class, JoinMapper.class);
Пример 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])); } }
Мапперы:
Пример 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 ()); } } }
Языки высокого уровня
Apache HiveApache Pig
vs
● Скриптовый язык● Разработан в Yahoo
● SQL подобный язык● Разработан в Facebook
Загрузка данных
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';
Фильтрация
Apache HiveApache Pig
vsfiltered_logs = FILTER logs by (referrer matches '.*yandex.ru.*');
dump filtered_logs;
select * from logs where referrer like "%yandex.ru%";
Сортировка
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;
Агрегация
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;
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";
Как обрабатывать данные быстро?
Как обрабатывать данные быстро?
● 2010 г. Google Dremel
● 2012 г. Cloudera Impala ● 2012 г. Amazon Redshift
● 2013 г. Apache Drill
Как обрабатывать данные быстро?
● SQL образный синтаксис запросов
● Результаты вычислений “не большие”
● Отсутствует отказоустойчивость
MPP Архитектура
Impala vs Hive
● Работают с одним хранилищем метаданных
● Производительность Impala в 4-30 раз больше
Часть II
Машинное обучение на MapReduce
Что такое машинное обучение?
Алгоритмы искуственного интеллекта, способные
обучаться [Wikipedia]
Классификация
Кластеризация
Регрессия
Рекомендации
Apache Mahout
● появился в 2008 году● 300 тыс. строк кода● означает “погонщик слона”● правильно произносить “махут”● вышла книга “Mahout in Action”
Реализованные алгоритмы
Классификация● Логистическая регрессия
● Байесовские классификаторы
● Случайный лес
● Скрытые марковские цепи
Кластеризация● К-средних
● Нечеткий алгоритм K-средних
● Минимизация ожидания
● Minhash кластеризация
….............
А также● Коллаборативная фильтрация
● Генетические алгоритмы
● Алгоритмы уменьшения размерностей
Машинное обучение на MapReduce
● статья “MapReduce for Machine Learning on Multicore” (2008)
● Алгоритм должен быть представим в аддитивной форме по входным данным
Наивный Байес
Признаки 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 )
С
Наивное предположение:
Наивный Байес на MapReduce 1
P( y)=ν( y)ν(all)
=∑ j
1( y j= y)
∑ j1
( y j ,Σsub) (total ,Σsub)
( y j ,Σ) (total ,Σ)
● Выражение
● Map: выдаем
● Reduce: выдаем
Наивный Байес на MapReduce 2
P(x(i)∣y)=ν(x(i) , y)
ν( y )
((x i , y j);Σsub)
((x i , y j);Σ)
● Выражение
● Map: выдаем
● Reduce: выдаем
Кластеризация K средних
Реализация на MapReduce
(x , ynearest)
( y j ,(Σs ub x ,N ))
( y j , x)
Отнесение объектов к кластерам
Map: выдаем
Поиск новых центров кластеров
Map: выдаем
Reduce: выдаем
Логистическая регрессия
Вероятность класса
Pw (x)=1
1+exp(−w⋅x)
Максимум правдоподобия
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 )
Метод Ньютона-Рафсона
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
)
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)
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])
Асимптотика
Алгоритм Классическая сложность
Сложность 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)
Недостаток
Недостаток
Итерационные алгоритмы машинного обучения читают с диска раз за разом одну и ту же обучающую выборку, что приводит к большим накладным расходам
Vowpal Wabbit
● Проект написан на C++● Начат в 2007 году в Yahoo● Сейчас разрабатывается в MicrosoftResearch
Предложенное решение
● Итерационые алгоритмы должны обучаться в одну map-стадию
● Все данные загружаются в оперативную память мапперов
● Мапперы “находят” друг друга. Выстраиваются в бинарное дерево
● Взаимодействие через операцию AllReduce
AllReduce: sum - 1
1
2 3
4 5 6 7
AllReduce: sum - 2
1
11 16
4 5 6 7
AllReduce: sum - 3
28
11 16
4 5 6 7
AllReduce: sum - 4
28
28 28
28 28 28 28
Реализованные алгоритмы
● Метод сопряженных градиентов
● LBFGS