Статьи

Настройка виртуального кластера Hadoop с помощью Vagrant


Обычно для тестирования и использования виртуальных машин я выхожу в сеть, загружаю 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 для свободного использования.