Contenu connexe
Similaire à Hadoop presentation (20)
Hadoop presentation
- 1. Hadoop
Vladimir Orlov
vorl@codeminders.com
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 2. О чем я расскажу?
• О Hadoop в кратце
• Примеры из жизни
• Установка и настройка
• Оптимизация MR-заданий
• Отладка и алгоритмы
- 4. Нadoop это:
• MapReduce: JobTracker, TaskTracker
• HDFS: NameNode, DataNode
• Скрипты для управления кластером
• Скрипты для работы с HDFS
• API для написания MR-заданий
• Hadoop-Streaming для не-Java MR
заданий
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 5. Зоопарк Нadoop это:
• Hive, Pig – аналоги Sawzall
• HBase – аналог BigTable
• Zookeeper – аналог Chubby
• Mahout – коллекция MR
алгоритмов
• Nutch – open-source кровлер
• Oozie, Azkaban, Hamake, Cascading
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 6. Терминология
• Job (задание) – “вся программа” – выполнение Mapper'ов и
Reducer'ов на всем множестве входных данных
• Task (задача) – выполнение Mapper'ов и Reducer'ов на части
входных данных
• Task Attempt (попытка выполнения задачи) – экземпляр
запущенной задачи на определенной машине
• Mapper - map (in_key, in_value) -> (inter_key, inter_value) list
• Reducer - reduce (inter_key, inter_value list) -> (out_key,
out_value) list
• Partitioner – класс, ответственный за распределение пар
ключ/значение м/у reducer'ами
• Input/Output Format – формат входных/выходных данных
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 7. Реализация MR заданий
1.Создаем 2 класса, наследующие MapReduceBase и
реализующие интерфейсы Mapper (с вашей map-
функцией) и Reducer (с вашей reduce-функцией)
2.Конфигурируем MapReduce-задание, создав
экземпляр класса JobConf
3.Передаем в JobConf параметры: путь к входному
файлу на HDFS, путь к директории c результатом,
формат входных и выходных данных, класс с map-
функцией, класс с reduce-функцией
4.Вызваем метод JobConf.runJob()
5.Дальше - за вас работает Hadoop
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 9. Корпоративный Веб-кровлер
●
Цель - реализация кровлера, собирающего и
индексирующего данные с заданных веб-
сайтов
●
Технологии:
●
Nutch + Hadoop + HDFS – кровлинг и
индексация
●
Lucene + Solr – хранение, распределение
индекса и обработка поисковых запросов
●
Zookeeper – синхронизация м/у
компонентами
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 11. Особенности проекта
●
Индексация – средствами Nutch
●
Hadoop кластер на Windows
●
Синхронизация – Zookeeper
●
Ручное распределение индекса. Для обработки
поисковых запросов –
Solr Sharding:
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 12. Поиск одинаковых книг
●
Цель - определение книг, не отличающихся по
содержанию среди всех, которые поступают на
fb2pdf.com
●
Технологии:
●
Hadoop + Mahout – кластеризация книг. В
качестве меры расстояния – косинусное
расстояние. Алгоритм кластеризации -
Canopy
●
Hamake – объединение MR-заданий в
процесс
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 14. Несколько слов о Hamake...
●
Наблюдение 1: большинство задач по
обработке данных нуждаются в более чем
одном MR-задании.
●
Наблюдение 2: большинство таких заданий
«управляются данными« (data-driven)
●
Hamake – утилита, которая позволяет описать
процесс обработки данных ввиде потока, и
запустить этот процесс на выполнение.
●
Поток представляет собой DAG, где узлы –
данные, ребра – правило изменения данных.
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 15. Fold и Foreach
<fold name="FindSimilar"> <foreach name="CalculateTF">
<input> <input>
<file id="TFVector" path="/TF" /> <fileset id="terms" path="/terms" />
</input> </input>
<output> <output>
<include idref="clustersList" path="/clusters"/> <file id="TFVector" path="/TF/${foreach:filename}" />
</output> </output>
<mapreduce jar="${lib}/hadoopJobs.job" <mapreduce jar="${lib}/hadoopJobs.job"
main="com.example.Canopy"> main="com.example.CalculateTF">
... ...
</mapreduce> </mapreduce>
</fold> </foreach>
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 16. Запуск процесса в Hamake
hadoop jar hamake-2.0b-3.jar -f hamakefile.xml
>10/05/05 17:28:55 INFO hamake.Main: Using Hadoop 0.xx.x
>10/05/05 17:28:55 INFO hamake.Main: Working dir: file:/home/project/HaMake/src/hamake
>10/05/05 17:28:55 INFO hamake.Main: Reading hamake-file my-first-hamakefile.xml
>10/05/05 17:28:59 INFO hamake.TaskRunner: Starting randomtextwriter
...
>10/05/05 17:29:05 WARN hamake.Hamake: Some of your tasks have called System.exit()
method. This is not recommended behaviour because it will prevent Hamake from launching other
tasks.
>10/05/05 17:29:05 INFO hamake.TaskRunner: Execution of randomtextwriter is completed
>10/05/05 17:29:05 INFO hamake.TaskRunner: Starting wordcount
...
>10/05/05 17:29:10 WARN hamake.Hamake: Some of your tasks have called System.exit()
method. This is not recommended behaviour because it will prevent Hamake from launching other
tasks.
>10/05/05 17:29:10 INFO hamake.TaskRunner: Execution of wordcount is completed
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 18. Установка Hadoop
• Пользуйтесь дистрибутивами Hadoop :
●
Cloudera's CDH
●
Yahoo Distribution of Hadoop
• Hadoop не работает на Windows (patch
#6767)
• Не используйте RAID
• Для данных в S3, пользуйтесь EMR
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 19. Важные параметры
• dfs.block.size <= 128Mb (hdfs-site.xml)
• dfs.datanode.du.reserved – оставляйте место для
системных файлов
• io.file.buffer.size <=64Kb (core-site.xml)
• mapred.child.java.opts – параметры JVM для дочерних
mapper'ов и reducer'ов
• io.sort.mb – количество памяти в Mb, выделяемое на
сортировку
• mapred.(map|reduce).tasks – число должно быть равно
<количеству процессоров - 1>
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 20. Тесты для Hadoop
• TestDFSIO – простой тест для HDFS
• Gridmix – группа тестов,
симулирующие «реальную» нагрузку
• RandomWriter + Sort:
hadoop jar hadoop-*-examples.jar randomwriter random-data
hadoop jar hadoop-*-examples.jar sort random-data sorted-data
hadoop jar hadoop-*-test.jar testmapredsort -sortInput random-
data -sortOutput sorted-data
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 22. Самая важная оптимизация
• Не создавайте объекты без
необходимости
•
Например, ключи и значения в mapper'е и
reducer'е
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 23. Почему?
1.Создание объектов - дорогостоящая
операция
2.Создание объектов может приводить к
не очевидным потерям памяти
3.Все, что было создано, должно быть
освобождено сборщиком мусора
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 24. Типы данных в Hadoop
Writable Определяет протокол
десериализации. Каждый тип данных
в Hadoop является Writable..
Определяет порядок сортировки. Все
WritableComparable ключи должны быть того же типа (но
не значения).
IntWritable
LongWritable Конкретные классы для различный
типов данных.
Text
…
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 25. Классы-обертки
● типы данных в Hadoop являются “обертками” :
• Text: строковый тип данных
• IntWritable: целые числа
• LongWritable: длинные целые числа
• FloatWritable: числа с плавающей точкой
• …
● Почему? Writable определяет формат передачи данных
по сети
● Классы-обертки и их содержимое :
• Важное различие!
• Позволяет повторное использование оберток
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 26. Не переопределяйте объекты
Map class Map class
key = new key()
value = new value()
Map method (key, input) Map method (key, input)
key = new key(…) key.set(…)
value = new value(…) value.set(…)
… …
EMIT (key, value) EMIT (key, value)
Не верно! Верно!
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 27. Reducer
● Внутри reducer, API предоставляет Вам итератор
поверх значений
• Будте внимательны - это каждый раз тот же самый
объект, заполненный другим содержимым!
protected void reduce(KEYIN key, Iterable<VALUEIN> values, Context context
) throws IOException, InterruptedException {
for(VALUEIN value: values) {
context.write((KEYOUT) key, (VALUEOUT) value);
}
}
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 28. WritableComparable
● Между фазами map и reduce: сортировка и перетасовка
• Наивный подход: десериализация ключа
и использование метода compareTo
• например, a.compareTo(b)
• В чем проблема?
● WritableComparator: сравнивайте побайтно
• Избегаем накладных расходов по созданию объекта
• Операция может быть прервана досрочно, как
только порядок устновлен
• Реализуйте для очень быстрой сортировки!
• Пример – org.apache.hadoop.io.Text
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 29. Combiner : WordCount
Map(String key, String value):
// key: имя документа
// value: содержимое документа
for each word w in value:
Emit(w, 1);
Reduce(String key, Iterator<Integer> values):
// key: слово, одно и тоже для ввода и ввывода
// values: список счетчиков
int result = 0;
for each v in values:
result += v;
Emit(key, result);
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 30. WordCount без Combiner'а
dog 1 cat 1
cat 1 bird 1
dog 1 cat 1
dog 1 dog 1
Sort and Shuffle
dog 1 1 1 1 cat 1 1 1 bird 1
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 31. WordCount c Combiner'ом
dog 1 cat 1
cat 1 bird 1
dog 1 cat 1
dog 1 dog 1
Combine Combine
cat 1 bird 1
dog 3 cat 2 dog 1
Sort and Shuffle
dog 3 1 cat 1 2 bird 1
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 32. Зачем нужен partitioner
●
При степенном распределении пространства
ключей фаза reduce может
вызываеть задержки
●
Помните подсчет слов -к сожалению, reducer
завяз на подсчете количества слов “the”
●
Почему спекулятивное исполнение не
справляется с этим?
●
Полезен при сортировке
int getPartition(K2 key, V2 value, int numPartitions);
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 33. Отладка MR-заданий
●
Программная логика должна быть Hadoop-
независимой
•
Не используйте Hadoop специфические
классы (OutputCollector, Reporter, Writable)
без крайней необходимости
•
Работайте с Hadoop API на интерфейсном
уровне
Copyright © 2011 Codeminders <vorl@codeminders.com>
- 36. Дополнительная информация
1. Книга "Hadoop: The Definitive Guide", Tom White,
2009
2. Книга "Data-Intensive Text Processing with
MapReduce" Jimmy Lin, 2010
3. Проект Mahout: http://mahout.apache.org/
4. Проект Hamake: http://code.google.com/p/hamake/
5. Проект Nutch: http://nutch.apache.org/
6. Сайт компании Cloudera: http://www.cloudera.com/
7. Yahoo! Hadoop distribtion:
http://developer.yahoo.com/hadoop/distribution/
Copyright © 2011 Codeminders <vorl@codeminders.com>