О.В.Сухорослов "mapreduce"

77
07 MapReduce О.В. Сухорослов [email protected] 06.04.2012 О.В. Сухорослов 07 MapReduce 06.04.2012 1 / 77

Upload: yandex

Post on 05-Dec-2014

5.103 views

Category:

Documents


4 download

DESCRIPTION

О.В.Сухорослов "MapReduce", 06.04.2012, место показа МФТИ, Школа анализа данных (ШАД)

TRANSCRIPT

Page 1: О.В.Сухорослов "MapReduce"

07 MapReduce

О.В. Сухорослов

[email protected]

06.04.2012

О.В. Сухорослов () 07 MapReduce 06.04.2012 1 / 77

Page 2: О.В.Сухорослов "MapReduce"

План лекции

Модель программирования MapReduceРеализация GoogleЗнакомство с Apache Hadoop

О.В. Сухорослов () 07 MapReduce 06.04.2012 2 / 77

Page 3: О.В.Сухорослов "MapReduce"

MapReduce

Модель программирования для описания алгоритмов обработкибольших массивов данныхСреда выполнения для параллельной обработки больших объемовданныхПрограммная реализация (Google, Hadoop, ...)

О.В. Сухорослов () 07 MapReduce 06.04.2012 3 / 77

Page 4: О.В.Сухорослов "MapReduce"

Феномен Big Data

Коммерческие приложенияWeb

десятки миллиардов страниц, сотни терабайт текстаGoogle MapReduce: 100 TB данных в день (2004), 20 PB (2008)

Социальные сетиFacebook - петабайты пользовательских данных (15 TB/день)

Поведенческие данные пользователей (business intelligence)

Научные приложенияФизика высоких энергий

Большой Адронный Коллайдер - 15 PB/годАстрономия и астрофизика

Large Synoptic Survey Telescope (2015) - 1.28 PB/годБиоинформатика

Секвенирование ДНК, European Bioinformatics Institute - 5 PB(2009)

О.В. Сухорослов () 07 MapReduce 06.04.2012 4 / 77

Page 5: О.В.Сухорослов "MapReduce"

Наблюдения

Мы можем хранить все больше данныхНо латентность и пропускная способность жестких дисков неуспевают за ростом объема

Современные задачи намного превышают возможности одноймашины

Требуются кластеры из сотен и тысяч машинСтратегия scale out выгоднее стратегии scale up

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

Последовательные чтение и запись данных при обработке гораздоэффективнее случайного доступа

О.В. Сухорослов () 07 MapReduce 06.04.2012 5 / 77

Page 6: О.В.Сухорослов "MapReduce"

Наблюдения (2)

Отказы становятся нормой10K серверов с MTBF=1000d -> 10 отказов в деньНеобходимы автоматическая обработка и восстановление послеотказов

Традиционные HPC-системы имеют отдельные системы храненияданных

Большие объемы данных эффективнее обрабатывать там же, гдеони хранятся

Разрабатывать приложения для подобных систем на низкомуровне очень сложно

Требуются высокоуровневые модели программирования,скрывающие детали системного уровняТребуются универсальные среды выполнения, масштабируемые ипроверенные на корректность

О.В. Сухорослов () 07 MapReduce 06.04.2012 6 / 77

Page 7: О.В.Сухорослов "MapReduce"

Web Search

Сбор содержимого Web (crawling)offline, загрузка большого объема данных, выборочное обновление,обнаружение дубликатов

Построение инвертрованного индекса (indexing)offline, периодическое обновление, обработка большого объемаданных, предсказуемая нагрузка

Ранжирование документов для ответа на запрос (retrieval)online, сотни миллисекунд, большое кол-во клиентов, пикинагрузки

О.В. Сухорослов () 07 MapReduce 06.04.2012 7 / 77

Page 8: О.В.Сухорослов "MapReduce"

Инвертированный индекс

Исходные данные: [(docid , content)...]

Требуемый результат: [(term, [< docid , tf > ...])...]

Этап 1 - Параллельная обработка документов(docid , content)→ [(term1, < docid , tf 1 >), (term2, < docid , tf 2 >)...]

Этап 2 - Параллельная агрегация промежуточных результатов длякаждого терма

(term, [< docid1, tf 1 >,< docid2, tf 2 > ...])→ (term, [< docid , tf > ...])

