Запуск Hadoop в Windows

Tags: hadoop, Windows

Что такое Hadoop?

Hadoop - это проект Apache с открытым исходным кодом, написанный на Java и предназначенный для предоставления пользователям двух вещей: распределенной файловой системы (HDFS) и метода распределенных вычислений. Он основан на опубликованной в Google системе Google File System и MapReduce, в которой обсуждается, как создать инфраструктуру, способную выполнять интенсивные вычисления на тоннах компьютеров. Что-то, что возможно вы знаете, могло бы помочь создать гигантский индекс поиска. Прочтите описание проекта Hadoop и wiki для получения дополнительной информации и бэкграунда Hadoop.

В чем проблема в его запуске на Windows?

Основная цель Hadoop - обеспечить хранение и вычисление на множестве однородных типовых машин; обычно довольно внушительный компьютер под управлением Linux. С этой целью команда Hadoop логически сосредоточилась на платформах Linux в своей разработке и документации. Их Quickstart даже включает в себя предостережение, что «Win32 поддерживается как платформа разработки. Распределенная операция не была хорошо протестирована на Win32, поэтому это не производственная платформа. «Если вы хотите использовать Windows для запуска Hadoop в псевдораспределенном или распределенном режиме (более подробно об этих режимах чуть позже), вы остались в значительном меньшинстве. Теперь большинство людей, вероятно, не будут запускать Hadoop на производстве на машинах Windows, но возможность развертывания на самой широко используемой платформе в мире по-прежнему, вероятно, является хорошей идеей для того, чтобы позволить использовать Hadoop многим разработчикам, использующих Windows ежедневно.

Будьте бдительны

Я один из немногих, кто затратил время для установки фактической распределенной установки Hadoop в Windows. Я использовал его для некоторых успешных тестов разработки. Я не использовал это в производстве. Кроме того, хотя я могу обойтись в среде Linux / Unix, я не эксперт, поэтому некоторые из приведенных ниже советов могут быть неправильным способом настройки. Я также не специалист по безопасности. Если у кого-нибудь из вас есть исправления или советы для меня, пожалуйста, дайте мне знать в комментарии, и я исправлю это.

В этом руководстве используется Hadoop v0.17 и предполагается, что у вас нет предыдущей установки Hadoop. Я также сделал свою основную работу с Hadoop в Windows XP. Где я в курсе различий между XP и Vista, я пытался отметить их. Прокомментируйте, если что-то, что я написал, не подходит для Vista.

Итог: ваш опыт может отличаться, но это руководство должно помочь вам запустить Hadoop на Windows.

Небольшая заметка о распределенном Hadoop

Hadoop работает в одном из трех режимов:

  • Автономный: все функции Hadoop работают в одном Java-процессе. Предполагает работу «из коробки» и тривиально используется на любой платформе, включая Windows.
  • Псевдораспределенный: функциональность Hadoop работает на локальной машине, но различные компоненты будут работать как отдельные процессы. Это гораздо больше похоже на «настоящий» Hadoop и требует некоторой конфигурации, а также SSH. Однако он не разрешает распределенное хранение или обработку на нескольких компьютерах.
  • Полностью распределенный: функциональность Hadoop распределяется по «кластеру» машин. Каждая машина участвует в несколько разных (и иногда перекрывающихся) ролях. Это позволяет нескольким машинам вносить в кластер мощности и ресурсы обработки.

Hadoop Quickstart может начать работу в автономном режиме и  псевдораспределенном (в некоторой степени). Взгляните на него, если вы не готовы к полностью распределенному режиму. В этом руководстве основное внимание уделяется полностью распределенному режиму Hadoop. В конце концов, это самое интересное - где вы на самом деле делаете реальные распределенные вычисления.

Предпосылки

Java

Я предполагаю, что если вы заинтересованы в запуске Hadoop, то вы знакомы с Java-программированием, и Java установлен на всех компьютерах, на которых вы хотите запустить Hadoop. Документы Hadoop рекомендуют Java 6 и требуют, по крайней мере, Java 5. Какой бы вариант вы ни выбрали, вам нужно убедиться, что на каждой машине установлена одна и та же основная версия Java (5 или 6). Кроме того, любой код, который вы пишете для работы с помощью MapReduce от Hadoop, должен быть скомпилирован с выбранной вами версией. Если у вас нет установленной Java, откройте ее и установите ее. Предположим, вы используете Java 6 в остальной части этого руководства.

Cygwin

