Что есть HDFS?
HDFS - это распределенная файловая система. В данной инструкции мы поставим ее в тестовом режиме! Это небезопасно, в боевом режиме Вы обязательно должны настроить HA или копирование на NFS для метаданных.
Пару слов об аппаратной конфигурации - для начала, мы развертываем HDFS на одном сервере с двумя жесткими дисками (иначе вообще вся затея с распределенной ФС становится бессмысленной). В моем примере диски смонтированы как /data/disk1 и /data/disk2.
Конфигурируем hostname и /etc/hosts
В самом-самом начале пути нужно сделать следующее - открыть редактором /etc/sysconfig/network и в поле HOSTNAME вписать корректный хостнейм адрес машины в виде:
HOSTNAME=hadoop.fastvps.ru
Следом открыть файл hosts: /etc/hosts и там вписать/исправить следующее:
88.198.XX.XX hadoop.fastvps.ru hadoop
Где 89.198.XX.XX - ВНЕШНИЙ IP адрес сервера, НЕ localhost/127.0.0.1.
После этого в обязательном порядке перезагружаемся, чтобы система подхватила обновленный hostname.
Теперь проверяем, чтобы хостнейм резолвился во внешний IP командой ping (запись в DNS в данный момент не нужна):
ping -c 1 hadoop.fastvps.ru
PING hadoop.fastvps.ru (89.198.XX.XX) 56(84) bytes of data.
64 bytes from hadoop.fastvps.ru (89.198.XX.XX): icmp_seq=1 ttl=64 time=0.025 ms
--- hadoop.fastvps.ru ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.025/0.025/0.025/0.000 ms
Все, это позволит избежать кучи проблем в будущем. Корректный хостнейм ОЧЕНЬ важен для Hadoop, кривые данные в нем могут привести к очень и очень плачевным последствиям.
Устанавливаем Java
Итак, для работы Cloudera нам нужна Java версии 1.7 (я использовал update 45), так что идем на сайт Oracle и стягиваем там "jre-7-linux-x64.rpm".
Водружаем ее:
yum install -y jre-7-linux-x64.rpm
Проверяем, что все встало корректно:
java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) 64-Bit Server VM (build 21.0-b17, mixed mode)
Устанавливаем Cloudera Hadoop
Стягиваем репо:
wget http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/cloudera-cdh4.repo -O/etc/yum.repos.d/cloudera-cdh4.repo
Ставим все, что нужно для работы Hadoop HDFS (почти 200 мегабайт пакетов):
yum install hadoop-hdfs-namenode hadoop-hdfs-datanode hadoop-client
Копируем стандартный конфиг для правки:
cp -r /etc/hadoop/conf.dist /etc/hadoop/conf.my_cluster
alternatives --verbose --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.my_cluster 50
alternatives --set hadoop-conf /etc/hadoop/conf.my_cluster
Теперь нужно настроить кластер, в файле /etc/hadoop/conf.my_cluster/core-site.xml
В блок confguration вносим следующее (это имя нашего кластера):
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop.fastvps.ru/</value>
</property>
<property><name>fs.trash.interval</name> <value>10080</value> </property>
Второй параметр отвечает за активацию корзины (и ее автоочистки через неделю после удаления файла). Обращаю внимание, что корзина работает только с hdfs shell, через API файлы сносятся сразу же.
Далее открываем файл /etc/hadoop/conf.my_cluster/hdfs-site.xml и в блок configuration вносим:
<property> <name>dfs.permissions.superusergroup</name>
<value>hadoop</value></property>
<property> <name>dfs.namenode.name.dir</name>
<value>/data/disk1/dfs/namenode
</value> </property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/disk1/dfs/datanode,/data/disk2/dfs/datanode</value>
</property>
<property>
<name>dfs.datanode.failed.volumes.tolerated</name>
<value>1</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
Тут мы задаем пути до папок хранения данных namednode (тут будут метаданные) и datanode (тут будут сами данные). С предпоследним параметром интереснее - это предельное число data нод, которые могут отказать на данном сервере. А вот последний параметр задает стандартное число реплик для файлов. Стандартно стоит 3, но это неудобно для тестового стенда.
Создаем указанные папки (предполагаем, что диски 1 и 2 смонтированы в /data/disk1 и /data/disk2 соответственно):
mkdir -p /data/disk1/dfs/namenode
mkdir -p /data/disk1/dfs/datanode
mkdir -p /data/disk2/dfs/datanode
И конфигурируем их права:
chown -R hdfs:hdfs /data/disk1/dfs/namenode /data/disk1/dfs/datanode /data/disk2/dfs/datanode
chmod 700 /data/disk1/dfs/namenode
Теперь форматируем namenode:
sudo -u hdfs hadoop namenode -format
Запускаем namenode:
/etc/init.d/hadoop-hdfs-namenode start
Запускаем data node:
/etc/init.d/hadoop-hdfs-datanode start
Создаем свою первую папку:
sudo -u hdfs hadoop fs -mkdir /mydir
Тестируем работу HDFS
Смотрим листинг корневой директории:
sudo -u hdfs hadoop fs -ls /
Found 1 items
drwxr-xr-x - hdfs hadoop 0 2013-10-24 00:26 /mydir
Кладем файл в HDFS (ВНИМАНИЕ! НЕ забываем, что мы работаем от имени пользователя hdfs, так что файл в локальной ФС должен быть доступен ему на чтение):
sudo -u hdfs hadoop fs -put /tmp/jre-7-linux-x64.rpm /mydir
Убеждаемся, что он лег:
sudo -u hdfs hadoop fs -ls /mydir
Found 1 items
-rw-r--r-- 3 hdfs hadoop 21203924 2013-10-24 00:36 /mydir/jre-7-linux-x64.rpm
Мониторинг HDFS
Его можно осуществлять посредством веб-скрипта: http://IP_адрес_вашей_namenode:50070/dfshealth.jsp
Настройка HDFS Fuse
Так как каждый раз пользоваться hadoop fs неудобно далеко не всегда, я рекомендую использовать Fuse модуль, чтобы смонтировать HDFS как обычную ФС (не забываем, HDFS - не Posix! Блокировки и правки файлов не поддерживаются).
yum install hadoop-hdfs-fuse
Монтируем:
hadoop-fuse-dfs dfs://hadoop.fastvps.ru:8020 /mnt
Вуаля, тот же файлик доступен как обычная файловая система:
ls -al /mnt/mydir/
итого 11G
drwxr-xr-x 3 hdfs hadoop 4,0K Окт 24 03:30 .
drwxr-xr-x 3 hdfs hadoop 4,0K Окт 24 03:21 ..
-rw-r--r-- 1 hdfs hadoop 10G Окт 24 03:30 10Gio.dat
Отмонтировать его можно стандартно:
umount /mnt
Что дальше?
В следующей публикации я постараюсь поставить второй сервер как datanode, чтобы на практике протестировать функцию отказоустойчивости HDFS
Установка datanode на отдельном сервере
Устанавливаем Java по аналогии с предыдущим сервером, далее также конфигурируем hostname и /etc/hosts. Данный сервер назовем data1-hadoop.fastvps.ru.
Подразумеваем, что на данном сервере у нас один жесткий диск и он смонтирован в /data/disk1.
Так как мы подошли к вопросу распределенной фермы, то мы должны адрес name node забить в DNS либо же на каждой data node создать следующую запись в hosts (обоих серверов!!! Также нужно добавить хостнейм клиента на name node, то есть они должны знать друг друга! Иначе ничего работать не будет! Лучше всего, сразу внесите записи в DNS до начала тестов, а также убедитесь, что дата ноды и name нода находятся в одном домене второго уровня):
88.198.xx.xx hadoop.fastvps.ru hadoop
Далее ставим hadoop data node:
yum install -y hadoop-hdfs-datanode
Копируем стандартный конфиг для правки:
cp -r /etc/hadoop/conf.dist /etc/hadoop/conf.my_cluster
alternatives --verbose --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.my_cluster 50
alternatives --set hadoop-conf /etc/hadoop/conf.my_cluster
Теперь нужно настроить кластер, в файле /etc/hadoop/conf.my_cluster/core-site.xml
В блок confguration вносим следующее (это имя нашего кластера):
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop.fastvps.ru/</value>
</property>
<property><name>fs.trash.interval</name> <value>10080</value> </property>
Далее открываем файл /etc/hadoop/conf.my_cluster/hdfs-site.xml и в блок configuration вносим:
<property> <name>dfs.permissions.superusergroup</name>
<value>hadoop</value></property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/disk1/dfs/datanode</value>
</property>
Создаем необходимую папку:
mkdir -p /data/disk1/dfs/datanode
Выставляем права:
chown -R hdfs:hdfs /data/disk1/dfs/datanode
Запускаем data node:
/etc/init.d/hadoop-hdfs-datanode start
Теперь можно открыть статистику HDFS и смотреть, как блоки нашего 10 гигабайтного файла реплицируются на вновь добавленный сервер.
Как репликация закончится, можно смело отключать второй сервер (отключив сервер с name node Вы выведете кластер из строя, да) и продолжать работать с файловой системой как ни в чем ни бывало!
Ура!
Источник:
http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/4.2.0/CDH4-Installation-Guide/cdh4ig_topic_11_2.html