О.В. Сухорослов () 07 MapReduce 06.04.2012 8 / 77

Page 9: О.В.Сухорослов "MapReduce"

Подсчет частоты встречаемости слов

Исходные данные: [(docid , content)...]

Требуемый результат: [(term, total_tf )...]

Этап 1 - Параллельная обработка документов(docid , content)→ [(term1, tf 1), (term2, tf 2)...]

Этап 2 - Параллельная агрегация промежуточных результатов длякаждого терма

(term, [tf 1, tf 2, ...])→ (term, total_tf )

О.В. Сухорослов () 07 MapReduce 06.04.2012 9 / 77

Page 10: О.В.Сухорослов "MapReduce"

Функциональное программирование

О.В. Сухорослов () 07 MapReduce 06.04.2012 10 / 77

Page 11: О.В.Сухорослов "MapReduce"

Модель программирования MapReduce

Базовой структурой данных являются пары (ключ, значение)

Программа описывается путем определения функций

map : (k1, v1)→ [(k2, v2)]

reduce : (k2, [v2])→ [(k3, v3)]

Между map и reduce происходит группировка и сортировкапромежуточных данных по ключу k2

О.В. Сухорослов () 07 MapReduce 06.04.2012 11 / 77

Page 12: О.В.Сухорослов "MapReduce"

Пример

О.В. Сухорослов () 07 MapReduce 06.04.2012 12 / 77

Page 13: О.В.Сухорослов "MapReduce"

Другие примеры

Поиск в текстеmap: (docid , content)→ [(docid , line)]reduce: нет

Группировка и сортировка по ключуmap: (key , record)→ (key , record)reduce: (key , [record ])→ (key , [record ])

Обращение Web-графаmap: (docid , content)→ [(url , docid)]reduce: (url , [docid ])→ (url , [docid ])

Анализ посещаемости сайтаmap: (logid , log)→ [(url , visit_count)]reduce: (url , [visit_count])→ (url , total_count)

Вычисление векторов ключевых слов по сайтамmap: (docid , < url , content >)→ (hostname, doc_term_vector)reduce:(hostname, [doc_term_vector ])→ (hostname, host_term_vector)

О.В. Сухорослов () 07 MapReduce 06.04.2012 13 / 77

Page 14: О.В.Сухорослов "MapReduce"

Схема вычислений

О.В. Сухорослов () 07 MapReduce 06.04.2012 14 / 77

Page 15: О.В.Сухорослов "MapReduce"

Инвертированный индекс

О.В. Сухорослов () 07 MapReduce 06.04.2012 15 / 77

Page 16: О.В.Сухорослов "MapReduce"

Параллелизм по данным

О.В. Сухорослов () 07 MapReduce 06.04.2012 16 / 77

Page 17: О.В.Сухорослов "MapReduce"

Дополнительные функции

partition : (k2, num_reducers)→ reducer_id

Определяет распределение промежуточных данных междуreduce-процессамиПростейший случай: hash(k2) mod num_reducers

combine : (k2, [v2])→ [(k2′, v2′)]

Осуществляет локальную агрегацию промежуточных данных послеmap() в рамках одного map-процессаДля ассоциативных и коммутативных операций можетиспользоваться reduce()

compare(k2, k2′)→ {−1, 0, 1}Определяет отношение порядка между промежуточными ключами

О.В. Сухорослов () 07 MapReduce 06.04.2012 17 / 77

Page 18: О.В.Сухорослов "MapReduce"

Детальная схема вычислений

О.В. Сухорослов () 07 MapReduce 06.04.2012 18 / 77

Page 19: О.В.Сухорослов "MapReduce"

Запуск MapReduce-программы

Конфигурация заданияВходные данные, способ получения (k1,v1)Функции map, reduce, partition, combine, compareМестоположение и формат выходных данныхПараметры запуска (число map- и reduce-заданий...)

Запуск задания: MapReduce.runJob(config)

Остальное берет на себя реализация среды выполнения

О.В. Сухорослов () 07 MapReduce 06.04.2012 19 / 77

Page 20: О.В.Сухорослов "MapReduce"

Обязанности реализации

Декомпозиция на параллельные подзадачи (map- и reduce-задачи)

Запуск рабочих процессов