Как я сказал во введении, Hadoop предполагает, что Linux (или ОС Unix) используется для запуска Hadoop. Это предположение довольно сильно устарело. Различные части Hadoop выполняются с использованием сценариев оболочки, которые будут работать только в оболочке Linux. Он также использует безопасную оболочку без пароля (SSH) для обмена данными между компьютерами в кластере Hadoop. Лучший способ сделать это в Windows - сделать Windows более похожим на Linux. Вы можете сделать это с помощью Cygwin, который предоставляет «Linux-подобную среду для Windows», которая позволяет использовать утилиты командной строки в стиле Linux, а также запускать действительно полезное программное обеспечение, ориентированное на Linux, такое как OpenSSH. Загрузите последнюю версию Cygwin. Пока не устанавливайте его. Ниже будет описано, как вам нужно установить.

Hadoop

Загрузите ядро Hadoop. Я пишу это руководство для версии 0.17, и я предполагаю, что вы используете ее.

Более одного ПК с ОС Windows в локальной сети

Вероятно, не стоит говорить, что, следуя этому руководству, вам нужно иметь более одного ПК. Я собираюсь предположить, что у вас есть два компьютера, и что они оба в вашей локальной сети. Назначьте одного главным (Master), а другой - подчиненным (Slave).  Эти машины вместе станут вашим «кластером». Главный компьютер будет нести ответственность за обеспечение работы подчиненного компьютера (например, сохранение данных или выполнение заданий MapReduce). Главный компьютер также может выполнять свою часть этой работы. Если у вас более двух компьютеров, вы всегда можете настроить Slave2, Slave3 и так далее. Некоторые из приведенных ниже шагов должны быть выполнены на всех ваших кластерных машинах, а некоторые - только на Master или Slaves. Я отмечу, какие применяются для каждого шага.

Шаг 1. Настройте файл хостов (все машины)

Этот шаг не является абсолютно необходимым, но это облегчит вашу жизнь в будущем, если ваши компьютеры изменят IP-адреса. Это также поможет вам держать вещи прямо в голове при редактировании файлов конфигурации. Откройте файл хостов Windows, расположенный в каталоге c:\windows\system32\drivers\etc\hosts (файл с именем hosts без расширения) в текстовом редакторе и добавьте следующие строки (заменив NNN на IP-адреса и Master, и Slave):

master NNN.NNN.NNN.NNN
slave NNN.NNN.NNN.NNN

Шаг 2: Установите Cygwin и настройте OpenSSH sshd (все машины)

Cygwin имеет немного странный процесс установки, поскольку он позволяет выбирать библиотеки полезных программ и утилит Linux-y, которые вы хотите установить. В этом случае мы действительно устанавливаем Cygwin для запуска сценариев оболочки и OpenSSH. OpenSSH - это реализация сервера защищенной оболочки (SSH) (sshd) и клиента (ssh). Если вы не знакомы с SSH, вы можете думать об этом как о безопасной версии telnet. С помощью команды ssh вы можете войти на другой компьютер, на котором запущен sshd, и работать с ним из командной строки. Вместо того, чтобы изобретать колесо, я расскажу вам пошаговые инструкции о том, как установить Cygwin в Windows и запустить SSH-сервер OpenSSH. Вы можете остановиться после инструкции 6. Как и в связанных инструкциях, я предположу, что вы установили Cygwin в c:\cygwin, хотя вы можете установить его в другом месте.

Если вы используете брандмауэр на своем компьютере, вам нужно убедиться, что порт 22 открыт для входящих соединений SSH. Как всегда с брандмауэрами, откройте минимальный доступ к своей машине. Если вы используете брандмауэр Windows, убедитесь, что открытый порт привязан к вашей локальной сети. У Microsoft есть документация о том, как сделать все это с брандмауэром Windows (прокрутите вниз до раздела «Настройка исключений для портов»).

Шаг 3: Настройка SSH (все машины)

Hadoop использует SSH, чтобы позволить главному компьютеру (-ам) в кластере запускать и останавливать процессы на подчиненных компьютерах. Одна из приятных особенностей SSH заключается в поддержке нескольких режимов безопасной аутентификации: вы можете использовать пароли или использовать общедоступные / закрытые ключи для подключения без паролей («без пароля»). Hadoop требует, чтобы вы установили SSH для выполнения последнего. Я не буду подробно разбираться в том, как все это работает, но достаточно сказать, что нужно сделать следующее:

  1. Создайте пару открытого ключа для вашего пользователя на каждой машине кластера.
  2. Обменяйтесь открытым ключом каждого пользователя машины с каждым другим пользователем машины в кластере.

Создание пар закрытых / закрытых ключей

Чтобы создать пару ключей, откройте Cygwin и выполните следующие команды ($> - это командная строка):

$> ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

$> cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

