Hadoop
Материал из Xgu.ru
Hadoop — фреймворк, предназначенный для построения распределённых приложений для работы с данными очень большого объёма. Hadoop реализует вычислительную парадигму MapReduce, в которой приложение разбивается на множество независимых частей, каждая из которых может исполняться на отдельном узле.
Главным языком проекта является Java.
Примеры использования Hadoop (и парадигмы MapReduce вообще)[1]:
- распределённый grep;
- распределённая сортировка;
- кластеризация документов;
- обработка статистики журналов доступа;
- машинное обучение;
- построение обратного индекса;
- статистический перевод.
Hadoop применяет для обработки только очень большого количества данных, которые хранятся распределённо на множестве узлов. Грубым правилом оценки целесообразности использования Hadoop можно считать такое: если данные можно уместить на одном узле (несколько терабайтов), то смысла в Hadoop нет; если нужно обрабатывать десятки или сотни, то имеет смысл[2]. Так же нужно учитывать, какой объём данных обрабатывается в ходе одного типичного запроса и допустимое время на эту обработку: даже если данных всего один терабайт, но запрос должен выполняться за несколько минут, распределённая обработка неизбежна: при скорости доступа к диску 100 MB/s чтобы прочитать только один терабайт потребуется 3 часа, если чтение будет выполняться на одном узле.
Важнейшие компоненты инфраструктуры Hadoop:
- HDFS (Hadoop Distributed Filesystem) — распределённая файловая система, работающая на больших кластерах из обычных машин;
- Avro — фреймворк/библиотека для сериализации данных, наподобие Google Protocol Buffers;
- Pig — высокоуровневая платформа для создания MapReduce-программ;
- Hive — высокоуровневой программное обеспечение, позволяющее управлять и опрашивать большие объёмы данных, находящиеся в инфраструктуре Hadoop; использует свой собственный SQL-подобный язык, HiveQL;
- HBase — распределённая, колонко-ориентированная СУБД, работающая поверх HDFS;
- ZooKeeper — служба, предназначенная для хранения конфигурационной информации, имён, выполнения распределённой синхронизации процессов;
- Sqoop — программа для переноса большого объёма данных из структурированных хранилищ (например, реляционных СУБД) на HDFS;
- MRUnit — Java-библиотека, предназначенная для юнит-тестирования MapReduce-работ;
- Oozie — планировщик, управляющий взаимосвязанными задачами MapReduce и Pig.
Содержание |
[править] Слабые стороны Hadoop
Где Hadoop значительно проигрывает конкурентам в производительности[3]:
- Database joins (compare any SQL database);
- OLTP (compare VoltDB);
- Realtime analytics (compare Cloudscale);
- Supercomputing, e.g. modelling, simulation, fluid dynamics (compare MPI and BSP);
- Graph computing (compare Pregel);
- Interactive analysis of big data (compare Dremel);
- Incremental analysis of big data (compare Cloudscale or Percolator/Caffeine).
На этом минусы Hadoop не заканчиваются. Нужно помнить также, что:
- Hadoop это фреймворк, а не готовое решение;
- Hive и Pig имеют множество архитектурных ограничений в сравнении с реляционной СУБД;
- Hadoop легко установить и настроить, но сложнее сопровождать;
- Сложно выполнять AdHoc-анализ;
- В некоторых случаях Hadoop очень медленный.
[править] Основные понятия
[править] MapReduce
Mapper
Reducer
Partitioner
Mapper class
Reducer class
Jobtracker
Tasktracker
[править] HDFS
- Datanode
- Узлы, на которых хранятся данные файлов.
- Namenode
- Узел, на котором находится информация о том, на каких узлах и в каких блоках находятся файлы.
- Secondary namenode
- Фактически не является namenode, несмотря на имя. Задача secondary namenode заключается в том чтобы периодически вносить в образ пространства имён изменения из лога операций, чтобы лог не разрастался.
[править] HDFS
Особенности HDFS:
- ориентация на работу с большими файлами;
- ориентация на работу в режиме "однократная запись, многократное чтение";
- отсутствие особенных требований к оборудованию.
Слабые места HDFS:
- работа с маленькими файлами;
- одновременная запись из нескольких источников;
- сложности с обеспечением маленького времени доступа.
[править] Веб-интерфейс
[править] Hadoop Streaming
Основным языком Hadoop является Java. Но, конечно, можно использовать и другие языки. Механизм, с помощью которого Hadoop может запускать программы, написанные на других языках называется Streaming. Программы получают данные через стандартный поток ввода и отдают на стандартный поток вывода.
Вот простейший пример использования стриминга:
Обработка данных выполняется маленьким скриптом, написанным на awk.
[править] Hadoop и Python
Программы на Python могут быть запущенны двумя разными способами:
- Через интерфейс Streaming;
- Через Jython.
Запуск через streaming проще и очевиднее.
Пример использования Streaming на Python:
mapper.py
#!/usr/bin/env python import sys for line in sys.stdin: line = line.strip() keys = line.split() for key in keys: value = 1 print( "%s\t%d" % (key, value) )
reducer.py
#!/usr/bin/env python import sys last_key = None running_total = 0 for input_line in sys.stdin: input_line = input_line.strip() this_key, value = input_line.split("\t", 1) value = int(value) if last_key == this_key: running_total += value else: if last_key: print( "%s\t%d" % (last_key, running_total) ) running_total = value last_key = this_key if last_key == this_key: print( "%s\t%d" % (last_key, running_total) )
Или ещё проще:
from itertools import groupby from operator import itemgetter import sys def read_mapper_output(file, separator='\t'): for line in file: yield line.rstrip().split(separator, 1) def main(separator='\t'): data = read_mapper_output(sys.stdin, separator=separator) for current_word, group in groupby(data, itemgetter(0)): try: total_count = sum(int(count) for current_word, count in group) print "%s%s%d" % (current_word, separator, total_count) except ValueError: # count was not a number, so silently discard this item pass if __name__ == "__main__": main()
Проверка:
$ head -n1000 mobydick.txt | ./mapper.py | sort | ./reducer.py
Запуск:
hadoop \ jar /opt/hadoop/contrib/streaming/hadoop-streaming-1.0.3.jar \ -mapper "python $PWD/mapper.py" \ -reducer "python $PWD/reducer.py" \ -input "wordcount/mobydick.txt" \ -output "wordcount/output"
[править] Дополнительная информация
- Writing MapReduce Program in Python (англ.) — очень простое пошаговое руководство, рассказывающее как запускать Python-программу в Hadoop через streaming-интерфейс
- Java vs Python on Hadoop — сравнение Python и Java в контексте использования с Hadoop
- A starting point for learning how to implement MapReduce/Hadoop in Python?
- MapReduce Patterns, Algorithms, and Use Cases (англ.)
- Finding Similar Items with Amazon Elastic MapReduce, Python, and Hadoop Streaming (англ.) — простейший пример использования Hadoop и Python в Amazon
- Hadoop in Action (Paperback) (англ.) — введение в Hadoop и Python, книга
- mrjob (англ.) — python-модуль для запуска задач через streaming
[править] Hadoop и Scala
Засчёт хорошей интеграции Scala и JVM, программы на Scala можно использовать непосредственно с Hadoop, без Streaming. Есть несколько библиотек/API для совместного использования Scala и Hadoop:
Пример Map/Reduce-кода для Hadoop на Scala (scalding):
package com.twitter.scalding.examples import com.twitter.scalding._ class WordCountJob(args : Args) extends Job(args) { TextLine( args("input") ) .flatMap('line -> 'word) { line : String => tokenize(line) } .groupBy('word) { _.size } .write( Tsv( args("output") ) ) // Split a piece of text into individual words. def tokenize(text : String) : Array[String] = { // Lowercase each word and remove punctuation. text.toLowerCase.replaceAll("[^a-zA-Z0-9\\s]", "").split("\\s+") } }
Другие примеры использования Scalding:
И с использованием Scoobi:
import Scoobi._, Reduction._ val lines = fromTextFile("hdfs://in/...") val counts = lines.mapFlatten(_.split(" ")) .map(word => (word, 1)) .groupByKey .combine(Sum.int) counts.toTextFile("hdfs://out/...", overwrite=true).persist(ScoobiConfiguration())
Небольшая презентация на тему сравнения scalding и scoobi:
- Why Hadoop MapReduce needs Scala (англ.)
[править] Дополнительная информация
- MapReduce: Simplified Data Processing on Large Clusters (англ.) — первоначальная статья от Google на тему MapReduce
- Powerde By Hadoop (англ.) — примеры использования Hadoop в реальных инсталляциях
- Writing An Hadoop MapReduce Program In Python (англ.) — небольшое введение в Hadoop на примере простейших Python-скриптов
[править] Инсталляция и базовая настройка
- Running Hadoop on Ubuntu Linux (Single-Node Cluster) (англ.) — небольшое хауту о том, как запускать hadoop на ubuntu
- Running Hadoop on Ubuntu Linux (Multi-Node Cluster) (англ.) — небольшое хауту о том, как запускать hadoop на ubuntu, несколько узлов
- Installing Apache Hadoop - Hadoop: The Definitive Guide (англ.) — небольшое введение в Hadoop (инсталляция и базовая настройка)
- Cloudera Hadoop RHEL/CentOS 6 Install Guide (англ.)
- Setting up a Hadoop cluster - Part 1: Manual Installation (англ.)
- Set Up and Run a Fully Distributed Hadoop/HBase Cluster In (About) an Hour. (Quickstart) (англ.)
[править] Книги по Hadoop
- 15+ Great Books for Hadoop (англ.) — краткое описание 15 разных книг по Hadoop