我的Hadoop之路——VMWare8+Ubuntu12.04+Hadoop1.2.1集群搭建


前言:Hadoop是一个当下非常火热的话题,在这里,我会根据网上的教程,实际体验一下从虚拟机部署一直到Hadoop使用的整个过程,部署一主二从三台机器,并在这篇文章中记录下我的一些经验与心得,当然,还有踩进的坑。

首先,正如标题中看到的,我使用了VMWare8的虚拟机环境,分别部署了三台Ubuntu12.04系统的虚拟机,最开始时,由于Ubuntu图形界面的关系,每台虚拟机分配了512M内存,但是由于本机内存太小只有2G,所以无法做到三台虚拟机同时运行,不过在我们的环境搭建阶段,还用不到三台机器同时跑起来的情况,所以暂时无压力。至于硬盘的话,可以是动态分配大小,只要选一个上限就可以了,我分别都选择了20G,不知道是否够用。我们可以把这三台机器分别命名为Hadoop-Node1,Hadoop-Node2,Hadoop-Node3。

这里附上Ubuntu中关闭图形界面的方法:主要的方法是修改grub的配置文件。操作如下:sudo vi /etc/default/grub ,将GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"的内容替换为GRUB_CMDLINE_LINUX_DEFAULT="text",然后保存退出,sudo update-grub,然后重启系统即可。

Tips:感觉Ubuntu的安装还是很麻烦的,要自动下载语言包等等,十分漫长,其实大家可以在配置好第一台虚拟机后,直接把第一台虚拟机的文件复制两份,然后用VMWare打开,重命名一下,就可以作为我们的第二第三台虚拟机了。但是,这样的话,三台机器在Ubuntu系统内的用户名称都会是node1,我们可以使用username -l node2/3 node1的指令来替换用户名。

Part2 系统环境搭建


具体操作为:sudo gedit /etc/hostname ,文本中原本的内容是Ubuntu,也就是Ubuntu默认的机器名,我们可以在这里把Ubuntu替换成自己想要的名字,在这里,我们用的就是node1,node2,node3。


具体操作为:sudo gedit /etc/hosts ,需要在添加三台机器的ip地址和他们的名字(ip地址在Ubuntu可以通过ifconfig指令查到,此外,VMWare的一大福利就是,我们的虚拟机之前不需要进行任何额外配置就可以相互ping通),我们可以把这个理解为一个机器名与ip地址的配对,在我的机器中的配置如下:

{a}

我们可以在三台虚拟机上分别使用sudo addgroup hadoop指令,在系统内添加一个名叫hadoop的用户组,然后sudo adduser -ingroup hadoop hadoop添加用户,用户的密码也可以设置为hadoop。然后,需要为我们的hadoop用户添加权限,sudo gedit /etc/sudoers,

{d}


我是在Oracle官网上下载的jdk-6u30-linux-i586.bin,如果是其他的系统,请自行选择JDK下载。另外,也可以把Hadoop也一起下载好,开源项目镜像很多,我下载的版本是hadoop-1.2.1.tar.gz。

然后,我们可以把JDK(以及Hadoop)从主机中复制到虚拟机的Downloads文件夹,复制方法是:用鼠标把文件从主机拖到虚拟机的文件夹里即可,复制过程中可能会有出错提示,点击retry即可,可能是因为我的虚拟机的硬盘大小是动态分配的。这里要说的是,大家在完成文件拷贝以后,要记得检查一下文件的大小或者是md5,我第一次复制过去的JDK是个空文件,打开后什么都没,那时候我检查了好久才发现原来是文件内容其实没有复制过来,大家可以通过ll -a指令查看文件大小。

接下来,我们要在/usr/local文件夹中创建一个叫java的目录,具体操作:sudo mkdir java,然后cp jdk-6u30-linux-i586.bin /usr/local/java把JDK安装文件复制过去,在cd到java文件夹下,./jdk-6u30-linux-i586.bin打开即可,大概半分钟就可以装完了。

安装完成后,我们看到一个jdk1.6.0_30的文件夹,我们cd jdk1.6.0_30/bin,然后再输入,/java -version,就可以看到当前的jdk1.6.0_30的版本了。

