
1.4.4 Hadoop分布式模式的配置
考虑到机器的性能,本书简单使用两个虚拟机来搭建分布式集群环境:一个虚拟机作为Master节点,另一个虚拟机作为Slave1节点。由3个及以上节点构建分布式集群,也可以采用类似的方法完成安装部署。
Hadoop集群的安装配置大致包括以下步骤。
(1)在Master节点上创建hadoop用户、安装SSH、安装Java环境。
(2)在Master节点上安装Hadoop,并完成配置。
(3)在Slave1节点上创建hadoop用户、安装SSH、安装Java环境。
(4)将Master节点上的/usr/local/hadoop目录复制到Slave1节点上。
(5)在Master节点上启动Hadoop。
根据前面讲述的内容完成步骤(1)到步骤(3),然后继续下面的操作。
1.网络配置
由于搭建本分布式集群在两个虚拟机上进行,需要将两个虚拟机的网络连接方式都改为“桥接网卡”模式,如图1-27所示,以实现两个节点的互连。一定要确保各个节点的MAC地址不能相同,否则会出现IP地址冲突。

图1-27 设置网络连接方式
设置网络连接方式以后,通过ifconfig命令查看两个虚拟机的IP地址,本书所用的Master节点的IP地址为192.168.0.115,Slave1节点的IP地址为192.168.0.114。
在Master节点上执行如下命令可修改Master节点中的/etc/hosts文件:

在hosts文件中增加如下两条IP地址和主机名的映射关系,即集群中两个节点与对应IP地址的映射关系:

需要注意的是,hosts文件中只能有一个127.0.0.1映射关系,其对应的主机名为localhost,如果有多个127.0.0.1映射关系,则应删除。hosts文件修改完成后,需要重启Master节点的Linux系统。
参照Master节点的配置方法,修改Slave1节点中的/etc/hosts文件,在hosts文件中增加如下两条IP地址和主机名的映射关系:

hosts文件修改完成后,同样需要重启Slave1节点的Linux系统。
这样就完成了Master节点和Slave节点的配置,然后需要在两个节点上测试它们是否相互ping得通,如果ping不通,后面就无法顺利配置成功。

在Master节点上ping 3次Slave1节点,如果ping得通的话,会显示下述信息:

2.SSH免密码登录Slave1节点
下面要让Master节点可以SSH免密码登录Slave1节点。首先,生成Master节点的公钥,具体命令如下:

Master节点生成公钥的界面如图1-28所示。

图1-28 Master节点生成公钥的界面
为了让Master节点能够SSH免密码登录本机,需要在Master节点上执行如下命令:

执行上述命令后,可以执行命令ssh Master验证Master节点能否SSH免密码登录本机,遇到提示信息,输入yes即可,测试成功的界面如图1-29所示,执行exit命令返回原来的终端。

图1-29 测试成功的界面
接下来在Master节点上将上述生成的公钥传输到Slave1节点:

上述命令中,scp是secure copy的缩写,用于在Linux上远程复制文件。执行scp时会要求输入Slave1节点上hadoop用户的密码,输入完成后会提示传输完毕,执行过程如下所示:

接着在Slave1节点上将SSH公钥加入授权:

执行上述命令后,在Master节点上就可以SSH免密码登录到Slave1节点了,可在Master节点上执行如下命令进行验证:

执行ssh Slave1命令的效果如图1-30所示。
3.配置PATH变量
在Master节点上配置PATH变量,以便在任意目录中可直接使用hadoop、hdfs等命令。执行vim~/.bashrc命令,打开~/.bashrc文件,在该文件最上面加入如下一行内容:


图1-30 执行ssh Slave1命令的效果
保存后执行命令source~/.bashrc使配置生效。
4.配置分布式环境
配置分布式环境时,需要修改/usr/local/hadoop/etc/hadoop目录下的5个配置文件,具体包括slaves、core-site.xml、hdfs-site.xml、mapred-site.xml和yarn-site.xml。
(1)修改slaves文件。需要把所有DataNode的主机名写入该文件,每行一个,默认为localhost(即把本机作为DataNode)。所以,在进行伪分布式模式配置时,就采用了这种默认配置,使得节点既作为NameNode又作为DataNode。在进行分布式模式配置时,可以保留localhost,让Master节点既充当NameNode又充当DataNode,或者删除localhost这一行,让Master节点仅作为NameNode使用。执行vim/usr/local/hadoop/etc/hadoop/slaves命令,打开/usr/local/hadoop/etc/hadoop/slaves文件,由于只有一个Slave节点Slave1,本书让Master节点既充当NameNode又充当DataNode,因此,在文件中添加如下两行内容:

(2)修改core-site.xml文件。core-site.xml文件用来配置Hadoop集群的通用属性,包括指定NameNode的地址和指定Hadoop临时文件的存放路径等。把core-site.xml文件修改为如下内容:

(3)修改hdfs-site.xml文件。hdfs-site.xml文件用来配置HDFS的属性,包括指定HDFS保存数据的副本数量、指定HDFS中NameNode的存储位置、指定HDFS中DataNode的存储位置等。本书让Master节点既充当NameNode又充当DataNode,此外还有一个Slave节点Slave1,即集群中有两个DataNode,所以将dfs.replication的值设置为2。hdfs-site.xml的具体内容如下:

(4)修改mapred-site.xml文件。/usr/local/hadoop/etc/hadoop目录下有一个mapred-site.xml.template文件,需要将该文件重命名为mapred-site.xml:

把mapred-site.xml文件配置成如下内容:

(5)修改yarn-site.xml文件。YARN是MapReduce的调度框架。yarn-site.xml文件用于配置YARN的属性,包括指定NodeManager获取数据的方式、指定ResourceManager的地址。把yarn-site.xml文件配置成如下内容:

上述5个文件配置完成后,需要把Master节点上的/usr/local/hadoop文件夹复制到各个节点上。如果之前运行过伪分布式模式,建议在切换到分布式模式之前先删除在伪分布式模式下生成的临时文件。具体来说,在Master节点上实现上述要求需执行的命令如下:

然后在Slave1节点上执行如下命令:

Hadoop集群包含两个基本模块:分布式文件系统HDFS和分布式计算框架MapReduce。首次启动Hadoop集群时,需要先在Master节点上格式化HDFS,命令如下:

HDFS格式化成功后,就可以输入启动命令来启动Hadoop集群了。Hadoop采用主从架构,启动时由主节点带动从节点,所以启动集群的操作需要在Master节点上完成。在Master节点上启动Hadoop集群的命令如下:

Hadoop自带了一个历史服务器,可以通过历史服务器查看已经运行完的MapReduce作业记录,了解用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息。默认情况下,Hadoop历史服务器是没有启动的。
jps命令用于查看各个节点启动的进程。如果在Master节点上可以看到DataNode、NameNode、ResourceManager、SecondaryNameNode、JobHistoryServer和NodeManager等进程,就表示主节点进程启动成功,如下所示:

在Slave1节点的终端执行jps命令,如果在输出结果中可以看到DataNode和NodeManager等进程,就表示从节点进程启动成功,如下所示:

关闭Hadoop集群,需要在Master节点执行如下命令:

此外,还可以启动全部Hadoop集群或者停止全部Hadoop集群。
启动命令:

停止命令:

5.执行分布式实例
执行分布式实例的过程与执行伪分布式实例的过程一样,首先创建HDFS中的用户目录,命令如下:

然后在HDFS中创建一个input目录,并把/usr/local/hadoop/etc/hadoop目录中的配置文件作为输入文件复制到input目录中,命令如下:

接下来,就可以运行MapReduce作业了,命令如下:

执行完毕后的输出结果如下所示:

6.运行计算圆周率π的实例
在数学领域,计算圆周率π的方法有很多种,在Hadoop自带的examples中就给出了一种利用分布式系统计算圆周率π的方法。下面通过运行程序来检查Hadoop集群是否安装配置成功,命令如下:

Hadoop的命令类似Java命令,通过jar指定要运行的程序所在的JAR包hadoop-mapreduce-examples-*.jar。参数pi表示运行计算圆周率的程序。再看后面的两个参数:第一个参数“10”指的是要运行10次Map任务,第二个参数“100”指的是每个Map任务的运行次数。执行结果如下所示:

如果以上的验证都没有问题,说明Hadoop集群配置成功。