Теперь вы можете использовать SSH на своем локальном компьютере, используя следующую команду:

$> ssh localhost

При запросе пароля введите его. На вашем терминале Cygwin вы увидите что-то вроде следующего.

hayes@localhost's password:

Last login: Sun Jun 8 19:47:14 2008 from localhost

hayes@calculon ~

$>

Чтобы выйти из сеанса SSH и вернуться на обычный терминал, используйте:

$> exit

Обязательно сделайте это на всех компьютерах вашего кластера.

Обмен открытыми ключами

Теперь, когда у вас есть открытые и закрытые пары ключей на каждой машине в вашем кластере, вам нужно поделиться своими открытыми ключами, чтобы разрешить вход без пароля с одной машины на другую. После того, как машина имеет открытый ключ, она может безопасно аутентифицировать запрос с удаленного компьютера, который зашифрован с использованием закрытого ключа, который соответствует этому открытому ключу.

На главном компьютере следующая команда в cygwin (где «<slaveusername>» - это имя пользователя, которое вы используете для входа в Windows на подчиненном компьютере):

$> scp ~/.ssh/id_dsa.pub <slaveusername>@slave:~/.ssh/master-key.pub

Введите пароль при появлении запроса. Это скопирует ваш файл открытого ключа, который будет использоваться на главном устройстве.

В подчиненном устройстве введите следующую команду в cygwin:

$> cat ~/.ssh/master-key.pub >> ~/.ssh/authorized_keys

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

Вернемся к главному компьютеру, проверьте это, выполнив следующую команду в cygwin:

$> ssh <slaveusername>@slave

Если все хорошо, вы должны войти в подчиненный компьютер без необходимости пароля.

Повторите этот процесс в обратном порядке, скопировав открытый ключ подчиненного на главный. Кроме того, обязательно обменивайтесь открытыми ключами между мастером и любыми другими ведомыми устройствами, которые могут находиться в вашем кластере.

Настройте SSH для использования имен пользователей по умолчанию (необязательно)

Если все ваши кластерные машины используют одно и то же имя пользователя, вы можете спокойно пропустить этот шаг. Если нет, читайте дальше.

В большинстве руководств Hadoop предлагается настроить пользователя для Hadoop. Если вы хотите это сделать, вы, безусловно, сможете. Зачем настраивать конкретного пользователя для Hadoop? Ну, в дополнение к тому, чтобы быть более защищенным от прав доступа к файлам и безопасности, когда Hadoop использует SSH для выдачи команд с одной машины на другую, он автоматически попытается войти в систему на удаленном компьютере с использованием того же пользователя, что и текущий компьютер. Если у вас разные пользователи на разных машинах, регистрация SSH, выполняемая Hadoop, не удастся. Однако большинство из нас в Windows обычно используют наши компьютеры с одним пользователем и, вероятно, предпочли бы не устанавливать нового пользователя на каждой машине только для Hadoop.

Способ позволить Hadoop работать с несколькими пользователями - это настроить SSH для автоматического выбора соответствующего пользователя, когда Hadoop выдает команду SSH. (Вам также нужно будет отредактировать файл конфигурации hadoop-env.sh, но это будет описано далее в этом руководстве.) Вы можете сделать это, отредактировав файл с именем «config» (без расширения), расположенный в том же «.ssh», где вы сохранили свои общедоступные и закрытые ключи для аутентификации. Cygwin хранит этот каталог в разделе “c:\cygwin\home\<windowsusername>\.ssh”.

