virtualbox ubuntu hadoop-1.0.4 完全分布式
主机操作系统:Ubuntu-12.04
虚拟机操作系统:Ubuntu-10.04.iso
虚拟机软件:Virtualbox-4.2.deb
https://www.evernote.com/pub/xuyuantree/10_hadoop
设置VirtualBox的Host-only网络
1. 安装虚拟机Virtualbox:
$ sudo dpkg -i virtualbox.deb
2. 在Ubuntu 12.04 下,打开VirtualBox,选择"管理"→"全局设定"→"网络"→"添加Host-only网络",
创建一个新的Host-only网络,名字为vboxnet0,点击"确定"。
默认情况下,vboxnet0的IP地址为192.168.56.1,IP网络掩码为255.255.255.0。默认DHCP服务器为禁用,即禁用DHCP服务。
PS:本机(主机,宿主机)采用无线上网,不需要配置etho。ifconfig可以查看vboxnet0的IP配置
vboxnet0
inet addr:192.168.56.1 Bcast:192.168.56.255 Mask:255.255.255.0
创建虚拟机UB01
1. 新建虚拟机,名字为UB01,默认内存512M,硬盘大小8GB
2. 创建完虚拟机后,会在左侧菜单树上看到UB01,注意,不要马上启动虚拟机UB01
3. 设置UB01的网卡连接类型:选择"网络"→连接方式:Host-only Adapter,界面名称:vboxnet0,混杂模式:全部允许
4. 设置UB01安装介质:选择"存储"→"控制器:IDE",添加一个虚拟光驱,选择主机上的ubuntu-10.04.iso文件
5. 启动UB01,安装VM,设置用户名和密码时,统一都写成hadoop,安装完后会重新启动
设置网络IP地址
1. ifconfig默认情况下IP地址采用DHCP动态分配,要改为静态IP地址分配
$ sudo gedit /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.56.101
netmask 255.255.255.0
gateway 192.168.56.1 #vboxnet0网卡的ip地址是 192.168.56.1
dns-nameservers 8.8.8.8
2. 配置DNS服务器,默认情况下使用host-only这个文件不存在。如果采用bridge等其他方式会有这个文件
$ sudo gedit /etc/resolv.conf
nameserver 8.8.8.8
3. 重启网络
$ sudo /etc/init.d/networking restart
4. 查看IP地址是否设置成功
$ ifconfig
eth0
inet addr:192.168.56.101 Bcast:192.168.56.255 Mask:255.255.255.0
5. 主机和虚拟机互ping
虚拟机终端: ping 192.168.56.1
主机终端: ping 192.168.56.101
虚拟机安装增强工具包
1. 在Virtualbox的UB01设置共享文件夹,目的是将主机中的文件拷贝到虚拟机中。
添加共享文件夹,固定分配。选择主机的download文件夹,选项为:自动挂载。
2. 安装增强工具,在启动UB01的虚拟机的菜单栏(不是Virtualbox的菜单栏),选择"安装增强工具包",
可以使用图形安装auto run,安装完后需要重启虚拟机,或者使用命令行方式:
mount /dev/cdrom 挂载光驱
cd /mnt/cdrom 进入光盘
./VBoxLinuxAdditions.run 执行安装
reboot 重启系统
3. 重启系统后,执行以下命令。增强工具包还可以全屏显示虚拟机。
mkdir /mnt/share 新建挂载点mountpoint
mount -t vboxsf download /mnt/share 挂载共享文件夹,download是在Virtualbox的UB01设置的共享文件夹的名称
cd /mnt/share
ls /mnt/share
虚拟机安装JDK和Hadoop
1. 在主机中解压JDK和HADOOP,在虚拟机的共享文件夹也能看到解压后的文件
tar -zxvf jdk1.7.0_04.tar.gz
tar -zxvf hadoop-1.0.4.tar.gz
2. 将jdk和hadoop复制到/home/hadoop下
cp -R /mnt/share/jdk1.7.0._04/home/hadoop
cp -R /mnt/share/hadoop-1.0.4/home/hadoop
不要采用sudo cp -R来复制命令,这样会以root用户运行,采用ls -l查看/home/hadoop复制后的jdk和hadoop,
发现用户和用户组都为root了,还需要更改为当前用户hadoop,hadoop这个用户是我们在安装虚拟机时指定的用户名
sudo chown hadoop jdk1.7.0_04 更改jdk文件夹的所属用户为hadoop.
sudo chgrp hadoop jdk1.7.0_04 更改文件夹的所属用户组
3. 设置环境变量
$ sudo gedit /etc/profile
export JAVA_HOME=/home/hadoop/jdk1.7.0_04
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export HADOOP_HOME=/home/hadoop/hadoop-1.0.4
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$PATH
$ cd /home/hadoop/hadoop-1.0.4/conf
$ sudo gedit hadoop-env.sh
export JAVA_HOME=/home/hadoop/jdk1.7.0_04
4. 重新加载配置
source /etc/profile
5. 验证JDK和Hadoop安装成功
javac -version
hadoop version
复制虚拟机
1. 关闭UB01虚拟机,右击UB01虚拟机,选择"复制"
2. 填写新的虚拟机名字UB02
3. 选择"重新初始化所有网卡的MAC地址",点击"下一步"。
4. 选择"链接复制",点击复制。 选择链接复制,不需要完整复制UB01整个虚拟机
5. 新的虚拟机创建成功。
创建后,UB01会显示(UB01和UB02的链接基础),在"存储"→"控制器:IDE",会变为:VBoxGuestAdditions.iso
UB02的"存储"→"控制器:IDE",也是VBoxGuestAdditions.iso,"控制器:SATA"也采用UB01:UB01.vdi
以同样的方法再复制一个虚拟机UB03
修改主机名
在UB01中修改主机名,原先的主机名为hadoop,即安装虚拟机时指定的
$ sudo passwd root 为root用户设置密码
$ su 以root用户身份登录
$ gedit /etc/hosts
将原先的
127.0.0.1 localhost
127.0.0.1 hadoop
更改为
127.0.0.1 localhost
127.0.0.1 UB01
$ gedit /etc/hostname
UB01
$ hostname UB01
$ su - hadoop
$ hostname 查看主机名
UB01
同样对UB02和UB03修改主机名为UB02,UB03,并重启虚拟机。以下操作UB02和UB03是一样的。
主机,虚拟机互ping
1. 因为虚拟机UB02,UB03是从UB01复制过来的,只需要更改IP地址就可以了
首先删除UB02,UB03网络配置缓存文件
#rm /etc/udev/rules.d/70-persistent-net.rules
2. 重启UB02,UB03虚拟机
3. 修改UB02,UB03的IP地址
$ sudo gedit /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.56.102 # UB03修改为192.168.56.103
netmask 255.255.255.0
gateway 192.168.56.1
dns-nameservers 8.8.8.8
4. 重启网络
$ sudo /etc/init.d/networking restart
5. 查看IP地址是否设置成功
$ ifconfig
eth0
inet addr:192.168.56.102 Bcast:192.168.56.255 Mask:255.255.255.0
6. 主机和虚拟机,虚拟机和虚拟机互ping
UB02 UB01 UB03 主机
ping 192.168.56.1 ping 192.168.56.1 ping 192.168.56.1 ping 192.168.56.101
ping 192.168.56.101 ping 192.168.56.102 ping 192.168.56.101 ping 192.168.56.102
ping 192.168.56.103 ping 192.168.56.103 ping 192.168.56.102 ping 192.168.56.103
7. 在UB01,UB02,UB03的/etc/hosts添加虚拟机的IP地址和主机名
192.168.56.101 UB01
192.168.56.102 UB02
192.168.56.103 UB03
这一步还要注意:安装虚拟机的时候会自动添加以下两行
127.0.0.1 localhost
127.0.0.1 UB01
要把第二行删除掉。注意:第一行不能删除。同样对UB02和UB03都做这样的处理。
8. 使用主机名来ping虚拟机
UB02 UB01 UB03
ping UB01 ping UB02 ping UB01
ping UB03 ping UB03 ping UB02
如果在宿主机的/etc/hosts加入7中的配置,则在宿主机也可以用主机名来ping虚拟机。或者在虚拟机加入192.168.56.1 main则虚拟机可以ping main来ping宿主机。
虚拟机上网
1. 下载firestarter软件,因为宿主机采用无线网络CMCC,你懂得。在首选项--防火墙--网络配置
Internet connected network device:选择无线设备(wlan0)
Local network connected device:选择未知设备(vboxnet0)
并勾选:Enable Internet connection sharing
2. 启动防火墙,虚拟机中就可以上网了(可以在firestarter的连接情况里查看到虚拟机的ip地址),就可以进行下面的步骤
3. 采用端口映射:在宿主机上增加一条iptables规则:每次重启宿主机,都需要重新设置这条iptables规则(iptables试了不行,不知道哪里出错了,暂不试验)
#iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -j MASQUERADE
#因为vboxnet0是192.168.56.0/24网段的
SSH无密码验证
1. 分别在UB01,UB02,UB03下执行以下命令
$ sudo apt-get update 更新源
$ sudo apt-get install ssh rsync ssh-openserver 安装ssh
$ ssh-keygen -t rsa 生成一个公钥和私钥对(一路回车)
$ cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys 使hadoop用户不输入密码通过SSH访问localhost
$ ssh localhost 验证安装是否成功(输入yes)
2. 生成的文件都会不一样。现在可以把三台虚拟机生成的密钥进行交换。
目的是把 UB01 的密钥交给UB02 和 UB03,对 UB02 和UB03 做同样处理。在有需要输入密码的地方输入hadoop
UB01
scp ~/.ssh/id_rsa.pub hadoop@UB02:/home/hadoop/.ssh/id_rsa.pub.UB01
scp ~/.ssh/id_rsa.pub hadoop@UB03:/home/hadoop/.ssh/id_rsa.pub.UB01
UB02
scp ~/.ssh/id_rsa.pub hadoop@UB01:/home/hadoop/.ssh/id_rsa.pub.UB02
scp ~/.ssh/id_rsa.pub hadoop@UB03:/home/hadoop/.ssh/id_rsa.pub.UB02
UB03
scp ~/.ssh/id_rsa.pub hadoop@UB01:/home/hadoop/.ssh/id_rsa.pub.UB03
scp ~/.ssh/id_rsa.pub hadoop@UB02:/home/hadoop/.ssh/id_rsa.pub.UB03
3. 完成后每一个虚拟机的 ~/.ssh/中应该有3 个密钥,一个是自己的,另两个是别人的,把自己的密钥连同别人的两个密钥加到授权密钥中
UB01
cat id_rsa.pub.UB02 >> authorized_keys
cat id_rsa.pub.UB03 >> authorized_keys
UB02
cat id_rsa.pub.UB01 >> authorized_keys
cat id_rsa.pub.UB03 >> authorized_keys
UB03
cat id_rsa.pub.UB01 >> authorized_keys
cat id_rsa.pub.UB02 >> authorized_keys
4. 每台虚拟机的密钥authorized_keys的格式如下,当然因为cat << 添加的顺序会不同
ssh-rsa AAAA............
.................== hadoop@UB01
ssh-rsa BBBB............
.................== hadoop@UB02
ssh-rsa CCCC............
.................== hadoop@UB03
5. 接下来检验相互之间是否可以通过 ssh实现无密码访问。访问成功会显示欢迎信息,初次访问需要 yes ,之后就可以不直接访问了。
UB01 UB02 UB03
ssh UB02 ssh UB01 ssh UB01
ssh UB03 ssh UB03 ssh UB02
和ping一样,如果要让虚拟机和宿主机互相ssh(比如宿主机也装了hadoop,并且把宿主机当做namenode和jobtracker),
同样要对宿主机进行上面的所有步骤,并且把宿主机的密钥和三个虚拟机的密钥交换。即宿主机和虚拟机的密钥包含了4对。注意宿主机的用户也必须是hadoop。
Hadoop完全分布式模式
1. 修改hadoop配置文件core-site.xml mapred-site.xml hdfs-site.xml masters slaves
$ cd /home/hadoop/hadoop-1.0.4/conf
$ sudo gedit core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://UB01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
</configuration>
$ sudo gedit hdfs-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>UB01:9001</value>
</property>
</configuration>
$ sudo gedit mapred-site.xml
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
$ sudo gedit masters
UB01
$ sudo gedit slaves
UB02
UB03
2. 节点中所有虚拟机关于hadoop的配置都是一样的,可以直接复制整个文件夹,在UB01中操作
scp -r hadoop-1.0.4 UB02:~/
scp -r hadoop-1.0.4 UB03:~/
这样就把UB01:~/hadoop-1.0.4(即/home/hadoop/hadoop-1.0.4)复制到UB02和UB03的对应目录下即都是/home/hadoop/hadoop-1.0.4
3. 在UB01中进行格式化分布式文件系统
$ bin/hadoop namenode -format
查看打印的日志,host = UB01/192.168.56.101 如果/etc/hosts中有127.0.0.1 localhost这一行,则这里的host = UB01/127.0.0.1
4. 启动守护进程
$ bin/hadoop start-all.sh
同样在UB01中操作,注意:在UB02和UB03中不需要进行任何操作。
因为masters和slaves说明了主节点和从节点,start-all命令会自动启动从节点上的datanode进程和tasktracker进程
从节点UB02和UB03只有两个进程DataNode TaskTracker。同样还可以看到生成了tmp文件夹,这个路径是在core-site中指定的hadoop.tmp.dir
5. 现在可以使用浏览器查看,可以在宿主机添加UB01,UB02,UB03的IP地址和主机名,因为宿主机能ping通所有的虚拟机
192.168.56.101 UB01
192.168.56.102 UB02
192.168.56.103 UB03
这样在宿主机就可以使用主机名来访问,当然也可以在各个虚拟机中使用浏览器访问
6. NameNode
http://ub01:50030
http://ub01:50070
7. DataNode
http://ub02:50060
http://ub02:50060
Hadoop单词统计示例
下面来试验下hadoop自带的统计单词的例子
我们将conf下以xml结尾的文件复制到HDFS中,使用自带的example.jar来运行MapReduce程序
注意:这里的路径/input /output都是HDFS分布式文件系统中的文件格式。当然也可以写成input output相对路径的形式
$ cd hadoop-1.0.4/conf
$ hadoop dfs -mkdir /input
$ hadoop dfs -put *.xml /input
$ cd ..
$ hadoop jar hadoop-example-*.jar wordcount /input /output
执行hadoop dfs -mkdir /input会在HDFS的根目录生成input文件夹。执行最后一个命令会在根目录生成output文件夹
可以打开http://ub01:50070,点击Browse the filesystem可以看到在根目录下有home,input,output三个文件夹
点击output,进入part-r-00000可以看到最终的结果。以who为例,统计出了3个
为了验证MapReduce是否工作正常,我们使用Linux的脚本来验证
$ grep -o 'who' *.xml | wc -l
3
参考文档
使用Virtualbox部署OpenStack: http://wiki.stacklab.org/doku.php?id=stacklab:documentation:use-virtualbox-install-openstack
VirtualBox环境下基于多台ubuntu虚拟机的Hadoop分布式计算环境搭建(host-only):http://blog.csdn.net/xiaoyao3857/article/details/8125289
详细 完整分布模式安装hadoop VirtualBox 3虚拟机 简单复制(桥接):http://f.dataguru.cn/thread-18125-1-1.html
virtualbox 共享文件夹:http://www.cnblogs.com/52linux/archive/2012/03/07/2384381.html
ubuntu下virtualbox配置host-only网络:http://www.cnblogs.com/xiangzi888/archive/2012/07/05/2578536.html