《Storm实时数据处理》学习笔记之一:使用Vagrant配置本地集群(上)

来源:互联网 发布:virtualbox mac 10.11 编辑:程序博客网 时间:2024/05/29 14:28

1.5章节,主要讲解了如何通过vagrant工具来在本地模拟出一个集群。下面是相关重点:

0)准备工作:安装vagrant/virtualbox/puppet:

我使用的是ubuntu操作系统,直接在终端执行“sudo apt-get install virtualbox puppet vagrant”即可

puppet:集中配置管理系统,为操作系统和应用程序提供声明式服务器配置

vagrant:自动配置virtualbox虚拟机,用于创建和部署虚拟化开发环境

本章我们的目标就是要通过vagrant来搭建出一套storm集群环境,其中包含4台虚拟机,分别作为storm的nimbus, zookeeper和supervisor(2台)节点

1)建立项目目录结构:


对于本章来说,modules目录暂时不需要,可以先不用创建

2)在项目根目录下编辑Vagrantfile

0. 可以先执行vagrant init,会自动生成一个Vagrantfile,我个人推荐先把该文件阅读一遍,可以对Vagrantfile配置虚拟机的方式有个朦胧的了解,然后在该文件基础上进行修改

1. 定义虚拟机配置

将集群中所有的虚拟机配置放在一个boxes数组里面,后面直接从中获取:

boxes = [  { :name => :nimbus, :ip => '192.168.33.100', :cpus => 2, :memory => 512 },  { :name => :supervisor1, :ip => '192.168.33.101', :cpus => 4, :memory => 1024 },  { :name => :supervisor2, :ip => '192.168.33.102', :cpus => 4, :memory => 1024 },  { :name => :zookeeper1, :ip => '192.168.33.201', :cpus => 1, :memory => 512 }]

对应一台nimbus机器,两台supervisor机器和一台zookeeper机器的配置

2. 使用循环来配置虚拟机

boxes.each do |opts|  config.vm.define opts[:name] do |config|    config.vm.box = "precise64"    config.vm.box_url = "http://files.vagrantup.com/precise64.box"    config.vm.network :private_network, ip: opts[:ip]    config.vm.host_name = "storm.%s" % opts[:name].to_s    config.vm.synced_folder "./data", "/vagrant_data"    config.vm.provider :virtualbox do |vb|      vb.customize ["modifyvm", :id, "--memory", opts[:memory]]      vb.customize ["modifyvm", :id, "--cpus", opts[:cpus] ] if opts[:cpus]    end  endend

3. 在循环中继续配置provision

vagrant强大的provision机制能帮助我们方便地安装和部署应用,这里我们会用到shell和puppet方式,主要目的是安装jdk6

config.vm.provision :shell, :inline => "cp -fv /vagrant_data/hosts /etc/hosts"config.vm.provision :shell, :inline => "apt-get update"if File.exist?("./data/jdk-6u45-linux-x64.bin") then  config.vm.provision :puppet do |puppet|    puppet.manifests_path = "manifests"    puppet.manifest_file = "jdk.pp"  endend

至此,本项目关于Vagrantfile文件的配置已经完成,在配置provision时我们发现还需要用到一个puppet脚本jdk.pp

4. 实现jdk.pp

在manifests目录下新增jdk.pp,通过puppet来为虚拟机安装指定的jdk

$JDK_VERSION = "1.6.0_45"package { "openjdk":  ensure  =>  absent,}exec { "installJdk":  command => "installJdk.sh",  path => "/vagrant/scripts",  logoutput => true,  creates => "/opt/jdk${JDK_VERSION}",}

这里原书中使用的jdk版本为jdk6u35,该版本目前oracle官网已经下载不到

但在实践时不敢冒然使用更高版本,怕后面会产生非预期的兼容性问题,因此在网上找了个jdk6u45,可以到http://ghaffarian.net/downloads/Java/JDK/下载

该puppet脚本调用了installJdk.sh来完成真正的安装流程,因此需要在scripts目录下新增installJdk.sh

<pre name="code" class="plain">#!/bin/shecho "Installing JDK!"chmod 775 /vagrant_data/jdk-6u45-linux-x64.bincd /rootyes | /vagrant_data/jdk-6u45-linux-x64.bin/bin/mv /root/jdk1.6.0_45 /optif [ -f /usr/bin/java ];then    /bin/rm -rv /usr/bin/javafiif [ -f /usr/bin/javac ];then    /bin/rm -rv /usr/bin/javacfi/bin/ln -s /opt/jdk1.6.0_45/bin/java /usr/bin/bin/ln -s /opt/jdk1.6.0_45/bin/javac /usr/binJAVA_HOME=/opt/jdk1.6.0_45export JAVA_HOMEPATH=$PATH:$JAVA_HOME/binexport PATHecho "JDK Installed!"
执行前,确保将已经下载的jdk-6u45-linux-x64.bin放到data目录下

5. 在data目录下定义hosts文件

Vagrantfile的shell命令中还会用到hosts文件,该文件在本地集群环境中充当DNS

127.0.0.1       localhost192.168.33.100  storm.nimbus192.168.33.101  storm.supervisor1192.168.33.102  storm.supervisor2192.168.33.201  storm.zookeeper1

但是这里遇到一个比较大的坑:在实际执行到修改hosts以后,再执行后面的命令时会发现终端打印类似“sudo: unable to resolve host storm”的log

将hosts文件与原始文件进行对比,发现原因是缺少storm到本地ip的映射,我的解决方法是在Vagrantfile中再对hosts进行一下编辑

# 解决"unable to resolve host"的问题config.vm.provision :shell, :inline => "sed -i \"2 i 127.0.1.1       storm.%s storm\" /etc/hosts" % opts[:name].to_s


至此,我们已经完成了集群搭建的基础部分:模拟了一个拥有4台虚拟机的集群,并在每台机器上都安装了jdk6

在实际部署的时候,可能还会用到vagrant的常用参数,包括destroy,provision等等,用法在vagrant help中写得清楚,非常这里不再赘述

在实践时怎么保证我们的集群是否达到预期呢?我总结了以下几个办法:

1、 集群是否能够正常启动:回到项目根目录,执行"vagrant up"命令可以启动集群

2、 虚拟机是否能够登录:执行“vagrant ssh nimbus"可以登陆nimbus虚拟机上,也可以将"nimbus“替换为其它节点名称

3、 在nimbus虚拟机终端输入"hostname -f"命令,查看该主机名称,正确情况下应该显示“storm.nimbus"

4、 在虚拟机中输入"java -version”,验证jdk是否正确安装,预期会显示:

java version "1.6.0_45"

Java(TM) SE Runtime Environment (build 1.6.0_45-b06)

Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

如果有问题,就根据错误日志多google一下,多看看stackoverflow,总能找到解决的方法!

                                             
0 0