手把手教你搭建:基于vmware和ubuntu的Hadoop分布式架构
手把手教你搭建:基于vmware和ubuntu的Hadoop分布式架构
1.实验概述
本实验是以vmware station为平台,搭建基于ubantu 16.04版本的hadoop架构。hadoop包括单机模式、伪分布式模式和完全分布式模式,其中单机模式不配置hadoop目录下的各xml文件参数,可以单机运行mapreduce,伪分布式需要简单配置xml文件参数,可以建立主机内部的连接,但不是真正的分布式模式,完全分布式是真正的分布式模式,可以实现不同主机之间的联通。
本实验我们做了以下几项工作:一是在单机模式下,调用了hadoop自带的mapreduce功能wordcount,并成功得到了正确的数据。二是配置在vmware station中安装了两个ubuntu系统,分别作为主机和从机,搭建了完全分布式模式,并实现了联通。三是在集群模式下实现了wordcount的分布式计算。
2.实验步骤
2.1.Hadoop的安装和配置
2.1.1.软件安装
下载jdk和hadoop的安装包,建立目录/usr/local/softwares,将两个安装包复制/移动到该目录下,调用tar -xvzf命令安装软件。
2.1.2.环境配置
在/etc/environment中配置环境变量,调用source命令使之生效。调用export -p命令查看环境变量配置是否成功
检查hadoop版本,确定hadoop已经成功安装。
2.1.3.安装并配置ssh
调用sudo apt-get install ssh命令安装ssh,然后进行免密配置。在伪分布模式下输入如下命令:
ssh-****** -t rsa //遇到的输入均回车过去即可
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
在完全分布式模式下,需要在输入上述命令①后,将主机与各个从机~/.ssh目录下的id_rsa.pub文件(公钥)进行交换(仅主机与从机之间交换,从机之间不需要交换),再执行命令②,以实现主机和从机之间的免密访问。这里我们介绍单机和伪分布式的免密配置,完全分布式配置方法将在第三节hadoop完全分布式集群搭建中详述。
2.1.4.启动hadoop
调用start-all.sh命令,单机模式下启动hadoop。
2.2.单机模式下调用wordcount函数
Hadoop安装成功之后,在其/share/hadoop/mapreduce目录下,有个hadoop-mapreduce-examples-版本号.jar文件,其中包含了已经调试好的wordcount函数,本实验直接调用该函数。
2.2.1.创建测试文档
在HADOOP_HOME目录下创建一个data文件夹,在该文件夹中创建一个testinput.txt文档作为测试文档,本实验内容为“Hello, this is a text file.”。
2.2.2.调用wordcount
①调用hadoop fs -ls / 命令(注意有“/”),查看该目录下的文件夹,②调用hadoop fs -mkdir /input命令,在该目录下中创建input文件夹,③调用hadoop fs -put /hadoop安装目录/data/testinput.txt /input命令,将testiput.txt文档移动至input目录中,④在确保hdfs目录下没有output文件夹的情况下(如果有则删除),执行命令:
hadoop jar /usr/local/softwares/hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /input /output
得到运行结果如下。
2.3.Hadoop完全分布式集群搭建
我们在vmware中安装了两台ubuntu,其中一台作为主机,命名为master,一台作为从机slave,实验目标是实现从机与主机的联通。以下步骤主机从机都要进行:
2.3.1.基本配置
依据hadoop和jdk的安装和环境变量配置步骤,配置好从机slave的环境。安装ssh,并设置好免密模式。接下来我们以主机master为例,分步讲解如何实现主从机的免密访问。
(1)查看~/.ssh目录,在执行(二)3中的命令后,该目录下默认包含authorized_keys, id_rsa(私钥), id_rsa.pub(公钥), known_hosts四个文件。
(2)调用cp id_rsa.pub id_rsa_master.pub命令,将id_rsa.pub复制为id_rsa_master.pub。
(3)将id_rsa_master.pub拷贝给从机slave,存放在~/.ssh目录下。我们利用vmware虚拟机与windows可以直接拖拽传送文件的便利,将id_rsa_master.pub拷贝到了从机中。(4)在从机中调用cat ~/.ssh/id_rsa_master.pub >> ~/.ssh/authorized_keys命令,将主机master的公钥添加到authorized_keys中,这样从机slave就可以免密访问主机host了,这可以在修改完主机名后,输入ssh master来检验。
2.3.2.修改hostname
这一步骤是将主机名修改为master,将从机名修改为slave。方法是利用gedit修改/etc/hostname文件,ubuntu系统默认的hostname是ubuntu,分别改为master和slave即可。
2.3.3.修改虚拟机IP地址
(1)查看本机IP地址
调用ifconfig -a命令查看。本实验中,master IP: 192.168.199.130,slave IP: 192.168.199.131。
(2)修改hosts文件
将该文件中的127.0.1.1 ubuntu替换为如下内容。
2.3.4.配置相关文件
对于HADOOP_HOME/etc/hadoop目录下的相关文件,我们需要在文件中的和语句之间插入一些参数并赋值。
(1)core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/softwares/hadoop-2.9.2/hdfs/tmp</value>
</property>
(2)hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/softwares/hadoop-2.9.2/hdfs/name</value>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/softwares/hadoop-2.9.2/hdfs/data</value>
<final>true</final>
</property>
(3)mapred-site.xml
①默认是没有mapred-site.xml文件的,这就需要我们将该目录下的mapred-site.xml.template文件复制为mapred-site.xml。②配置mapred-site.xml的默认参数
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
(4)yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8040</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8025</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8141</value>
</property>
(5)仅在主机master中配置etc/hadoop/slaves
2.3.5.运行hadoop
以上文件在master和slave中配置完成后,在terminal中输入start-all.sh(注意在调用前可能需要source /etc/environment),用浏览器可以成功登录http://master:50070。
①在master中登录http://master:50070。本实验中的虚拟机“Ubuntu 64位”即为master。②在slave中登录http://master:50070。本实验中的虚拟机“Ubuntu2”即为slave。
③查看master:8088端口
查看ResourceManager端口,查看活跃节点个数如下图,可见slave节点处于RUNNING状态,时间是2018年12月2日。(该端口号是在yarn-site.xml文件中配置的)。
2.4.集群模式下的wordcount实践
下面我们在集群模式下运行mapreduce wordcount函数。
2.4.1.建立集群
在master和slave中运行hadoop,建立集群。
2.4.2.创建测试文档
在master的HADOOP_HOME路径下,创建data文件夹,并在data目录下创建两个测试文档testfile1.txt和testfile2.txt。
2.4.3.创建集群输入文件夹
①hadoop fs -ls /,查看集群中包含哪些文件和文件夹。
②hadoop fs -mkdir /hdfsinput,创建集群输入文件夹。
这里我们首先对master和slave的集群文件夹都进行了查看,结果显示两个系统中,hadoop fs均为空。然后我们在master下创建了集群输入文件夹,并在slave中查看是否存在hdfsinput文件夹,结果表明在master中创建的集群文件夹,在slave中也能读取成功。
下图表明,最初在master中,hadoop fs路径下没有文件夹,然后我们创建了hdfsinput。下图表明,最初在slave中,hadoop fs路径下没有文件夹,在master中创建hdfsinput之后,slave也能看到该文件夹。
2.4.4.移动测试文档
将两个测试文档放入hdfsinput文件夹中。
hadoop fs -put /usr/local/softwares/hadoop-2.9.2/data/testfile1.txt /hdfsinput
hadoop fs -put /usr/local/softwares/hadoop-2.9.2/data/testfile2.txt /hdfsinput
2.4.5.调用wordcount函数。
hadoop jar /usr/local/softwares/hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /hdfsinput /hdfsoutput
运行过程如图
2.4.6.查看运行结果。
在master中查看hdfsoutput文件夹下的文件,包括_SUCCESS和part-r-00000。在master中查看part-r-00000文件。
在slave中查看hdfsoutput文件夹下的文件,包括_SUCCESS和part-r-00000。并查看part-r-00000文件,结果与master中所看到的相同。
3.实验总结
搭建单机模式下的hadoop系统是比较容易的,只要将jdk和hadoop的环境变量配置好即可运行,需要注意的是,每次重新打开都需要source /etc/environment,才能够运行hadoop。如果想要减少这一步操作,可以在在/etc/.bashrc文件中加入source /etc/environment语句,这样在启动terminal时就可以自动配置好环境变量了。
搭建伪分布式模式的hadoop系统也并不困难,在单机模式的基础上将ssh的免密模式和将相应的xml文件参数配置好即可。与完全分布式在参数上的差别,以core_site.xml为例,仅在于hdfs://mip:9000的mip是localhost(伪分布式)还是我们更改过的hostname(完全分布式),配置完成后在浏览器中即可登录localhost:50070。
搭建完全分布式模式的hadoop系统相对复杂一些,主要是主机、从机之间ssh的免密登录配置,需要我们想办法将主机与各个从机的公钥相互交换,这也是我们在实验中最耗时间解决的问题,最开始我们以为各虚拟机能够免密ssh localhost,就可以免密ssh otherhost,但实际操作中是会提示需要输入密码的。后来查阅网上资料才明白,其实不同虚拟机(主机和从机)之间登录,需要公钥才能够实现免密登录,也就是互换id_rsa.pub。实验发现不重命名而是直接覆盖原文件,还是会影响登录,必须要在保留本地的id_rsa.pub基础上,将目标机的id_rsa.pub加入authorized_keys中,于是我们想到了更改互换的id_rsa.pub文件名,这样才实现了虚拟机之间ssh的免密登录。
最后,我们对比了配置之初和完全分布式模式下wordcount运行之后,master:50070中一些数据的变化。可以看到Blocks从0增加到6,Block pool used从28KB增加到284.73KB,说明slave与master之间确实联通并进行了分布式计算。