Download - Hadoop presentation
О чем я расскажу?
• О Hadoop в кратце• Примеры из жизни• Установка и настройка • Оптимизация MR-заданий• Отладка и алгоритмы
О Hadoop
Нadoop это:
• MapReduce: JobTracker, TaskTracker• HDFS: NameNode, DataNode• Скрипты для управления кластером• Скрипты для работы с HDFS• API для написания MR-заданий• Hadoop-Streaming для не-Java MR
заданий
Copyright © 2011 Codeminders <[email protected]>
Зоопарк Нadoop это:
• Hive, Pig – аналоги Sawzall• HBase – аналог BigTable• Zookeeper – аналог Chubby• Mahout – коллекция MR
алгоритмов• Nutch – open-source кровлер• Oozie, Azkaban, Hamake, Cascading
Copyright © 2011 Codeminders <[email protected]>
Терминология
• 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 <[email protected]>
Реализация 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 <[email protected]>
Примеры из жизни
Корпоративный Веб-кровлер
● Цель - реализация кровлера, собирающего и индексирующего данные с заданных веб-сайтов
● Технологии: ● Nutch + Hadoop + HDFS – кровлинг и
индексация● Lucene + Solr – хранение, распределение
индекса и обработка поисковых запросов● Zookeeper – синхронизация м/у
компонентамиCopyright © 2011 Codeminders <[email protected]>
Схема Компонентов
Copyright © 2011 Codeminders <[email protected]>
Особенности проекта● Индексация – средствами Nutch● Hadoop кластер на Windows● Синхронизация – Zookeeper● Ручное распределение индекса. Для обработки
поисковых запросов – Solr Sharding:
Copyright © 2011 Codeminders <[email protected]>
Поиск одинаковых книг
● Цель - определение книг, не отличающихся по содержанию среди всех, которые поступают на fb2pdf.com
● Технологии: ● Hadoop + Mahout – кластеризация книг. В
качестве меры расстояния – косинусное расстояние. Алгоритм кластеризации - Canopy
● Hamake – объединение MR-заданий в процесс
Copyright © 2011 Codeminders <[email protected]>
Цепочка MR-заданий
Copyright © 2011 Codeminders <[email protected]>
Несколько слов о Hamake...
● Наблюдение 1: большинство задач по обработке данных нуждаются в более чем одном MR-задании.
● Наблюдение 2: большинство таких заданий «управляются данными« (data-driven)
● Hamake – утилита, которая позволяет описать процесс обработки данных ввиде потока, и запустить этот процесс на выполнение.
● Поток представляет собой DAG, где узлы – данные, ребра – правило изменения данных.
Copyright © 2011 Codeminders <[email protected]>
Fold и Foreach
<foreach name="CalculateTF">
<input>
<fileset id="terms" path="/terms" />
</input>
<output>
<file id="TFVector" path="/TF/${foreach:filename}" />
</output>
<mapreduce jar="${lib}/hadoopJobs.job" main="com.example.CalculateTF">
...
</mapreduce>
</foreach>
<fold name="FindSimilar"> <input> <file id="TFVector" path="/TF" /> </input> <output> <include idref="clustersList" path="/clusters"/> </output> <mapreduce jar="${lib}/hadoopJobs.job" main="com.example.Canopy"> ... </mapreduce> </fold>
Copyright © 2011 Codeminders <[email protected]>
Запуск процесса в 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 <[email protected]>
Установка и настройка
Установка Hadoop
• Пользуйтесь дистрибутивами Hadoop :● Cloudera's CDH● Yahoo Distribution of Hadoop
• Hadoop не работает на Windows (patch #6767)
• Не используйте RAID• Для данных в S3, пользуйтесь EMR
Copyright © 2011 Codeminders <[email protected]>
Важные параметры
• 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 <[email protected]>
Тесты для 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 <[email protected]>
Оптимизация и отладка
Самая важная оптимизация
• Не создавайте объекты без необходимости
• Например, ключи и значения в mapper'е и reducer'е
Copyright © 2011 Codeminders <[email protected]>
Почему?
1.Создание объектов - дорогостоящая операция
2.Создание объектов может приводить к не очевидным потерям памяти
3.Все, что было создано, должно быть освобождено сборщиком мусора
Copyright © 2011 Codeminders <[email protected]>
Типы данных в Hadoop
Writable
WritableComparable
IntWritableLongWritable
Text
…
Определяет протокол десериализации. Каждый тип данных в Hadoop является Writable..
Определяет порядок сортировки. Все ключи должны быть того же типа (но не значения).
Конкретные классы для различный типов данных.
Copyright © 2011 Codeminders <[email protected]>
Классы-обертки
● типы данных в Hadoop являются “обертками” :• Text: строковый тип данных• IntWritable: целые числа• LongWritable: длинные целые числа • FloatWritable: числа с плавающей точкой• …
● Почему? Writable определяет формат передачи данных по сети
● Классы-обертки и их содержимое :• Важное различие!• Позволяет повторное использование оберток
Copyright © 2011 Codeminders <[email protected]>
Не переопределяйте объекты
Map method (key, input)
key = new key(…) value = new value(…) … EMIT (key, value)
Map class
Не верно!
Map method (key, input)
key.set(…) value.set(…) … EMIT (key, value)
Map class
Верно!
key = new key()value = new value()
Copyright © 2011 Codeminders <[email protected]>
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 <[email protected]>
WritableComparable● Между фазами map и reduce: сортировка и перетасовка
• Наивный подход: десериализация ключа и использование метода compareTo
• например, a.compareTo(b)• В чем проблема?
● WritableComparator: сравнивайте побайтно• Избегаем накладных расходов по созданию объекта • Операция может быть прервана досрочно, как
только порядок устновлен• Реализуйте для очень быстрой сортировки!• Пример – org.apache.hadoop.io.Text
Copyright © 2011 Codeminders <[email protected]>
Combiner : WordCountMap(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 <[email protected]>
WordCount без Combiner'а
dog 1
cat 1
dog 1
dog 1
cat 1
bird 1
cat 1
dog 1
dog 1 1 1 1
Sort and Shuffle
cat 1 1 1 bird 1
Copyright © 2011 Codeminders <[email protected]>
WordCount c Combiner'омdog 1
cat 1
dog 1
dog 1
cat 1
bird 1
cat 1
dog 1
Combine
dog 3 1
Sort and Shuffle
cat 1 2 bird 1
Combine
cat 1
dog 3
bird 1
cat 2
Copyright © 2011 Codeminders <[email protected]>
dog 1
Зачем нужен partitioner
● При степенном распределении пространства ключей фаза reduce может вызываеть задержки
● Помните подсчет слов -к сожалению, reducer завяз на подсчете количества слов “the”
● Почему спекулятивное исполнение не справляется с этим?
● Полезен при сортировке
int getPartition(K2 key, V2 value, int numPartitions);Copyright © 2011 Codeminders <[email protected]>
Отладка MR-заданий
● Программная логика должна быть Hadoop- независимой
• Не используйте Hadoop специфические классы (OutputCollector, Reporter, Writable) без крайней необходимости
• Работайте с Hadoop API на интерфейсном уровне
Copyright © 2011 Codeminders <[email protected]>
Последовательность отладки
1.JUnit2.LocalJobRunner. Недостатки :
• DistributedCache не работает• mapred.reduce.tasks всегда 1• абсолютно отдельная ветвь кода…
3.MiniDFSCluster и MiniMRCluster
Copyright © 2011 Codeminders <[email protected]>
Литература и вопросы
Дополнительная информация
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 <[email protected]>
?