最近在捣鼓云计算的东西,在虚拟机中装完OpenStack又捣鼓Hadoop,搞了半天,写下以方便后人吧。
1. 安装环境:
宿主机:MacOS(这个没什么要紧,windows一样可以完成)
虚拟机软件:VirtualBox
操作系统: 全部都为ubuntu13.04
网络环境:
主机名 IP
cloud 192.168.3.1(内网,使用VirtualBOX inet)
192.168.1.201(外网,桥接无线网卡)
master机器(主要的控制机器)
network 192.168.3.2 (内网,使用VirtualBOX inet)
192.168.1.200(外网,桥接无线网卡)
slave机器(1)
compute 192.168.3.3(内网,使用VirtualBOX inet)
slave机器(2)
这样原因是之前OpenStack建立的环境,懒得弄了,就使用原有网络环境了。所有的ip均为静态ip。
2. 安装java环境
之前看到别人写的都是sudo apt-get install sun-java6-....,事实上现在不好使了,因为sun被oracle收购了。
因此,前往http://www.oracle.com/technetwork/java/javase/downloads/index.html, 将java的jdk环境下下来。
可以在虚拟机内直接wget,也可以放到宿主机上再copy进去。Anyway, as you wish.
下下来后,我的文件名为:jdk-7u25-linux-x64.tar.gz, 存储在/home/username/jdk-7u25-linux-x64.tar.gz
接下来:
sudo mkdir /usr/lib/jvm
sudo cp /home/username/jdk-7u25-linux-x64.tar.gz /usr/lib/jvm/
sudo cd /usr/lib/jvm/
sudo tar zxvf jdk-7u25-linux-x64.tar.gz
这时候,/usr/lib/jvm/下就有了jdk的相关java环境文件,文件夹名: jdk1.7.0_25
设置JAVA_HOME
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_25
export JRM_HOME=${JAVA_HOME}/jre
export PATH=${JAVA_HOME}/bin:$PATH
将以上语句,放到/etc/profile 文件的最后。
运行 java -version,出现以下,则环境安装好了。
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
2. 安装ssh
为什么要安装ssh?
事实上,Hadoop是一个集群运行环境,因此,需要多个机器同时运行来完成任务。这时候就需要有一台机器能够控制其他所有的机器。ssh成为了最好的工具。
但平常ssh的连接,总是会提示需要密码之类,因此,我们在这里需要为master机器和slave机器来配置连接的秘钥,保证机器之间的ssh顺畅无需密码之类。
2.1 建立公共帐户 hadoop以及其文件夹
sudo useradd hadoop
sudo mkdir /home/hadoop
sudo chown hadoop -R /home/hadoop
sudo chgrp hadoop -R /home/hadoop
2.2 安装ssh
这里由于我在安装ubuntu时候,已经选择了安装openSSH Server, 因此ssh已经安装好。
没有的可以 sudo apt-get install ssh 来安装
2.3 建立配对的钥匙
这里我们使用hadoop用户,来创建钥匙
sudo su hadoop
cd ~
ssh-keygen -t rsa
然后按照提示,一路回车,就会在/home/hadoop/.ssh/ 下声称密钥对:
id_rsa,id_rsa.pub
然后master机器上:
cp /home/hadoop/.ssh/id_rsa.pub authorized_keys
如果本机上已经存在authorized_keys文件,则将id_rsa.pub的内容添加到authorized_keys最后。
接下来,将master机器上的authorized_keys, 复制到两台slave机器上:
前提:两台slave机器上,已经执行了2.1,2.2和2.3的以上步骤。
scp /home/hadoop/.ssh/authorized_keys 192.168.3.2:/home/hadoop/.ssh/authorized_keys
scp /home/hadoop/.ssh/authorized_keys 192.168.3.3:/home/hadoop/.ssh/authorized_keys
测试一下连接:
ssh localhost
第一次连接会出现:
The authenticity of host ‘cloud (192.168.3.1)’ can’t be established.
RSA key fingerprint is *****:******.
Are you sure you want to continue connecting (yes/no)?
这是第一次连接,需要存储一下known_hosts, 输入yes,未来就不会再询问。
同理可以测试一下2台slave机器的ssh连接:
ssh 192.168.3.2
ssh 192.168.3.3
如果未要求输入密码,则ssh安装成功。
Note:
测试ssh连接时,一定记得在hadoop用户下进行,即执行过sudu su hadoop来切换用户。
3. 安装Hadoop
前往http://hadoop.apache.org/ 下载一个Hadoop版本。
目前Hadoop的版本管理稍微显得有些混乱,建议如果会在生产环境下使用的话,使用Hadoop1.2.x版本来测试和搭建。
我下载后的版本是:hadoop-1.2.0-bin.tar.gz
以下在master 机器上操作:
3.1 解压Hadoop
Hadoop用户下操作:
cp /home/username/hadoop-1.2.0-bin.tar.gz /home/hadoop/
cd /home/hadoop/
tar zxvf hadoop-1.2.0-bin.tar.gz
mv hadoop-1.2.0 hadoop
即:将解压后的hadoop文件夹命名为hadoop.
3.2 增加Hadoop_HOME 环境变量
export HADOOP_HOME=/home/hadoop/hadoop
export PATH=${HADOOP_HOME}/bin:${JAVA_HOME}/bin:$PATH
将以上语句放到/etc/profile中。注意PATH行是修改。
3.3 配置hosts环境
修改/etc/hosts, 增加:
192.168.3.1 cloud
192.168.3.2 network
192.168.3.3 compute
请在两台slave机器上同样增加hosts设置
4. 配置Hadoop
现在可以开始配置Hadoop的几个配置文件了,所有的配置文件都在/home/hadoop/hadoop/conf 中
4.1 core-site.xml
fs.default.name
hdfs://192.168.3.1:49000
hadoop.tmp.dir
/home/hadoop/hadoop/tmp
mapred.job.tracker
192.168.3.1:49001
dfs.replication
2
dfs.name.dir
/home/hadoop/name1,/home/hadoop/name2
Nothing
dfs.data.dir
/home/hadoop/data1,/home/hadoop/data2
Nothing At All
该文件,主要是设置JAVA_HOME.
虽然在/etc/profile里已经设置过,但这里也需要有。
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_25
该文件,指定master机的ip或者主机名。
192.168.3.1
该文件,指定slaves机的ip或者主机名
192.168.3.2
192.168.3.3
一行一个。
至此,就基本完成了Hadoop在master机器上的配置。
那么接下来,将所有的东西从master机器上放到slave机器上
scp -r /home/hadoop/hadoop 192.168.3.2:/home/hadoop
scp -r /home/hadoop/hadoop 192.168.3.3:/home/hadoop
这样,在slave机上就有相同配置了。
5. 启动Hadoop
5.1 初始化namenode
cd /home/hadoop/hadoop
bin/hadoop namenode -formate
12/02/06 00:46:50 INFO namenode.NameNode:STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = ubuntu/127.0.1.1
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 0.20.203.0
STARTUP_MSG: build =http://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20-security-203-r 1099333; compiled by 'oom' on Wed May 4 07:57:50 PDT 2011
************************************************************/
12/02/0600:46:50 INFO namenode.FSNamesystem: fsOwner=root,root
12/02/06 00:46:50 INFO namenode.FSNamesystem:supergroup=supergroup
12/02/06 00:46:50 INFO namenode.FSNamesystem:isPermissionEnabled=true
12/02/06 00:46:50 INFO common.Storage: Imagefile of size 94 saved in 0 seconds.
12/02/06 00:46:50 INFO common.Storage: Storagedirectory /opt/hadoop/hadoopfs/name1 has been successfully formatted.
12/02/06 00:46:50 INFO common.Storage: Imagefile of size 94 saved in 0 seconds.
12/02/06 00:46:50 INFO common.Storage: Storagedirectory /opt/hadoop/hadoopfs/name2 has been successfully formatted.
12/02/06 00:46:50 INFO namenode.NameNode:SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode atv-jiwan-ubuntu-0/127.0.0.1
************************************************************/
cd /home/hadoop/hadoop
bin/start-all.sh
如果看到以下信息,则正常启动:
starting namenode, logging to /home/hadoop/hadoop/libexec/../logs/hadoop-hadoop-namenode-cloud.out
192.168.3.3: starting datanode, logging to /home/hadoop/hadoop/libexec/../logs/hadoop-hadoop-datanode-compute.out
192.168.3.2: starting datanode, logging to /home/hadoop/hadoop/libexec/../logs/hadoop-hadoop-datanode-Network.out
192.168.3.1: starting secondarynamenode, logging to /home/hadoop/hadoop/libexec/../logs/hadoop-hadoop-secondarynamenode-cloud.out
starting jobtracker, logging to /home/hadoop/hadoop/libexec/../logs/hadoop-hadoop-jobtracker-cloud.out
192.168.3.2: starting tasktracker, logging to /home/hadoop/hadoop/libexec/../logs/hadoop-hadoop-tasktracker-Network.out
192.168.3.3: starting tasktracker, logging to /home/hadoop/hadoop/libexec/../logs/hadoop-hadoop-tasktracker-compute.out
如果有问题,可以在以上提供的.log文件中查找问题所在。
使用 java的jps命令,可以在master机器上看到:
16032 NameNode
16325 SecondaryNameNode
16415 JobTracker
好了,就这么愉快的结束了。