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