Распределение задач по рабочим процессам и балансировканагрузки

Передача данных рабочим процессам (требуется минимизировать)

Синхронизация и передача данных между рабочими процессами

Обработка отказов рабочих процессов

О.В. Сухорослов () 07 MapReduce 06.04.2012 20 / 77

Page 21: О.В.Сухорослов "MapReduce"

Реализации MapReduce

Распределенная память (кластер)Google MapReduce (C++ / С++, Python, Java)Apache Hadoop (Java / any)Disco (Erlang / Python)Skynet (Ruby)Holumbus-MapReduce (Haskell)FileMap: File-Based Map-ReduceYandex MapReduce (С++ / any)...

Общая память (многоядерные процессоры)QtConcurrent (C++)Phoenix (C, C++)

GPUMars: A MapReduce Framework on Graphics Processors

О.В. Сухорослов () 07 MapReduce 06.04.2012 21 / 77

Page 22: О.В.Сухорослов "MapReduce"

Инфраструктура Google

Кластеры из дешевых серверовPC-class motherboards, low-end storage/networkingLinux + свое ПОСотни тысяч машинОтказы являются нормой

Распределенная файловая система GFSПоблочное хранение файлов большого размераПоследовательные чтение и запись в потоковом режимеwrite-once-read-manyРепликация, отказоустойчивость

Узлы кластера одновременно отвечают за хранение и обработкуданных

Перемещение вычислений дешевле, чем перемещение данных

ПланировщикРаспределяет ресурсы кластера между приложениями

О.В. Сухорослов () 07 MapReduce 06.04.2012 22 / 77

Page 23: О.В.Сухорослов "MapReduce"

Google Rack

О.В. Сухорослов () 07 MapReduce 06.04.2012 23 / 77

Page 24: О.В.Сухорослов "MapReduce"

Google MapReduce

О.В. Сухорослов () 07 MapReduce 06.04.2012 24 / 77

Page 25: О.В.Сухорослов "MapReduce"

Мастер

Управляет выполнением одного MapReduce-задания

Распределяет задачи между рабочими узлами кластера

Хранит состояния всех задачstatus, workerId

Осуществляет координацию между map- и reduce-задачамиПолучает информацию о файлах с промежуточными данными отmap-процессовПередает эту информацию reducе-процессам

Предоставляет информацию о статусе вычислений черезвстроенный HTTP-сервер

О.В. Сухорослов () 07 MapReduce 06.04.2012 25 / 77

Page 26: О.В.Сухорослов "MapReduce"

Оптимизации

Локальность данныхНаправлять map-задачи на узлы, хранящие требуемые данные илинаходящиеся рядом

Локальная редукцияВыполнять после map функцию сombine

Совмещение операцийЗагрузка и сортировка промежуточных данных

Спекулятивное выполнениеВ конце map или reduce запустить незавершенные задания нанескольких машинах

О.В. Сухорослов () 07 MapReduce 06.04.2012 26 / 77

Page 27: О.В.Сухорослов "MapReduce"

Загрузка результатов map-заданий

О.В. Сухорослов () 07 MapReduce 06.04.2012 27 / 77

Page 28: О.В.Сухорослов "MapReduce"

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

Сбой при выполнении задачи

Отказ рабочего узлаСбой аппаратуры, ПО или отзыв узла планировщиком (preemption)Определяется через heartbeatПерезапуск задач

Map - всех выполненных или незаконченных + уведомлениеreduce-процессовReduce только незаконченных

Отказ мастера

О.В. Сухорослов () 07 MapReduce 06.04.2012 28 / 77

Page 29: О.В.Сухорослов "MapReduce"

Семантика распределенного выполнения программы

Для детерминированных функций map и reduce гарантируетсясовпадение результата вычислений с результатомпоследовательного выполнения программы

Для недетерминированных функций map и reduce гарантируетсясовпадение результата каждой reduce-задачи с результатомпоследовательного выполнения программы

Результаты разных reduce-задач могут соответствовать разнымпоследовательным выполнениям

Атомарные операцииПередача списка промежуточных файлов от map-процесса кмастеруПереименование файла в GFS с результатом reduce-задания

Поддержка выполнения на локальной машине

О.В. Сухорослов () 07 MapReduce 06.04.2012 29 / 77

