Вы находитесь на странице: 1из 10

Hadoop – это программная платформа (software framework), позволяющая выполнять распределенную

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

Развертывания hadoop кластреа.

Системные требования:

• Unix-like операционная система(в примере будет использованна gentoo linux). Желательно >=2Gb
оперативной памяти на борту.
• Дистрибутив vmware-workstation(в примере рассматривается vmware-workstation 6.5)

Создание образа гостевой операционной системы.

В примере будет устанавливаться gentoo linux. При создании гостевой системы в vmware-workstation
единсвенное что нужно указать размер оперативной памяти >=512Mb и размер жесткого диска >=8Gb.
Если, что неплохое руководство, как ставить gentoo linux на vmware-workstation http://en.gentoo-
wiki.com/wiki/VMware_Guest
Когда операционная система надо будет обновить системные библиотеки командой:
emerge sys-apps/portage
emerge -uND --with-bdeps=y world
etc-update
env-update
source /etc/profile
После это нужно поставить sun-jdk:
emerge dev-java/sun-jdk (версия должна быть >=1.5, в данном примере взялась последняя из портов, а
именно версия 1.6.0.15)
Создаем нового пользователя, от которого будет работать hadoop:
groupadd hadoop
useradd -m -G users,wheel -g hadoop hadoop
Делаем иму пароль командой:
passwd hadoop
Логинимся под ним. Дальше скачиваем последний дистрибутив hadoop hadoop-0.20.0.tar.gz , можно это
сделать командой:
wget http://www.sai.msu.su/apache/hadoop/core/hadoop-0.20.0/hadoop-0.20.0.tar.gz
Дистрибутив hadoop должен лежать в корне домашней директории, тоесть полный путь до него должен
быть /home/hadoop/hadoop-0.20.0.tar.gz (или ~/hadoop-0.20.0.tar.gz)
Система будет получать ip адресс по протоколу dhcp, для этого нам будет нужно поставить
соответсвующий клиент:
emerge net-misc/dhcpcd
Дальше нужно отредактировать файл /etc/conf.f/net добавив туда строчку -
config_eth0=( "dhcp" )
На локальной машине, на с которо будет запускаться кластер, нам придеться тоже завести пользователя
hadoop, и зайти под ним. Далше создаем ему открытый ключ с пустым паролем, командой:
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
И сразу разрешаем подключаться локально
cat ~/.ssh/id_dsa.pub ~/.ssh/authorized_hosts
В гостевой системе заходим по учетной записью root, созадем папку ~/.ssh (если ее нет) и копируем с
локальной машины публичный ключ. Перед этим на забываем включить sshd сервис командой
/etc/init.d/sshd start
scp /home/hadoop/.ssh/id_dsa.pub root@192.168.1.10:/root/.ssh/authorized_hosts
scp /home/hadoop/.ssh/id_dsa.pub hadoot@192.168.1.10:/home/hadoop/.ssh/authorized_hosts
Где, 192.168.1.10 - это ip адресс гостевой системы.
На гостевой системе от пользователя root выполняем следующие команды:
rm /etc/ssh/ssh_host_key*
rm /etc/ssh/ssh_host_dsa_key*
rm /etc/ssh/ssh_host_rsa_key*
rm /var/lib/dhcpcd/*
Дальше, просто выключаем систему, командой:
shutdown -h now

Теперь, в vmware-workstation, просто делаем 2 клона данной конфигурации. Желательно, так же сделать
снапшот на данной конфигурации, что бы всегда можно было откатиться назад.
После клонирования запускаем их всем.
На главной, локальной системе заходим под пользователем hadoop и в домашню директорию помещаем
следующие файлы.

hosts.txt
192.168.1.10
192.168.1.11
192.168.1.12

Где ip адресса, это адресса наших вирутальных машин.

sshkeygen_remote.sh
#!/bin/bash
HOSTS=$(egrep -v '^#' hosts.txt)
for i in $HOSTS; do
echo "$i ..."
ssh hadoop@${i} "ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa"
ssh hadoop@${i} "cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
done

run_command.sh
#!/bin/bash
HOSTS=$(egrep -v '^#' hosts.txt)
for i in $HOSTS; do
echo "$i ..."
ssh $1@${i} "$2"
done

rename_hosts.sh
#!/bin/bash
HOSTS=$(egrep -v '^#' hosts.txt)
for i in $HOSTS; do
HOST_NAME=vhost$(echo ${i}|awk '{split ($0, a, "."); print a[4]}')
ssh root@${i} "echo $i $HOST_NAME >> /etc/hosts"
done

copy_files.sh

#!/bin/bash
HOSTS=$(egrep -v '^#' hosts.txt)
HADOOP_CONF="/home/hadoop/hadoop-0.20.0/conf"
REMOTE_HADOOP_DIR="/home/hadoop/hadoop-0.20.0/conf"
SCP_FILES="slaves mapred-site.xml core-site.xml hdfs-site.xml masters"
for i in $HOSTS; do
for file in $SCP_FILES; do
echo "Copy file ${HADOOP_CONF}/$file to hadoop@${i}:$REMOTE_HADOOP_DIR"
rsync -av -e ssh ${HADOOP_CONF}/$file hadoop@{i}:${REMOTE_HADOOP_DIR}
done
done

Сначала запускаем скрипт sshkeygen_remote.sh который создаст откртые ключи и разрешить заходить на
себя. Далее меняем имя гостевых систем и вешаем его на внешнй интерфейс, скриптом rename_hosts.sh

Работа с hadoop
Первым делом, это надо распаковать те архивы которые у нас лежат в домашней директории, командой

run_command.sh "tar xvf ~/hadoop-0.20.0.tar.gz"


Для hadoop очень важна переменная JAVA_HOME, ее сразу прописываем в файле hadoop-
0.20.0/conf/hadoop-env.sh именно туда вписываем строку:
export JAVA_HOME="/opt/sun-jdk-1.6.0.15/"
Теперь начинаем править файлы на локальной машине.

Псевдо распределенная система.


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

conf/core-site.xml:

<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
conf/hdfs-site.xml:

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>

</configuration>

conf/mapred-site.xml:

<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>

Форматируем файловую систему hdfs командой


bin/hadoop namenode -format
И запускаем кластре:
bin/start-all.sh

Небольшой отчет можно теперь получить по адрессу:


http://localhost:50070/
А о состоянии задач:
http://localhost:50030/

Кластерная инстраляция.
Для простового кластера, правим следующие конфигурационные файлы. Сразу скажу, что IP адресс -
192.192.1.6 - это адресс локальной машины, с которой мы будем запускать кластре, IP адресса x.x.x.>=10
это виртуальные хосты.

conf/core-site.xml:

<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.1.6:9000</value>
</property>
</configuration>

conf/hdfs-site.xml:

<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>

<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/t1</value>
</property>

<property>

<name>dfs.data.dir</name>
<value>/home/hadoop/fs</value>
</property>
</configuration>

conf/mapred-site.xml:

<configuration>
<property>
<name>mapred.job.tracker</name>
<value>192.168.1.6:9001</value>
</property>
</configuration>

conf/slaves
192.168.1.10
192.168.1.11
192.168.1.12
conf/master
192.168.1.6

Теперь надо эти все конфиги разнести по другим хостам, для этого воспользуемся скриптом copy_files.sh
Форматируем hdfs:
bin/hadoop datanode -format
И запускаем кластер:
bin/start-all.sh
Теперь посмотрим, что же у нас работает, на локальной машине запускам команду jps, он должен вывести,
какие сервисы запустились на локальной машиней, скорее всего список будет - NameNode,
SecondaryNameNode, TaskTracker. Посмотрим что твориться на других машинах, через скрипт
run_command.sh hadoop "jps"
Он должен показать, что на виртуальных хостах запущенно как минимум два сервиса - DataNode,
JobTracker.

Архитектура hdfs.
Платформа Hadoop состоит из нескольких элементов. В основании лежит распределенная файловая
система Hadoop Distributed File System (HDFS), распределяющая файлы по нескольким узлам хранения в
кластере Hadoop. Над файловой системой HDFS (в рамках рассмотрения этой статьи) располагается
механизм MapReduce, состоящий из узлов типов JobTracker и TaskTracker.
Для внешнего клиента HDFS выглядит как обычная иерархическая файловая система. Вы можете
создавать, удалять, перемещать, переименовывать файлы и так далее. Однако в силу особенностей HDFS
архитектура этой файловой системы основана на наборе специальных узлов (см. рисунок 1). Это узел типа
NameNode (существует в единственном экземпляре), выполняющий роль служб метаданных HDFS, и узлы
типа DataNode, служащие блоками хранения данных HDFS. Существование всего одного узла типа
NameNode является проблемой HDFS (единичная точка отказа).
Хранящиеся в HDFS файлы разделены на блоки, которые реплицируются на несколько компьютеров (узлы
DataNode). Это отличается от традиционных RAID-архитектур. Размер блока (обычно 64 МБ) и количество
его реплик определяются клиентом в момент создания файла. Все файловые операции управляются узлом
NameNode. Все взаимодействия внутри HDFS основаны на стандартном протоколе TCP/IP.

Узел NameNode

Узел NameNode представляет собой программный код, обычно выполняющийся на выделенной машине
экземпляра HDFS. Этот узел отвечает за управление пространством имен файловой системы и за
управление доступом со стороны внешних клиентов. Узел NameNode определяет соответствие между
файлами и реплицированными на узлах DataNode блоками. При общепринятой тройной репликации вторая
реплика хранится на отдельном узле, расположенном в той же стойке, а третья – на узле, расположенном в
другой стойке. Обратите внимание на то, что для понимания этого материала вы должны обладать
знаниями о кластерной архитектуре.

Реальные операции ввода/вывода не обращаются к узлу NameNode – через этот узел передаются только
метаданные о сопоставлениях между узлами типа DataNode и файловыми блоками. Когда внешний клиент
посылает запрос на создание файла, узел NameNode отвечает ему, посылая в ответ идентификационные
данные файлового блока и IP-адрес узла DataNode, который будет хранить первую копию этого блока.
Также узел NameNode информирует те узлы DataNode, которые будут получать копии данного файлового
блока.

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

Узел DataNode

Узел DataNode также представляет собой программный код, обычно выполняющийся на выделенной
машине экземпляра HDFS. Кластер Hadoop содержит один узел типа NameNode и сотни или тысячи узлов
типа DataNode. Узлы DataNode обычно устанавливаются в стойки, в которых все они подключены к
коммутатору. При использовании Hadoop предполагается, что сетевая пропускная способность между
узлами одной стойки выше, чем между узлами, установленными в разных стойках.
Узлы DataNode обрабатывают запросы на чтение и запись, поступающие от клиентов файловой системы
HDFS. Также они отвечают на команды создания, удаления и реплицирования блоков, полученные от узла
NameNode. Узел NameNode получает периодические сообщения о состоянии (т. н. heartbeat-сообщения) от
каждого узла DataNode. Каждое такое сообщение содержит отчет, из которого узел NameNode может
получить информацию о сопоставлении блоков и о других метаданных файловой системы. Если узлу
DataNode не удается отправить сообщение о состоянии, узел NameNode может предпринять
корректирующие действия для реплицирования блоков, располагавшихся на отказавшем узле, на другие
узлы кластера.

Файловые операции

Теперь вам должно быть понятно, что HDFS не является файловой системой общего назначения. HDFS
была специально разработана для поддержки потокового доступа к файлам большого объема, которые
записываются однократно. Когда клиенту необходимо записать файл в системе HDFS, этот процесс
начинается с кэширования файла во временное локальное хранилище клиента. Когда объем кэшируемых
данных превышает заданный размер блока HDFS, узлу NameNode посылается запрос на создание файла.
Узел NameNode отвечает клиенту, посылая в ответ идентификатор узла DataNode и блок назначения. Также
уведомляются те узлы DataNode, которые будут содержать реплики этого файлового блока. Когда клиент
начинает передачу своего временного файла первому узлу DataNode, содержимое файлового блока
немедленно ретранслируется узлам реплики с использованием конвейерной технологии. Кроме того,
клиенты отвечают за создание файлов, содержащих контрольные суммы, которые также сохраняются в том
же самом пространстве имен HDFS. После передачи последнего файлового блока узел NameNode
фиксирует факт создания файла в своем постоянном хранилище метаданных (в файлах EditLog и FsImage).

Linux-кластер

Платформу Hadoop можно развернуть на одиночной Linux-системе (в целях разработки и отладки), но


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

Использование hdfs
Работа с файловой системой осуществляется через команду bin/hadoop fs.
Например, что бы скопировать файл с локальной файловой системы на hdfs, нужно выполнить команду:
bin/hadoop -fs put /path/to/local/fileМож remote_file
Где remote_file - это имя файла, который будет находиться в hdfs. Что бы вывести содержание этого файла,
достаточно выполнить команду:
bin/hadoop -fs cat remote_file
Так же можно выполнить эту команду таким образом:
bin/hadoop -fs cat hdfs://servername.com/remote_file
HDFS так же поддерживает права на файл, директории, назначаются они почти так же как и в unix-like
системах тоесть chown, chmod, chgrp.
Пример:
bin/hadoop -fs chgrp new_grp hdfs://servername.com/remote_file
Можно добавить опцию -R и он рекурсивно обойдет все файлы в директории.
Если нужно скопировать на hdfs и с нее целую директорию применяется командf copyFromLocal и
copyToLocal
Пример:
bin/hadoop -fs copyFromLocal local_dir remote_dir
Если нужно скопировать что то внутри hdfs, есть команда cp, источников можно быть несколько, главное
что бы назначение была папка
Пример:
hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir
Можно узнать размер файлов, для этого есть команда du
Пример:
hadoop fs -du /user/hadoop/dir1 /user/hadoop/file1 hdfs://nn.example.com/user/hadoop/dir1
Можно узнать супарную величину файлов, командой dus:
hadoop fs -dus file1 file2
Для очистки корзины, есть команда expunge
hadoop fs -expunge
Для получение какого либо файла с hdfs используется команда get:
hadoop fs -get /user/hadoop/file localfile
Для просмотра файлов в папке есть команда ls и если нужно пройдти рекурсивно по папка команда lsr
Для создание папок команда mkdir:
hadoop fs -mkdir hdfs://nn1.example.com/user/hadoop/dir hdfs://nn2.example.com/user/hadoop/dir
Для переноса файлов есть команды moveFromLocal и moveToLocal
Для того что бы увеличть количество репликаций на файл есть команда setrep
hadoop fs -setrep -w 3 -R /user/hadoop/dir1
В этом примере мы задаем количество репликаций 3 на всю директорию рекурсивно.
Дополнительно по командам http://hadoop.apache.org/common/docs/current/hdfs_shell.html#setrep

Разграничение прав.
На данном этапи разграничение прав довольно просты, и почти такие же как и на других unix-like
системах. Имется пользователи, группы и остальные. И соответсвенно команды chmod, chgrp, chown. В
ближайшие релизы ожидается подключить аунтификацию с использованием ldap.
Так же можно внести дополнительные настройки в конфигурационный файл hdfs-site.xml
dfs.permissions - может иметь два значение true или false, если поставить false, то права сщитаться не будут,
хотя они будут видны
dfs.web.ugi = webuser, webserver - здесь ставяться права для веб сервера
dfs.permissions.supergroup = supergroup - Группа супер пользователя.

Использования квот.
Квоты исключительно ставяться на директории, что бы поставить квоту:
dfsadmin -setQuota 10000000 dir_1
Где 10000000 - это размер в байтах
Так же можно удалить квоту
dfsadmin -clrQuota dir1
Если поставить размер квоты в 0, то файлы можно будет создовать, но данных в них добавить не удасться.
Получить информацию о квотах можно так:
fs -count -q dir_1