最后,我们需要为我们的系统添加环境变量,输入指令sudo gedit /etc/profile,输入如下内容:

  1. # /etc/profile: system-wide .profile file for the Bourne shell (sh(1))  
  2. # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).  
  3. #set java environment  
  4.   
  5. export JAVA_HOME=/usr/local/java/jdk1.6.0_30  
  6.   
  7. export JRE_HOME=/usr/local/java/jdk1.6.0_30/jre  
  8.   
  9. export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH  
  10.   
  11. export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH  

修改完成后,我们输入指令source /etc/profile重新加载一下(重启也可),然后我们就可以通过java -version指令来查看JDK版本了。

{b}

引用一段网上的说明:在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个datanode上的各种守护进程的,这就须要在节点之间执行指令的时候是不须要输入密码的形式,故我们须要配置SSH运用无密码公钥认证的形式。所以,SSH需要配置成无密码登录的形式,这一步说难不难,但是又很容易出错,我也在这里来来回回的试了好多次终于才成功了。在我们的三台机器中,我们把node1看做master,node2和node3则作为slave,那么,node1就需要能够无密码得访问node2和node3。

首先,我们需要分别在三台机器上安装SSH,指令:sudo apt-get install ssh。然后,可以通过netstat -nat来查看0.0.0.0:22端口是否被打开了,也就是应该处于LISTENING的状态,也可以通过ssh localhost指令来登录本机,当然,现在的登录是需要输入本机的密码的,登录成功以后,记得exit退出哦。

接下来,就是无密码访问的配置了,在node1机器上,我们先要将用户切换成hadoop,可以用su hadoop的指令,再输入:ssh-keygen -t rsa ,然后一路按回车,在输入密码的地方按回车就表示我们设置密码为空了,这时,系统会在/home/hadoop路径下生产一个.ssh文件夹,为什么我们看不到呢,因为是隐藏的,要用ls -a就能看到了,cd进去后,我们可以看到两个文件:id_rsa和id_rsa.pub,也就是我们的公钥和私钥,在执行cp id_rsa.pub authorized_keys指令,把id_rsa.pub的内容复制进authorized_keys文件(自动新建的)中,这个文件就是无密码访问的关键所在了。ssh-keygen -t rsa指令操作:

{c}

现在,我们就可以在node1的系统中,输入ssh localhost或者ssh node1,此时,我们可以发现,不需要密码,我们就成功的访问了自己,但是,在访问node2和node3时,仍旧是需要密码的。

那么,我们就需要对node2和node3做一下配置。同样,将用户切换成hadoop,输入:ssh-keygen -t rsa ,然后一路按回车直到生成成功。这是,我们需要在node1中,把之前生成的authorized_keys文件复制到node2中来,在node1中输入scp authorized_keys hadoop@node2:/home/hadoop/.ssh回车,复制完成后,赋予其644权限(指令chmod 644 authorized_keys),在node2中,我们可以用ls指令查看到对应的文件,这个时候,再使用ssh node1,我们就可以成功的访问到node1而不需要输入密码了,对node3也做同样的操作。效果图:

{node1无密码访问node2}}

终于要开始进入正题了。还记得你的hadoop-1.2.1.tar.gz放在那里么,将它复制到/home/hadoop/路径下,解压sudo tar zxvf hadoop-1.2.1.tar.gz。到此,Hadoop的安装已经完成了,接下来就是略麻烦的配置过程。在这里,我们需要注意的就是,三台虚拟机上的Hadoop其实是一样的,配置也是相同的,我们只需要在node1上完成对hadoop的配置,然后将整个hadoop文件夹复制到node2和node3就可以了,这样做的前提条件是你对三台虚拟机的JAVA环境变量已经hadoop的路径等等配置都是相同的。

接下来是添加配置步骤:

a. 配置conf/hadoop-env.sh文件

可以使用vi编辑器或者nano编辑器,当然,gedit是最好的了!我们只需要把JAVAHOME的路径的注释去除掉,然后将路径填为我们JDK的路径即可。

b. 配置/conf/core-site.xml

内容如下:

<configuration>
<property>
 <name>fs.default.name</name>
  <value>hdfs://node1:49000</value>
