Обычно для тестирования и использования виртуальных машин я выхожу в сеть, загружаю ISO-образ машины, которую я хочу
установите, запустите Virtual Box, попросите его инициализироваться из iso, установите ОС вручную, а затем установите
приложения, которые я хочу использовать. Это скучный и утомительный процесс, о котором я никогда не заботился. Тем не менее, недавно я обнаружил силу Vagrant, а также Puppet. Они позволяют мне автоматизировать все шаги, которые я ранее делал вручную.
Здесь я тестирую процесс автоматической настройки кластера Hadoop на виртуальных машинах для полностью распределенного режима.
Прежде всего убедитесь, что у вас установлен Ruby. Я тестирую с Ruby 1.9.3. Вам также необходимо установить Virtual Box. У меня версия 4.1.
Затем из командной строки установите vagrant gem:
gem install vagrant
Vagrant — отличный инструмент, который позволяет нам управлять нашими машинами Virtual Box с помощью командной строки и простых файлов конфигурации.
Сначала мы установим виртуальную машину Linux Ubuntu (или коробку как она есть).
называемые в бродягу)
бродячий коробка добавить базовый Hadoop http://files.vagrantup.com/lucid64.box
Затем переходит в каталог , где мы хотим , чтобы наше «рабочее пространство» , а также каталог для создания бродячего конфигурационного файла для наших Новая коробка и выполнить. Это создаст файл Vagrantfile с конфигурацией vagrant.
vagrant init base-hadoop
Виртуальная машина готова к запуску . Вы можете запустить его, выполнив:
vagrant up
Это виртуальная машина работает. Вы можете подключиться к нему с помощью SSH. Тип
vagrant ssh
Следующим шагом является загрузка Puppet. Сделайте это, перейдя по URL http://puppetlabs.com/misc/download-options/
Puppet — это инструмент, который позволяет нам автоматизировать процесс подготовки серверов. Мы будем использовать его для управления нашими виртуальными машинами,
установка необходимого программного обеспечения на них и выполнение необходимых услуг.
Таким образом, мы создаем каталог, куда мы собираемся поместить наши манифесты (файлы конфигурации марионеток).
Mkdir манифесты
в этом новом каталоге мы создаем файл с именем base-hadoop.pp со следующим содержимым:
group { "puppet":
ensure => "present",
}
В созданном ранее файле Vagrantfile мы раскомментируем строки, которые выглядят так:
config.vm.provision :puppet do |puppet|
puppet.manifests_path = "manifests"
puppet.manifest_file = "base-hadoop.pp"
end
Следующее, что нам нужно сделать, это указать Puppet установить Java на наших серверах. для этого мы открываем файл base-hadoop.pp и добавляем следующее:
exec { 'apt-get update':
command => 'apt-get update',
}
package { "openjdk-6-jdk" :
ensure => present
require => Exec['apt-get update']
}
Следующая вещь, которую мы должны установить hadoop. Для этого мы создадим новый кукольный модуль. Кукольный модуль используется для инкапсуляции ресурсов, принадлежащих одному и тому же компоненту.
Мы выполняем
mkdir -p modules / hadoop / manifest.
Затем мы создаем init.pp в этом новом каталоге манифестов со следующим содержимым:
class hadoop {
$hadoop_home = "/opt/hadoop"
exec { "download_hadoop":
command => "wget -O /tmp/hadoop.tar.gz http://apache.mirrors.timporter.net/hadoop/common/hadoop-1.0.3/hadoop-1.0.3.tar.gz",
path => $path,
unless => "ls /opt | grep hadoop-1.0.3",
require => Package["openjdk-6-jdk"]
}
exec { "unpack_hadoop" :
command => "tar -zxf /tmp/hadoop.tar.gz -C /opt",
path => $path,
creates => "${hadoop_home}-1.0.3",
require => Exec["download_hadoop"]
}
}
Мы сделали несколько вещей здесь, и они почти самоочевидны. Мы в основном
установка переменной, указывающей на нашу установку hadoop. Мы
загружая двоичные файлы Hadoop из его местоположения Apache, и мы извлекаем его в указанный каталог hadoop_home.
Нам нужно добавить наш новый модуль в основной файл конфигурации кукол. Мы добавляем следующую строку вверху файла base-hadoop.pp:
include hadoop
Затем мы добавляем этот новый путь модулей в наш Vagrantfile. Так что теперь наш раздел кукол выглядит так:
config.vm.provision :puppet do |puppet|
puppet.manifests_path = "manifests"
puppet.manifest_file = "base-hadoop.pp"
puppet.module_path = "modules"
end
Мы выполняем следующее, чтобы перезагрузить бродячую машину:
vagrant reload
Эта команда перезагрузит бродячую машину и выполнит рецепты марионеток. Это установит необходимое программное обеспечение.
Нам понадобится кластер виртуальных машин. Вагрант поддерживает это. Мы открываем наш Vagrantfile и заменяем его содержимое следующим:
Vagrant::Config.run do |config|
config.vm.box = "base-hadoop"
config.vm.provision :puppet do |puppet|
puppet.manifests_path = "manifests"
puppet.manifest_file = "base-hadoop.pp"
puppet.module_path = "modules"
end
config.vm.define :master do |master_config|
master_config.vm.network :hostonly, "192.168.1.10"
end
config.vm.define :backup do |backup_config|
backup_config.vm.network :hostonly, "192.168.1.11"
end
config.vm.define :hadoop1 do |hadoop1_config|
hadoop1_config.vm.network :hostonly, "192.168.1.12"
end
config.vm.define :hadoop2 do |hadoop2_config|
hadoop2_config.vm.network :hostonly, "192.168.1.13"
end
config.vm.define :hadoop3 do |hadoop3_config|
hadoop3_config.vm.network :hostonly, "192.168.1.14"
end
end
После этого мы выполняем:
vagrant up,
который запустится, и он предоставит все серверы. Это займет некоторое время.
Но мы не готовы. Далее нам нужно настроить кластер hadoop. В каталоге modules / hadoop мы создаем еще один каталог с именем files. Здесь мы создадим необходимые файлы конфигурации для нашего кластера hadoop.
мы создаем следующие файлы:
core-site.xml
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>fs.default.name</name> <value>hdfs://master:9000</value> <description>The name of the default file system. A URI whose scheme and authority determine the FileSystem implementation.</description> </property> </configuration>
HDFS-site.xml
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>dfs.replication</name> <value>3</value> <description>The actual number of replications can be specified when the file is created.</description> </property> </configuration>
mapred-site.xml
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>mapred.job.tracker</name> <value>master:9001</value> <description>The host and port that the MapReduce job tracker runs at.</description> </property> </configuration>
master
192.168.1.11
slaves
192.168.1.12 192.168.1.13 192.168.1.14
Затем нам нужно указать puppet скопировать эти файлы в наш кластер. Поэтому мы модифицируем наш файл init.pp в модуле hadoop puppet, чтобы он содержал следующее:
class hadoop {
$hadoop_home = "/opt/hadoop"
exec { "download_hadoop":
command => "wget -O /tmp/hadoop.tar.gz http://apache.mirrors.timporter.net/hadoop/common/hadoop-1.0.3/hadoop-1.0.3.tar.gz",
path => $path,
unless => "ls /opt | grep hadoop-1.0.3",
require => Package["openjdk-6-jdk"]
}
exec { "unpack_hadoop" :
command => "tar -zxf /tmp/hadoop.tar.gz -C /opt",
path => $path,
creates => "${hadoop_home}-1.0.3",
require => Exec["download_hadoop"]
}
file {
"${hadoop_home}-1.0.3/conf/slaves":
source => "puppet:///modules/hadoop/slaves",
mode => 644,
owner => root,
group => root,
require => Exec["unpack_hadoop"]
}
file {
"${hadoop_home}-1.0.3/conf/masters":
source => "puppet:///modules/hadoop/masters",
mode => 644,
owner => root,
group => root,
require => Exec["unpack_hadoop"]
}
file {
"${hadoop_home}-1.0.3/conf/core-site.xml":
source => "puppet:///modules/hadoop/core-site.xml",
mode => 644,
owner => root,
group => root,
require => Exec["unpack_hadoop"]
}
file {
"${hadoop_home}-1.0.3/conf/mapred-site.xml":
source => "puppet:///modules/hadoop/mapred-site.xml",
mode => 644,
owner => root,
group => root,
require => Exec["unpack_hadoop"]
}
file {
"${hadoop_home}-1.0.3/conf/hdfs-site.xml":
source => "puppet:///modules/hadoop/hdfs-site.xml",
mode => 644,
owner => root,
group => root,
require => Exec["unpack_hadoop"]
}
}
Затем мы выполняем:
vagrant provision.
И мы копируем эти файлы на все наши серверы.
Нам нужно установить ssh-беспарольную связь между нашими серверами. Мы модифицируем наш hadoop-base.pp и оставляем его так:
file {
"/root/.ssh/id_rsa":
source => "puppet:///modules/hadoop/id_rsa",
mode => 600,
owner => root,
group => root,
require => Exec['apt-get update']
}
file {
"/root/.ssh/id_rsa.pub":
source => "puppet:///modules/hadoop/id_rsa.pub",
mode => 644,
owner => root,
group => root,
require => Exec['apt-get update']
}
ssh_authorized_key { "ssh_key":
ensure => "present",
key => "AAAAB3NzaC1yc2EAAAADAQABAAABAQCeHdBPVGuSPVOO+n94j/Y5f8VKGIAzjaDe30hu9BPetA+CGFpszw4nDkhyRtW5J9zhGKuzmcCqITTuM6BGpHax9ZKP7lRRjG8Lh380sCGA/691EjSVmR8krLvGZIQxeyHKpDBLEmcpJBB5yoSyuFpK+4RhmJLf7ImZA7mtxhgdPGhe6crUYRbLukNgv61utB/hbre9tgNX2giEurBsj9CI5yhPPNgq6iP8ZBOyCXgUNf37bAe7AjQUMV5G6JMZ1clEeNPN+Uy5Yrfojrx3wHfG40NuxuMrFIQo5qCYa3q9/SVOxsJILWt+hZ2bbxdGcQOd9AXYFNNowPayY0BdAkSr",
type => "ssh-rsa",
user => "root",
require => File['/root/.ssh/id_rsa.pub']
}
Теперь мы готовы запустить наш кластер hadoop. Для этого еще раз модифицируем файл init.pp в модуле hadoop puppet, добавляем следующее в конце перед закрытием класса hadoop:
file {
"${hadoop_home}-1.0.3/conf/hadoop-env.sh":
source => "puppet:///modules/hadoop/hadoop-env.sh",
mode => 644,
owner => root,
group => root,
require => Exec["unpack_hadoop"]
}
Файл haddop-env.sh является оригинальным, но мы раскомментировали параметр JAVA_HOME и указали на правильную установку Java.
Мы можем дать разные имена каждому хосту в Vagrantfile. Для этого мы заменим его содержимое следующим:
Vagrant::Config.run do |config|
config.vm.box = "base-hadoop"
config.vm.provision :puppet do |puppet|
puppet.manifests_path = "manifests"
puppet.manifest_file = "base-hadoop.pp"
puppet.module_path = "modules"
end
config.vm.define :backup do |backup_config|
backup_config.vm.network :hostonly, "192.168.1.11"
backup_config.vm.host_name = "backup"
end
config.vm.define :hadoop1 do |hadoop1_config|
hadoop1_config.vm.network :hostonly, "192.168.1.12"
hadoop1_config.vm.host_name = "hadoop1"
end
config.vm.define :hadoop2 do |hadoop2_config|
hadoop2_config.vm.network :hostonly, "192.168.1.13"
hadoop2_config.vm.host_name = "hadoop2"
end
config.vm.define :hadoop3 do |hadoop3_config|
hadoop3_config.vm.network :hostonly, "192.168.1.14"
hadoop3_config.vm.host_name = "hadoop3"
end
config.vm.define :master do |master_config|
master_config.vm.network :hostonly, "192.168.1.10"
master_config.vm.host_name = "master"
end
end
Давайте сделаем «
перезагрузку » и дождемся перезагрузки всех систем.
Мы подготовили наши системы. Давайте перейдем к нашему мастер-узлу и запустим все:
vagrant ssh master,
затем, когда мы войдем в систему, перейдем в /opt/hadoop-1.0.3/bin
и выполним
:
sudo ./hadoop namenode -format
sudo ./start-all.sh
Теперь мы запустили наш кластер hadoop. Теперь мы можем посетить http://192.168.1.10:50070/, чтобы получить доступ к нашему главному узлу и увидеть, что наш кластер hadoop действительно работает.
Все файлы для этого примера (кроме самой коробки) находятся в git@github.com: calo81 / vagrant-hadoop-cluster.git для свободного использования.