На главном файле создайте файл config и добавьте следующие строки (заменив «<slaveusername>» на имя пользователя, которое вы используете на подчиненной машине:

Host slave

User <slaveusername>

Если у вас больше подчиненных в кластере, добавьте также строки для хоста и пользователя.

На каждом подчиненном устройстве создайте файл с именем config и добавьте следующие строки (заменив “<masterusername>” на имя пользователя, которое вы используете на главной машине:

Host master

User <masterusername>

Теперь проверьте это. На хозяине перейдите в cygwin и выполните следующую команду:

$> ssh slave

Вы должны автоматически войти в подчиненную машину без имени пользователя и пароля. Не забудьте выйти из сеанса ssh.

Для получения дополнительной информации о формате этого конфигурационного файла и о том, что он делает, запустите man ssh_config в cygwin.

Шаг 4: Извлечение Hadoop (Все машины)

Если вы не загрузили Hadoop 0.17, сделайте это сейчас. Файл будет иметь расширение «.tar.gz», которое не может быть понято Windows. Вам понадобится что-то вроде WinRAR, чтобы извлечь его. (Если кто-то знает что-то проще, чем WinRAR для извлечения tar-gzip-файлов в Windows, оставьте комментарий.)

Когда у вас есть утилита для извлечения, извлеките ее непосредственно в  c:\cygwin\usr\local. (Предполагая, что вы установили Cygwin в c: \ cygwin, как описано выше).

Выбранная папка будет называться hadoop-0.17.0. Переименуйте ее в hadoop. Все дальнейшие шаги предполагают, что вы находитесь в этом каталоге hadoop и будете использовать соответствующие пути для файлов конфигурации и сценариев оболочки.

Шаг 5: Настройка hadoop-env.sh (Для всех машин)

Файл conf/hadoop-env.sh - это сценарий оболочки, который устанавливает различные переменные среды, которые Hadoop должен выполнить. Откройте conf/hadoop-env.sh в текстовом редакторе. Найдите строку, начинающуюся с «#export JAVA_HOME». Измените эту строку на следующее:

export JAVA_HOME=c:\\Program\ Files\\Java\\jdk1.6.0_06

Это должен быть домашний каталог вашей установки Java. Обратите внимание, что вам нужно удалить ведущий символ «#» (комментарий), и вам нужно избежать обратных косых черт и пробелов с помощью обратного слэша.

Затем найдите строку, которая начинается с «#export HADOOP_IDENT_STRING». Измените его на следующее:

export HADOOP_IDENT_STRING=MYHADOOP

Где MYHADOOP может быть любым, с чем вы хотите идентифицировать свой кластер Hadoop. Просто убедитесь, что каждая машина в вашем кластере использует одно и то же значение.

Чтобы проверить эти изменения, выполните следующие действия в cygwin:

$> cd /usr/local/hadoop

$> bin/hadoop version

Вы должны увидеть результат, аналогичный этому:

Hadoop 0.17.0

Subversion http://svn.apache.org/repos/asf/hadoop/core/branches/branch-0.17 -r 656523

Compiled by hadoopqa on Thu May 15 07:22:55 UTC 2008

Если вы видите такой вывод:

bin/hadoop: line 166: c:\Program Files\Java\jdk1.6.0_05/bin/java: No such file or directory

bin/hadoop: line 251: c:\Program Files\Java\jdk1.6.0_05/bin/java: No such file or directory

bin/hadoop: line 251: exec: c:\Program Files\Java\jdk1.6.0_05/bin/java: cannot execute: No such file or directory

Это означает, что ваш домашний каталог Java неверен. Вернитесь назад и убедитесь, что вы указали правильный каталог и использовали соответствующее экранирование.

Шаг 6: Настройте hadoop-site.xml (Все машины)

Файл conf/hadoop-site.xml представляет собой файл свойств, который позволяет настраивать все виды параметров HDFS и MapReduce для каждой машины. Я не буду вдаваться в подробности здесь о том, что делает каждое свойство, но есть 3, которые вам нужно настроить на всех машинах: fs.default.name, mapred.job.tracker и dfs.replication. Вы можете просто скопировать XML ниже в файл conf/hadoop-site.xml.

<?xml version=”1.0″?>

<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

<!– Put site-specific property overrides in this file. –>

<configuration>

<property>

<name>fs.default.name</name>

<value>hdfs://master:47110</value>

</property>

<property>

<name>mapred.job.tracker</name>

<value>master:47111</value>

</property>

<property>

<name>dfs.replication</name>

<value>2</value>

</property>

</configuration>

Для получения дополнительной информации о том, что делают эти свойства конфигурации (и другие), см. lокументацию по настройке кластера Hadoop и документацию hadoop-default.xml.

Шаг 7. Настройка файла подчиненных (только главный компьютер)

Файл conf/slaves сообщает главному компьютеру, где он может найти подчиненные устройства для работы. Откройте ваш текст в текстовом редакторе. Вероятно, у него будет одна строка, которая говорит «localhost». Замените это на следующее:

master

slave

Шаг 8: Конфигурация брандмауэра (все машины)

Если вы используете брандмауэр Windows, вам необходимо убедиться, что соответствующие порты открыты, чтобы ведомые устройства могли делать HTTP-запросы для информации от ведущего устройства. (Это отличается от порта 22, необходимого для SSH.) Список портов, для которых вы должны делать исключения, следующие: 47110, 47111, 50010, 50030, 50060, 50070, 50075, 50090. Все они должны быть открыты на главном компьютере для запроса, исходящего из вашей локальной сети. Дополнительные сведения об этих портах см. в документации по файлам конфигурации по умолчанию Hadoop.

Вы также должны убедиться, что Java-приложения разрешены брандмауэром для подключения к сети на всех ваших машинах, включая подчиненные.

Шаг 9: Запуск вашего кластера (только главный компьютер)

Чтобы запустить свой кластер, убедитесь, что вы находитесь в cygwin на главном компьютере и изменились в каталог установки вашего приложения. Чтобы полностью запустить кластер, вам нужно сначала запустить DFS, а затем MapReduce.

Запуск DFS

Выполните следующую команду:

$> bin/start-dfs.sh

Вы должны увидеть нечто вроде следующего  (обратите внимание, что у меня есть 2 подчиненных устройства в кластере с идентификатором кластера Appozite, ваш результат будет несколько отличаться):

starting namenode, logging to /usr/local/hadoop/bin/../logs/hadoop-Appozite-namenode-calculon.out

master: starting datanode, logging to /usr/local/hadoop/bin/../logs/hadoop-Appozite-datanode-calculon.out

slave: starting datanode, logging to /usr/local/hadoop/bin/../logs/hadoop-Appozite-datanode-hayes-daviss-macbo

ok-pro.local.out

slave2: starting datanode, logging to /usr/local/hadoop/bin/../logs/hadoop-Appozite-datanode-XTRAPUFFYJR.out

master: starting secondarynamenode, logging to /usr/local/hadoop/bin/../logs/hadoop-Appozite-secondarynamenode

-calculon.out

Чтобы проверить, действительно ли ваша распределенная файловая система работает на нескольких компьютерах, вы можете открыть веб-интерфейс Hadoop DFS, который будет работать на вашем главном компьютере на порту 50070. Возможно, вы можете открыть его, пройдя по этой ссылку: http://localhost:50070. Ниже приведен снимок экрана моего кластера. Как вы можете видеть, есть 3 узла с общим объемом 712,27 ГБ.

Запуск MapReduce

Чтобы запустить MapReduce, выполните следующую команду:

$> bin/start-mapred.sh

Вы должны увидеть вывод, похожий на следующий (опять же, отметив, что у меня есть 3 узла в моем кластере):

starting jobtracker, logging to /usr/local/hadoop/bin/../logs/hadoop-Appozite-jobtracker-calculon.out

master: starting tasktracker, logging to /usr/local/hadoop/bin/../logs/hadoop-Appozite-tasktracker-calculon.ou

t

slave: starting tasktracker, logging to /usr/local/hadoop/bin/../logs/hadoop-Appozite-tasktracker-hayes-daviss

-macbook-pro.local.out

slave2: starting tasktracker, logging to /usr/local/hadoop/bin/../logs/hadoop-Appozite-tasktracker-XTRAPUFFYJR

.out

Вы можете просмотреть настройки MapReduce, используя веб-приложение мониторинга MapReduce, которое поставляется вместе с Hadoop, который работает на порту 50030 вашего основного узла. Вероятно, вы можете открыть его, щелкнув по: http://localhost:50030. Ниже приведен снимок экрана из моего браузера. Здесь не так много интересного, пока у вас нет реальной работы MapReduce.

Тестирование

Теперь, когда у вас запущен и запущен ваш кластер Hadoop, выполнение заданий MapReduce или запись в DFS и их чтение из DFS не отличаются в Windows от работы в любой другой платформе, если вы используете cygwin для выполнения команд.

На этом этапе я расскажу вам о Hadoop Майкла Нолла в учебнике Ubuntu Linux для объяснения того, как запустить достаточно большое задание MapReduce, чтобы воспользоваться преимуществами вашего кластера. (Обратите внимание, что он использует Hadoop 0.16.0 вместо 0.17.0, поэтому вы замените «0.16.0» на «0.17.0», где это применимо.) Следуйте его инструкциям, и все должно идти хорошо. Сайт Hadoop также предлагает учебник MapReduce, чтобы вы могли начать писать свои собственные задания на Java. Если вам интересно писать задания MapReduce на других языках, которые используют Hadoop, ознакомьтесь с документацией Hadoop Streaming.

Как остановить кластер

Когда вы будете готовы, чтобы остановить кластер, это будет просто. Просто верните MapReduce, а затем DFS.

Чтобы остановить MapReduce, выполните следующую команду на главном компьютере:

$>bin/stop-mapred.sh

Вы должны увидеть результат, похожий на следующий:

stopping jobtracker

slave: stopping tasktracker

master: stopping tasktracker

slave2: stopping tasktracker

Чтобы остановить DFS, введите следующую команду на главном компьютере:

$> bin/stop-dfs.sh

Вы должны увидеть результат, похожий на следующий:

stopping namenode

master: stopping datanode

slave: stopping datanode

slave2: stopping datanode

master: stopping secondarynamenode

Вот и все

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







No Comments

Add a Comment