Hadoop для разработчика

26 Февраль 2008 21 Comments Иван Блинков

Для разработки приложений, работающих с использованием Hadoop, или же алгоритмов для MapReduce framework’а совсем не нужен полномасштабный кластер. На самом же деле для запуска всей системы, описанной мной в одном из предыдущих постов, вполне достаточно одного компьютера и буквально минут 15 свободного времени, как потратить их для решения этой задачи я Вам и поведаю.

Рассказывать я буду на примере своего Gentoo Linux, но большая часть этого повествования будет справедлива и для других unix-like операционных систем.

Подготовка

Перед тем, как приступить собственно говоря к установке Hadoop, необходимо выполнить два элементарных действия, необходимых для правильного функционирования системы:

  • открыть доступ одному из пользователей по ssh к этому же компьютеру без пароля, можно например создать отдельного пользователя для этого [hadoop]:
    useradd -m -n hadoop
    

    Далее действия выполняем от его имени:

    su hadoop
    

    Генерируем RSA-ключ для обеспечения аутентификации в условиях отсутствия возможности использовать пароль:

    hadoop@localhost ~ $ ssh-keygen -t rsa -P ""
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
    Your identification has been saved in /home/hadoop/.ssh/id_rsa.
    Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
    The key fingerprint is:
    7b:5c:cf:79:6b:93:d6:d6:8d:41:e3:a6:9d:04:f9:85 hadoop@localhost
    

    И добавляем его в список авторизованных ключей:

    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    

    Этого должно быть более чем достаточно, проверить работоспособность соединения можно просто написав:

    ssh localhost
    

    Не забываем предварительно инициализировать sshd:

    /etc/init.d/sshd start
    
  • Помимо этого необходимо убедиться в наличии установленной JVM версии 1.5.0 или выше, а также узнать директорию, где она располагается, вариантов сделать это множество, я нашел ее просто заглянув в самое логичное место — /usr/lib, но при желании никто не может Вам помешать воспользоваться услугами, например, slocate. Найденную директорию с JVM лучше запомнить или записать куда-нибудь, для меня она оказалась:
    /usr/lib/jvm/sun-jdk-1.6
    

Установка

Установка начинается с получения копии исходного кода системы, способов для этого существует несколько. Я перепробовал практически все, самую адекватную версию мне удалось получить из SVN. Для ее получения необходимо выполнить следующую команду:

svn checkout http://svn.apache.org/repos/asf/hadoop/core/branches/branch-0.16 ~

branch-0.16 — последняя доступная версия на данный момент, для определения ее номера достаточно заглянуть по тому же адресу браузером. Предполагается, что Hadoop будет располагаться прямо в /home/hadoop, но запросто можно использовать и другую директорию.

Сразу же стоит скомпилировать различные дополнительные компоненты системы, особенно это актуально из-за HBase, но и помимо него соберется много чего интересного, например plug-in для отличной IDE под названием Eclipse или Hadoop On Demand. Задача также элементарна:

cd ~
ant clean jar compile-contrib

Настройка

Конфигурационные файлы можно редактировать в произвольном порядке, самое главное ничего не забыть :)

  • conf/hadoop-env.sh
    # The java implementation to use.  Required.
    export JAVA_HOME=/usr/lib/jvm/sun-jdk-1.6
    

    Единственная обязательная переменная окружения — JAVA_HOME, здесь как раз пригодится заранее найденный путь до JVM, все остальное — по желанию.

  • conf/hadoop-site.xml
    
    
    
    
    
    
    
      hadoop.tmp.dir
      /home/hadoop/data/${user.name}
      A base for other temporary directories.
    
    
      fs.default.name
      hdfs://localhost:54310
      The name of the default file system.  A URI whose
      scheme and authority determine the FileSystem implementation.  The
      uri's scheme determines the config property (fs.SCHEME.impl) naming
      the FileSystem implementation class.  The uri's authority is used to
      determine the host, port, etc. for a filesystem.
    
    
      mapred.job.tracker
      localhost:54311
      The host and port that the MapReduce job tracker runs
      at.  If "local", then jobs are run in-process as a single map
      and reduce task.
      
    
    
      dfs.replication
      1
      Default block replication.
      The actual number of replications can be specified when the file is created.
      The default is used if replication is not specified in create time.
      
    
    
    
    

    Этот конфигурации файл является одним из ключевых, таким образом он выглядит для конфигурации, состоящей из одного компьютера (позаимствован из англоязычного мануала на ту же тему).

  • src/contrib/hbase/conf/hbase-site.xml
    
    
    
    
         hbase.master
         localhost:60000
         The host and port that the HBase master runs at
       
    
         hbase.rootdir
         /hbase
         location of HBase instance in dfs
       
    
    

    Как не сложно заметить, этот файл необходим для функционирования HBase, по-моему все просто и очевидно, <description> говорят сами за себя.