Page 30: О.В.Сухорослов "MapReduce"

Количество задач

Много больше числа машинДинамическая балансировка нагрузкиВосстановление после отказов

Число map-задач MInput / M ∼ 16-64 Mb

Число reduce-задач RВ несколько (∼2) раз больше числа машин

Для N=2000: M=200000, R=5000

О.В. Сухорослов () 07 MapReduce 06.04.2012 30 / 77

Page 31: О.В.Сухорослов "MapReduce"

MapReduce в Google

large-scale machine learning problemsclustering problems for the Google News and Froogle productsextracting data to produce reports of popular queriesextracting properties of Web pages for new experiments and productsprocessing of satellite imagery datalanguage model processing for statistical machine translationlarge-scale graph computations

О.В. Сухорослов () 07 MapReduce 06.04.2012 31 / 77

Page 32: О.В.Сухорослов "MapReduce"

Пример кода (Map)

1 #include "mapreduce/mapreduce.h"2

3 // User’s map function4 class WordCounter : public Mapper {5 public:6 virtual void Map (const MapInput& input) {7 const string& text = input.value ();8 const int n = text.size ();9 for (int i = 0; i < n; ) {

10 // Skip past leading whitespace11 while ((i < n) && isspace (text[i]))12 i++;13

14 // Find word end15 int start = i;16 while ((i < n) && !isspace(text[i]))17 i++;18 if (start < i)19 Emit(text.substr(start ,i-start),"1");20 }21 }22 };23 REGISTER_MAPPER(WordCounter );

О.В. Сухорослов () 07 MapReduce 06.04.2012 32 / 77

Page 33: О.В.Сухорослов "MapReduce"

Пример кода (Reduce)

1 // User’s reduce function2 class Adder : public Reducer {3 virtual void Reduce(ReduceInput* input ) {4 // Iterate over all entries with the5 // same key and add the values6 int64 value = 0;7 while (!input ->done ()) {8 value += StringToInt(input ->value ());9 input ->NextValue ();

10 }11

12 // Emit sum for input ->key()13 Emit(IntToString(value ));14 }15 };16 REGISTER_REDUCER(Adder);

О.В. Сухорослов () 07 MapReduce 06.04.2012 33 / 77

Page 34: О.В.Сухорослов "MapReduce"

Пример кода (main)

1 int main (int argc , char** argv) {2 ParseCommandLineFlags(argc , argv);3

4 MapReduceSpecification spec;5

6 // Store list of input files into "spec"7 for (int i = 1; i < argc; i++) {8 MapReduceInput* input = spec.add_input ();9 input ->set_format("text");

10 input ->set_filepattern(argv[i]);11 input ->set_mapper_class("WordCounter");12 }13

14 // Specify the output files :15 MapReduceOutput* out = spec.output ();16 out ->set_filebase("/gfs/test/freq");17 out ->set_num_tasks (100);18 out ->set_format("text");19 out ->set_reducer_class("Adder");

О.В. Сухорослов () 07 MapReduce 06.04.2012 34 / 77

Page 35: О.В.Сухорослов "MapReduce"

Пример кода (main)

1 // Optional: do partial sums within map2 // tasks to save network bandwidth3 out ->set_combiner_class("Adder");4

5 // Tuning parameters: use at most 20006 // machines and 100 MB of memory per task7 spec.set_machines (2000);8 spec.set_map_megabytes (100);9 spec.set_reduce_megabytes (100);

10

11 // Now run it12 MapReduceResult result ;13 if (! MapReduce(spec , &result )) abort ();14

15 // Done: ’result ’ structure contains info16 // about counters , time taken , number of17 // machines used , etc.18 return 0;19 }

О.В. Сухорослов () 07 MapReduce 06.04.2012 35 / 77

Page 36: О.В.Сухорослов "MapReduce"

Преимущества MapReduce

Модель программированияВысокий уровень абстракции за счет скрытия деталей организациивычислений внутри библиотекиПозволяет разработчику сконцентрироваться на решаемой задачеЛегкость добавления новых стадий обработки

РеализацияАвтоматическое распараллеливание, распределение заданий ибалансирование нагрузкиУстойчивость к отказамМасштабируемость

О.В. Сухорослов () 07 MapReduce 06.04.2012 36 / 77