</property>
<property>
  <name>hadoop.tmp.dir</name>
 <value>/home/hadoop/hadoop_home/var</value>
</property>
</configuration>

注意不要打错字噢!这是个大坑!

做完这步以后,我们可以测试一下单点运行了!

在我们的hadoop-1.2.1的文件路径下,输入如下代码:Bin/hadoop jar hadoop-1.2.1-examples.jar wordcount  conf/   /tmp/out
就可以运行我们Hadoop世界的HelloWorld了!

如果运行出现异常,请注意是否是权限有问题或者路径错误。

c. 配置/conf/mapred-site.xml

内容如下:

<configuration>
<property>
  <name>mapred.job.tracker</name>
  <value>node1:49001</value>
</property>
<property>
  <name>mapred.local.dir</name>
 <value>/home/hadoop/hadoop_home/var</value>
</property>
</configuration>

d. 配置/conf/hdfs-site.xml

内容如下:

<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/name1</value>
<description>  </description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/data1</value>
<description> </description>
</property>
<property>
  <name>dfs.replication</name>
  <value>2</value>
</property>
</configuration>

这里的name1和data1是hadoop的name和data的目录路径,请勿自行创建。

dfs.replication表示数据备份的数量,这里要注意不能超过集群的机器数,不然就无处备份了。

e. 配置主从关系

分别在conf/masters和conf/slaves中输入master和slave的名字。

于是我们应该在masters中输入node1,在slave中输入node2和node3,用回车分隔。

这样,我们所有的配置工作就都已经完成了,然后就可以通过scp -r /home/hadoop/hadoop-1.2.1 hadoop@node2:/home/hadoop来将我们的hadoop文件复制给node2和node3。要注意的是,复制完成后,我们需要通过ll -a检查一下文件的所有权,如果文件是属于root的,我们可以通过命令chown -R hadoop /hadoop-1.2.1来修改文件的持有者,如果不这样做的话,就会在启动结点的时候遇到无法创建文件的错误。

终于完成了hadoop的配置工作了,如果过程中没有出错的话,我们的hadoop已经可以正式使用了,在第一次使用时,我们需要先生成一个DFS,也就是分布式文件系统,方法为:在hadoop-1.2.1的路径下,bin/hadoop namenode -format,如果没有出现错误信息的话,那么,恭喜,你的分布式文件系统已经构建完成了,可以开始使用Hadoop了。下面,我将列出一次Hadoop的使用过程:

a. 输入bin/start-all.sh启动所有节点,这里如果遇到无法mkdir的问题,请看上文中的修改文件持有者的内容。

b. 输入bin/hadoop fs -mkdir input,在文件系统中新建input文件夹,以存放待计算的数据。

顺便,我们可以熟悉下hadoop里的一些文件操作:

bin/hadoop fs -ls可以查看文件系统下的文件;

bin/hadoop fs -ls input可以查看文件系统下input文件夹内的所有文件;

bin/hadoop fs -put xxx.xxx input可以把xxx.xxx文件放入input文件夹中;

其他的以后慢慢补充。

c. 输入bin/hadoop fs -put conf/hdfs-site.xml input,通过上文的文件操作,我们就可以看出来,这条指令是讲hdfs-site.xml文件复制进了input文件夹,作为我们处理的数据源。

d. 输入bin/hadoop jar hadoop-examples-1.2.1.jar grep input output 'dfs[a-z]',这就是我们hadoop的运行指令了,这里使用的是hadoop的自带示例,hadoop-examples-1.2.1.jar中就是我们的map/reduce代码,grep就是提供的数据处理方法,input表示数据源文件夹,output表示输出文件夹,在output文件夹中,我们可以找到_SUCCESS文件来表示执行成功,至于失败是什么,还没有失败过不知道呢。。。

Finally,我们可以通过两个网络接口来监控Hadoop的状态,由于虚拟机被调成了命令行模式,没有浏览器了,所以只要用主机进行访问。

NameNode : http://node1:50070/
JobTracker : http://node1:50030/

这里的node1需要替换成node1的具体IP哦,因为我们的主机是不认识虚拟机的名字的。



相关内容

    暂无相关文章