Запуск

Начать стоит с ознакомления с кратким описанием доступных команд Hadoop, сделать это можно просто набрав ~/bin/hadoop:

Usage: hadoop [--config confdir] COMMAND
where COMMAND is one of:
  namenode -format     format the DFS filesystem
  secondarynamenode    run the DFS secondary namenode
  namenode             run the DFS namenode
  datanode             run a DFS datanode
  dfsadmin             run a DFS admin client
  fsck                 run a DFS filesystem checking utility
  fs                   run a generic filesystem user client
  balancer             run a cluster balancing utility
  jobtracker           run the MapReduce job Tracker node
  pipes                run a Pipes job
  tasktracker          run a MapReduce task Tracker node
  job                  manipulate MapReduce jobs
  version              print the version
  jar             run a jar file
  distcp   copy file or directories recursively
  daemonlog            get/set the log level for each daemon
 or
  CLASSNAME            run the class named CLASSNAME
Most commands print help when invoked w/o parameters.

Первым делом необходимо отформатировать Namenode:

~/bin/hadoop namenode -format

И дело останется лишь за малым, запустить на выполнение пару bash-скриптов, которые без вашего дальнейшего участия инициализируют всю систему, включая HBase:

~/bin/hadoop/start-all.sh && ~/src/contrib/hbase/bin/start-hbase.sh

Как только они закончат все необходимые действия, у Вас появится возможность удостовериться, что все в порядке. Самым простым способом является запуск клиента Hbase Shell:

~/bin/src/contrib/hbase/bin/hbase shell

Если в ответ Вы получили соответствующее приглашение клиента, значит все было сделано верно!

Вот собственно говоря и все, псевдо-кластер функционирует, доступ к HBase имеется, можно приступать к разработке :)

P.S.: Остановка системы производится по тому же принципу скриптами stop-all.sh и stop-hbase.sh.

