Для разработки приложений, работающих с использованием 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

export JAVA_HOME=/usr/lib/jvm/sun-jdk-1.6

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

conf/hadoop-site.xml

<property>
  <name>hadoop.tmp.dir</name>
  <value>/home/hadoop/data/${user.name}</value>
  <description>A base for other temporary directories.</description>
</property>
<property>
  <name>fs.default.name</name>
  <value>hdfs://localhost:54310</value>
  <description>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.</description>
</property>
<property>
  <name>mapred.job.tracker</name>
  <value>localhost:54311</value>
  <description>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.
  </description>
</property>
<property>
  <name>dfs.replication</name>
  <value>1</value>
  <description>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.
  </description>
</property>

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

src/contrib/hbase/conf/hbase-site.xml

<property>
  <name>hbase.master</name>
  <value>localhost:60000</value>
  <description>The host and port that the HBase master runs at</description>
</property>
<property>
  <name>hbase.rootdir</name>
  <value>/hbase</value>
  <description>location of HBase instance in dfs</description>
</property>

Как не сложно заметить, этот файл необходим для функционирования 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.