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 не заканчиваются. Нужно помнить также, что:

  1. Hadoop это фреймворк, а не готовое решение;
  2. Hive и Pig имеют множество архитектурных ограничений в сравнении с реляционной СУБД;
  3. Hadoop легко установить и настроить, но сложнее сопровождать;
  4. Сложно выполнять AdHoc-анализ;
  5. В некоторых случаях 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"

[править] Дополнительная информация

[править] 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:

[править] Дополнительная информация

[править] Инсталляция и базовая настройка

[править] Книги по Hadoop

[править] Примечания

  1. http://research.google.com/archive/mapreduce-osdi04-slides/index-auto-0005.html
  2. http://www.chrisstucchio.com/blog/2013/hadoop_hatred.html
  3. https://www.quora.com/What-is-Hadoop-not-good-for
Источник — «http://xgu.ru/wiki/Hadoop»