Page 37: О.В.Сухорослов "MapReduce"

Недостатки MapReduce?

О.В. Сухорослов () 07 MapReduce 06.04.2012 37 / 77

Page 38: О.В.Сухорослов "MapReduce"

Почему не MPI?

О.В. Сухорослов () 07 MapReduce 06.04.2012 38 / 77

Page 39: О.В.Сухорослов "MapReduce"

Apache Hadoop

О.В. Сухорослов () 07 MapReduce 06.04.2012 39 / 77

Page 40: О.В.Сухорослов "MapReduce"

Цели

Открытые реализации технологий Google (GFS, MapReduce...)

Программная платформа для хранения и обработки большихобъемов данных

НадежностьМасштабируемостьЭффективностьЭкономичностьOpen Source

О.В. Сухорослов () 07 MapReduce 06.04.2012 40 / 77

Page 41: О.В.Сухорослов "MapReduce"

Подпроекты

Hadoop CommonОбщие компоненты

HDFSРаспределенная файловая система по образу GFS

MapReduceРеализация MapReduce для распределенной обработки большихобъемов данных на кластере

О.В. Сухорослов () 07 MapReduce 06.04.2012 41 / 77

Page 42: О.В.Сухорослов "MapReduce"

Архитектура Hadoop-кластера

О.В. Сухорослов () 07 MapReduce 06.04.2012 42 / 77

Page 43: О.В.Сухорослов "MapReduce"

Hadoop Distributed File System (HDFS)

Хранение больших наборов данных

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

Модель "write-once-read-many"

Streaming data access

Перемещение вычислений дешевле, чем перемещение данных

О.В. Сухорослов () 07 MapReduce 06.04.2012 43 / 77

Page 44: О.В.Сухорослов "MapReduce"

HDFS

Иерархическая структураУправляется выделенным узлом namenode

Файлы разбиваются на блоки (chunks)По умолчанию 64 Mb

Файлы хранятся на узлах datanodesРепликация, по умолчанию 3 копии

КлиентыПоиск ближайшей реплики с помощью namenodeПолучение данных напрямую с datanode

О.В. Сухорослов () 07 MapReduce 06.04.2012 44 / 77

Page 45: О.В.Сухорослов "MapReduce"

HDFS

О.В. Сухорослов () 07 MapReduce 06.04.2012 45 / 77

Page 46: О.В.Сухорослов "MapReduce"

Работа с HDFS

Командная строкаWeb-интерфейс

См. инструкцию к учебному кластеру

О.В. Сухорослов () 07 MapReduce 06.04.2012 46 / 77

Page 47: О.В.Сухорослов "MapReduce"

Hadoop MapReduce

О.В. Сухорослов () 07 MapReduce 06.04.2012 47 / 77

Page 48: О.В.Сухорослов "MapReduce"

Hadoop MapReduce

JobTrackerПринимает задания (job) от приложенийРазбивает задание на много задач (tasks)Распределяет задачи по узламОтслеживает выполнение задачОсуществляет перезапуск задач

TaskTrackerЗапрашивает новые задачиЗагружает код и запускает задачу в новой JVMУведомляет JobTracker о статусе задачиПредоставляет доступ к промежуточным файлам

О.В. Сухорослов () 07 MapReduce 06.04.2012 48 / 77

Page 49: О.В.Сухорослов "MapReduce"

Реализация MapReduce-программ для Hadoop

JavaСтандартный Java API

Другие языки и скриптыHadoop Streaming

C++ (и другие языки через SWIG)Hadoop Pipes

О.В. Сухорослов () 07 MapReduce 06.04.2012 49 / 77

Page 50: О.В.Сухорослов "MapReduce"

Hadoop Java API

http://hadoop.apache.org/mapreduce/docs/current/api/

О.В. Сухорослов () 07 MapReduce 06.04.2012 50 / 77

Page 51: О.В.Сухорослов "MapReduce"

Общая структура программы

Реализации Mapper и Reducer (Partitioner, Combiner...)

Код формирования и запуска задания

Ожидание результата или выход

О.В. Сухорослов () 07 MapReduce 06.04.2012 51 / 77

Page 52: О.В.Сухорослов "MapReduce"

Класс Mapper<K1, V1, K2, V2>

org.apache.hadoop.mapreduce.Mapper

