Обычно для тестирования и использования виртуальных машин я выхожу в сеть, загружаю 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 действительно работает.
Все файлы для этого примера (кроме самой коробки) находятся в [email protected]: calo81 / vagrant-hadoop-cluster.git для свободного использования.