21 comments

  • Dima:

    Вопрос в том, для каких задач можно использовать Hadoop, кроме индексов… Есть какие-нибудь статьи с разными примерами использования MapReduce?

  • johnjoy:

    2Dima
    Для задач обработки очень большого количества данных.
    Например, статистика или обработка логов (например клсатер из 1K машин в Yahoo! занимается пока только этим).
    С индексами, кстати, не столь все просто, мы хорошенько так подза***ись

  • отличная статья, как раз то чего мне не хватало

    если не заломает
    может быть напишите пару примеров как все такие работает клиент Hadoop? собственно как на практике выглядит запуск задач?
    хотя бы в той же Hbase shell >

  • [quote comment="271"]Вопрос в том, для каких задач можно использовать Hadoop, кроме индексов… Есть какие-нибудь статьи с разными примерами использования MapReduce?[/quote]Все ограничивается лишь воображением, документации и примеров крайне мало (по крайней мере той ее части, что мне удалось найти в интернете), но примеры, идущие «в комплекте» в состоянии подтолкнуть на несколько неплохих идей. Самый простой и наглядный пример, по-моему: вычисление больших облаков тэгов.
    [quote comment="276"]может быть напишите пару примеров как все такие работает клиент Hadoop? собственно как на практике выглядит запуск задач?
    хотя бы в той же Hbase shell >[/quote]Запуск задач выглядит ничуть не сложнее, чем запуск любой другой программы — просто консольная команда, в которой обычно указываются все компоненты работы: обработчики данных для этапов Map и Reduce, исходные данные, место для расположения результатов. Но дело-то не в запуске задач, а в написании программ, которые будут обрабатывать данные. Практика написания таких программ для Hadoop у меня минимально, так что от каких-либо более детальных комментариев пока воздержусь (хотя никто не мешает посмотреть исходники примеров — так все более чем ясно и очевидно).

    Hbase Shell мало чем отличается от подобных консольных клиентов других СУБД, так что он скорее предназначен для ручного получения результатов запросов; для автоматизированный работы стоит использовать другие интерфейсы HBase, например REST.

  • johnjoy:

    Примеров действительно мало, как и документации. Как-то хадуп варится все больше в своем котле )
    Из документации действительно хороши исходники, а они у hadoop/lucene/nutch очень неплохо написаны, по javadoc вполне можно сориентироваться что к чему.

    также добавлю вот эту презентацию (если не видели), про то, как mapred можно красиво использовать:
    http://wiki.apache.org/nutch-data/attachments/Presentations/attachments/mapred.pdf

  • [quote comment="281"]также добавлю вот эту презентацию (если не видели), про то, как mapred можно красиво использовать[/quote]Спасибо, презентация пришлась «в тему». Кратко и содержательно.
    Саму ее раньше не видел, но большую часть информации из нее я уже встречал, на том же apache.org вроде.

  • [...] также интересные обзоры Ивана Блинкова “Hadoop для разработчика” и “Hadoop“. —> Вы можете Оставить комментарий (0) [...]

  • [...] также интересные обзоры Ивана Блинкова “Hadoop для разработчика” и [...]

  • Gorban:

    Ошибка в команде инициализации. Нужно:
    bin/start-all.sh && ~/src/contrib/hbase/bin/start-hbase.sh

  • [quote comment="327"]Ошибка в команде инициализации. Нужно:
    bin/start-all.sh && ~/src/contrib/hbase/bin/start-hbase.sh[/quote]
    Спасибо, недоглядел, надо было всетаки копировать из консоли, а не перенабирать.
    Вы, наверное, первый, кто попытался описанное выше повторить :)

    Или просто уже имели большой опыт и сходу заметили?

  • Veaceslav Kunitki:

    Дошел до пункта
    src/contrib/hbase/conf/hbase-site.xml
    а нету такого файла//
    как быть?

  • [quote comment="786"]Дошел до пункта
    src/contrib/hbase/conf/hbase-site.xml
    а нету такого файла//
    как быть?[/quote]
    Либо я потерял какой-то пункт в алгоритме, либо его нужно создать…

    Хотя возможно и Вы что-то пропустили, например компиляцию contrib проектов.

  • В последних версиях нету уже hbase. Вот и не получилось

  • [quote comment="798"]В последних версиях нету уже hbase. Вот и не получилось[/quote]Хм, да, что-то я проворонил этот момент, надо бы пост подкорректировать с учетом этого.
    Хотя принцип не должен был сильно измениться — достаточно просто отдельно HBase скачать.

  • [quote comment="800"][quote comment="798"]В последних версиях нету уже hbase. Вот и не получилось[/quote]Хм, да, что-то я проворонил этот момент, надо бы пост подкорректировать с учетом этого.
    Хотя принцип не должен был сильно измениться — достаточно просто отдельно HBase скачать.[/quote]

    ни разу не так. пол дня убитые на мэйл-листы показали, что текущий hbase 0.1.2 работает только с hadoop 0.16

    попытки запуска hbase 0.1.2 и последнего транка под hadoop 0.18 кричали в лог нэймноды
    WARN org.apache.hadoop.ipc.Server: Incorrect header or version mismatch from 127.0.0.1:32957 got version 1 expected version 2
    и таймаутом коннекта к hdfs хранилищу со стороны мастер-сервера

    хоть бы в вики поместили инфу о этом.

  • [quote comment="875"][quote comment="800"][quote comment="798"]В последних версиях нету уже hbase. Вот и не получилось[/quote]Хм, да, что-то я проворонил этот момент, надо бы пост подкорректировать с учетом этого.
    Хотя принцип не должен был сильно измениться — достаточно просто отдельно HBase скачать.[/quote]Да, совместимость версий у них обеспечивается далеко не всегда. Судя по всему необходимо использовать лишь сборки, сделанные в примерно один и тот же момент времени.

    ни разу не так. пол дня убитые на мэйл-листы показали, что текущий hbase 0.1.2 работает только с hadoop 0.16

    попытки запуска hbase 0.1.2 и последнего транка под hadoop 0.18 кричали в лог нэймноды
    WARN org.apache.hadoop.ipc.Server: Incorrect header or version mismatch from 127.0.0.1:32957 got version 1 expected version 2
    и таймаутом коннекта к hdfs хранилищу со стороны мастер-сервера

    хоть бы в вики поместили инфу о этом.[/quote]

  • На сегодняшний момент как узнать какая версия hadoop и hbase совместимы и самые свежие?

  • [quote comment="917"]На сегодняшний момент как узнать какая версия hadoop и hbase совместимы и самые свежие?[/quote]
    Самая свежая версия определенно в SVN: Hadoop и HBase. Совместимость лучше всего практическим методом проб и ошибок. В общем случае обычно относительно совместимы между собой SVN версии в /trunk и последние stable релизы.

  • knoppixmeister:

    Возможно ли в Hadoop добавлять «на лету (in run time)» data-nodes (дополнительные машины с HDD)?? Как это можно сделать или где про это можно почитать??

  • [quote comment="940"]Возможно ли в Hadoop добавлять «на лету (in run time)» data-nodes (дополнительные машины с HDD)?? Как это можно сделать или где про это можно почитать??[/quote]
    При правильной настройке должны подхватываться:
    bin/hadoop datanode start

  • [...] Поднимаем кластер ВНИМАНИЕ! Перед продолжением чтения этого раздела, настоятельно рекомендуется прочитать статью о запуске псевдо-кластера из одного компьютера. [...]

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>