Методыvoid setup(Mapper.Context context)void run(Mapper.Context context)void map(K1 key, V1 value, Mapper.Context context)void cleanup(Mapper.Context context)

О.В. Сухорослов () 07 MapReduce 06.04.2012 52 / 77

Page 53: О.В.Сухорослов "MapReduce"

Реализация по умолчанию

1 protected void map(KEYIN key , VALUEIN value , Context context)2 throws IOException , InterruptedException {3 context.write(( KEYOUT) key , (VALUEOUT) value );4 }5

6 public void run(Context context)7 throws IOException , InterruptedException {8 setup(context );9 while(context.nextKeyValue ()) {

10 map(context.getCurrentKey (), context.getCurrentValue (),11 context );12 }13 cleanup (context );14 }

О.В. Сухорослов () 07 MapReduce 06.04.2012 53 / 77

Page 54: О.В.Сухорослов "MapReduce"

WordCount: Mapper

1 public static class TokenizerMapper2 extends Mapper <LongWritable , Text , Text , IntWritable > {3

4 private final static IntWritable one = new IntWritable (1);5 private Text word = new Text ();6

7 public void map(LongWritable key , Text value , Context context)8 throws IOException , InterruptedException {9 StringTokenizer tok = new StringTokenizer(value.toString ());

10 while (tok.hasMoreTokens ()) {11 word.set(tok.nextToken ());12 context.write(word , one);13 }14 }15 }

О.В. Сухорослов () 07 MapReduce 06.04.2012 54 / 77

Page 55: О.В.Сухорослов "MapReduce"

Класс Reducer<K2, V2, K3, V3>

org.apache.hadoop.mapreduce.Reducer

Методыvoid setup(Reducer.Context context)run(Reducer.Context context)reduce(K2 key, Iterable<V2> values, Reducer.Context context)cleanup(Reducer.Context context)

О.В. Сухорослов () 07 MapReduce 06.04.2012 55 / 77

Page 56: О.В.Сухорослов "MapReduce"

Реализация по умолчанию

1 protected void reduce(KEYIN key , Iterable <VALUEIN > values ,2 Context context) throws IOException , InterruptedException {3 for (VALUEIN value : values) {4 context.write(( KEYOUT) key , (VALUEOUT) value );5 }6 }7

8 public void run(Context context)9 throws IOException , InterruptedException {

10 setup(context );11 while (context.nextKey ()) {12 reduce(context.getCurrentKey (), context.getValues (),13 context );14 }15 cleanup(context );16 }

О.В. Сухорослов () 07 MapReduce 06.04.2012 56 / 77

Page 57: О.В.Сухорослов "MapReduce"

WordCount: Reducer

1 public static class IntSumReducer2 extends Reducer <Text , IntWritable , Text , IntWritable > {3 public void reduce(Text key , Iterable <IntWritable > values ,4 Context context)5 throws IOException , InterruptedException {6 int sum = 0;7 for (IntWritable val : values) {8 sum += val.get();9 }

10 context.write(key , new IntWritable(sum ));11 }12 }

О.В. Сухорослов () 07 MapReduce 06.04.2012 57 / 77

Page 58: О.В.Сухорослов "MapReduce"

Конфигурация и запуск задания

1 public class WordCount extends Configured implements Tool {2

3 public static void main(String [] args) throws Exception {4 int ret = ToolRunner.run(new WordCount(), args);5 System.exit(ret);6 }7

8 public int run(String [] args) throws Exception {9 if (args.length != 2) {

10 System.err.println(11 "Usage: lecture7.WordCount <input > <output >");12 return -1;13 }14

15 Job job = new Job(getConf ());16 job.setJarByClass(WordCount.class );17 job.setJobName("wordcount");18

19 job.setMapperClass(TokenizerMapper.class);20 job.setCombinerClass(IntSumReducer.class);21 job.setReducerClass(IntSumReducer.class);

О.В. Сухорослов () 07 MapReduce 06.04.2012 58 / 77

Page 59: О.В.Сухорослов "MapReduce"

Конфигурация и запуск задания

1 job.setMapOutputKeyClass(Text.class );2 job.setMapOutputValueClass(IntWritable.class);3 job.setOutputKeyClass(Text.class );4 job.setOutputValueClass(IntWritable.class);5

6 job.setInputFormatClass(TextInputFormat.class);7 job.setOutputFormatClass(TextOutputFormat.class);8

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

12 boolean success = job.waitForCompletion(true);13 return success ? 0 : 1;14 }15 }

О.В. Сухорослов () 07 MapReduce 06.04.2012 59 / 77

Page 60: О.В.Сухорослов "MapReduce"

Входные и выходные данные

(input)→ (k1, v1)→ map → (k2, v2)→ combine → (k2, v2)→reduce → (k3, v3)→ (output)

Базовые интерфейсыВходные данные: InputFormatВыходные данные: OutputFormatКлючи: WritableComparableЗначения: Writable

О.В. Сухорослов () 07 MapReduce 06.04.2012 60 / 77

Page 61: О.В.Сухорослов "MapReduce"

Типы данных

TextBooleanWritableIntWritableLongWritableFloatWritableDoubleWritableBytesWritableArrayWritableMapWritable...

См. пакет org.apache.hadoop.io

О.В. Сухорослов () 07 MapReduce 06.04.2012 61 / 77

Page 62: О.В.Сухорослов "MapReduce"

InputFormat

TextInputFormat (по умолчанию)< LongWritable,Text > = < byte_offset, line >

KeyValueTextInputFormat< Text,Text >Текстовый файл со строками вида: key [tab] value

SequenceFileInputFormat<K,V>Двоичный формат с поддержкой сжатия

...

О.В. Сухорослов () 07 MapReduce 06.04.2012 62 / 77

Page 63: О.В.Сухорослов "MapReduce"

OutputFormat

TextOutputFormat<K,V>Текстовый файл со стороками вида: key [tab] value

SequenceFileOutputFormat

...

О.В. Сухорослов () 07 MapReduce 06.04.2012 63 / 77

Page 64: О.В.Сухорослов "MapReduce"

Установка Hadoop на локальной машине

Установить JavaЗагрузить дистрибутив Hadoop и распаковать в любуюдиректорию (далее HADOOP_HOME)

LinuxОткрыть файл HADOOP_HOME/conf/hadoop-env.sh и прописать впеременной JAVA_HOME путь к Java (путь с пробелами надовзять в кавычки)

WindowsПрописать переменную окружения JAVA_HOME с путем к Java(Мой компьютер > Свойства > закладка Дополнительно >Переменные среды)Дополнительно установить Cygwin, эмулятор Unix shellКоманды hadoop под Windows следует запускать внутри Cygwinshell

О.В. Сухорослов () 07 MapReduce 06.04.2012 64 / 77

Page 65: О.В.Сухорослов "MapReduce"

Альтернативный вариант

Виртуальная машина с HadoopCloudera’s Hadoop Demo VM

О.В. Сухорослов () 07 MapReduce 06.04.2012 65 / 77

Page 66: О.В.Сухорослов "MapReduce"

Компилируем и создаем jar

EclipseДобавить в проект HADOOP_HOME/hadoop-*-core.jarBuild projectFile -> Export -> Java / JAR file

Вручную

1 $ mkdir classes2 $ javac3 -classpath ${HADOOP_HOME }/hadoop -${HADOOP_VERSION}-core.jar4 -d classes WordCount.java5 $ jar -cvf wordcount.jar -C classes/ .

О.В. Сухорослов () 07 MapReduce 06.04.2012 66 / 77

Page 67: О.В.Сухорослов "MapReduce"

Запускаем программу локально

Находясь в HADOOP_HOME1 $ bin/hadoop jar wordcount.jar lecture7.WordCount IN OUT

IN - директория с входными файламиOUT - директория с результатами

не должна существовать перед запуском

О.В. Сухорослов () 07 MapReduce 06.04.2012 67 / 77

Page 68: О.В.Сухорослов "MapReduce"

Запуск из IDE (Eclipse)

Подключаем к проекту HADOOP_HOME/hadoop-*-core.jar и всебиблиотеки из HADOOP_HOME/lib

Project->Properties->Java Build Path->Libraries->Add ExternalJARs...

Создаем Run Configuration, где указываем свой Java-класс(вкладка Main) и аргументы main (Arguments/Program Arguments)

в VM arguments следует добавить -Xmx512M во избежаниеOutOfMemoryErrorпути к локальным input- и output-директориям можно указыватьотносительно директории проекта

Под Windows может потребоваться Cygwin

О.В. Сухорослов () 07 MapReduce 06.04.2012 68 / 77

Page 69: О.В.Сухорослов "MapReduce"

Число задач

MapsОпределяется числом блоков во входных файлах, размером блока,параметром mapred.min.split.size, реализацией InputFormat

ReducesПо умолчанию 1 (всегда в локальном режиме)Опция -D mapred.reduce.tasks=N или методjob.setNumReduceTasks(int)Обычно подбирается опытным путемВремя выполнения reduce должно быть не менее минуты0, если Reduce не нужен

О.В. Сухорослов () 07 MapReduce 06.04.2012 69 / 77

Page 70: О.В.Сухорослов "MapReduce"

Стандартные опции

1 -conf <configuration file > // specify a configuration file2

3 -D <property=value > // use value for given property4 -D mapred.reduce.tasks =105

6 -files <comma separated list of files >7 // files to be copied to the map reduce cluster8

9 -libjars <comma seperated list of jars >10 // jar files to include in the classpath11

12 -archives <comma separated list of archives >13 // archives to be unarchived on the compute machines

О.В. Сухорослов () 07 MapReduce 06.04.2012 70 / 77

Page 71: О.В.Сухорослов "MapReduce"

Запуск на учебном кластере

Копируем jar и исходные данные в домашнюю директорию накластере (/home/USER) по SCP

Заходим на кластер по SSH

Загружаем исходные данные в HDFS

Запускаем MapReduce-задание

Загружаем результаты из HDFS

О.В. Сухорослов () 07 MapReduce 06.04.2012 71 / 77

Page 72: О.В.Сухорослов "MapReduce"

Загружаем исходные данные в HDFS

Копирование из локальной директории в HDFS

1 $ hadoop dfs -put local_dir hdfs_dir

dfs_dir лучше задавать в относительном виде, тогда полный путьбудет /user/USER/dfs_dir

1 $ hadoop dfs -mkdir wordcount2 $ hadoop dfs -put /home/USER/input wordcount/input

О.В. Сухорослов () 07 MapReduce 06.04.2012 72 / 77

Page 73: О.В.Сухорослов "MapReduce"

Запускаем MapReduce-задание

В одну строку1 $ hadoop jar wordcount.jar lecture7.WordCount2 -D mapred.reduce.tasks =13 wordcount/input wordcount/output

О.В. Сухорослов () 07 MapReduce 06.04.2012 73 / 77

Page 74: О.В.Сухорослов "MapReduce"

Загружаем результаты из HDFS

Копирование из HDFS в локальную директорию

1 $ hadoop dfs -get wordcount/output output

Просто просмотр

1 $ hadoop dfs -cat wordcount/output/part -00000

О.В. Сухорослов () 07 MapReduce 06.04.2012 74 / 77

Page 75: О.В.Сухорослов "MapReduce"

Повторный запуск

Перед каждым запуском надо удалять из HDFSoutput-директорию (wordcount/output)

Или каждый раз указывать новую output-директориюwordcount/output2(3...)

О.В. Сухорослов () 07 MapReduce 06.04.2012 75 / 77

Page 76: О.В.Сухорослов "MapReduce"

Web-интерфейсы

HDFShttp://hadoop2.yandex.ru:50070

MapReducehttp://hadoop2.yandex.ru:50030

Для доступа необходимо настроить прокси через SSHСм. инструкцию к учебному кластеру на вики

О.В. Сухорослов () 07 MapReduce 06.04.2012 76 / 77

Page 77: О.В.Сухорослов "MapReduce"

Домашнее задание №3 - Подготовка

ЗадачиОпределить 20 наиболее часто встречающихся слов в русской(только русские слова) и английской ВикипедияхПостроить инвертированный индекс для русской и английскойВикипедий

Подробности будут на следующем занятии

До следующего занятияустановить Hadoop на своей машинескомпилировать сегодняшний пример WordCount(запустить WordCount на своей машине)запустить WordCount на учебном кластере

в качестве входных данных можно использовать любые текстовыефайлы

убедиться, что все работает и понятноесли нет - задать вопрос на [email protected]

О.В. Сухорослов () 07 MapReduce 06.04.2012 77 / 77