【版权声明】版权所有,请勿转载!
【相关文章推荐】《大数据软件安装和基础编程实践指南》,详细指导VirtualBox、Ubuntu、Hadoop、HDFS、HBase、Hive、MapReduce、Spark、Flink的安装和基础编程
作者:厦门大学计算机系2025级硕士研究生郑楷阳
指导老师:厦门大学计算机系林子雨副教授
分布式模式配置
当Hadoop采用分布式模式部署和运行时,存储采用分布式文件系统HDFS,而且HDFS的名称节点和数据节点位于不同机器上。这时,数据就可以分布到多个节点上,不同数据节点上的数据计算并行执行,MapReduce分布式计算能力才能真正发挥作用。
这里使用3个节点(两台物理机器)来搭建集群环境,主机名分别为hadoop01、hadoop02和hadoop03。3个节点上的Hadoop组件分布如表所示。
| hadoop01 | hadoop02 | hadoop03 | |
|---|---|---|---|
| HDFS | NameNode DataNode |
DataNode | DataNode SecondaryNameNode |
| YARN | ResourceManager NodeManager |
NodeManager | NodeManager |
1. 安装虚拟机
请参照教程“在VMWare中安装Linux虚拟机”准备虚拟机。如果已经安装好hadoop01,可以按照相同的方法安装hadoop02和hadoop03。安装时,单击桌面上的“Install Ubuntu Kylin”图标,在“应用程序和更新”页面选择“Ubuntu Kylin Desktop(minimized)”,安装轻量桌面系统。
安装好虚拟机后,参照Hadoop 3.5.0单机/伪分布式安装教程,首先创建hadoop用户,然后使用hadoop用户登录Linux操作系统,安装SSH服务器端并配置Java环境。
为了节省时间,也可以先完成hadoop02的安装和上述环境配置,再通过克隆生成hadoop03。克隆时选择“Create a full clone”,并设置新虚拟机的名称和保存位置。需要注意,VMware中的虚拟机名称与Ubuntu内部的主机名需要分别设置。
由于hadoop02和hadoop03是从节点,不需要安装很多的软件,因此配置可以比hadoop01低一些。例如,每台从节点的内存可以配置为4GB,磁盘可以配置为20GB。
2. 网络配置
在Ubuntu中,在hadoop01节点上执行以下命令修改主机名。
$ sudo vim /etc/hostname
执行上面命令后,就打开了“/etc/hostname”这个文件,这个文件里面记录了主机名。打开这个文件以后,里面就只有“ubuntu”这一行内容,直接删除,并修改为“hadoop01”(注意是区分大小写的),然后保存并退出Vim编辑器,这样就完成了主机名的修改。此时需要重启Linux操作系统,才能看到主机名的变化。
要注意观察主机名修改前后的变化。在修改主机名之前,如果用hadoop用户身份登录Linux操作系统,打开终端,进入Shell命令提示符状态,会显示以下内容。
hadoop@ ubuntu:~$
修改主机名并重启Linux操作系统之后,用hadoop用户身份登录Linux操作系统,打开终端,进入Shell命令提示符状态,会显示以下内容。
hadoop@ hadoop01:~$
同理,请按照相同的方法,把虚拟机hadoop02和hadoop03中的主机名分别修改为“hadoop02”和“hadoop03”,并重启Linux操作系统。
然后使用ifconfig命令获取每台虚拟机的IP地址,具体命令如下。
$ ifconfig
下图给出了ifconfig命令的执行结果。从中可以看到,hadoop01的IP地址是192.168.175.128(你的机器IP地址可能与这个不同)。同理,可以查询到hadoop02的IP地址是192.168.175.132,hadoop03的IP地址是192.168.175.133。

需要注意的是,每台机器的IP地址建议设置为固定IP地址,不要使用动态分配IP地址,否则,每次重启系统以后有可能IP地址会动态变化,导致后面搭建的集群无法连接。下面介绍把机器的IP地址设置为固定IP地址的方法。
在Ubuntu操作系统中新建一个终端,执行以下命令查询网关地址。
$ netstat -nr
查询结果如图所示。从该图中可以看到,网关地址是192.168.175.2。

单击Ubuntu操作系统界面右下角的“网络”图标(如图所示),在弹出的菜单中点击“齿轮”图标。

在出现的界面中,先选中当前网络,再点击左下角的“齿轮”图标进入当前网络设置,如图所示。

在出现的界面中,单击“IPv4设置”按钮,在“方法”下拉列表中选择“手动”,然后把“地址”设置为“192.168.175.128”,把“子网掩码”设置为“255.255.255.0”,把“网关”设置为“192.168.175.2”,把“DNS服务器”设置为“114.114.114.114”,单击界面底部的“保存”按钮,如图所示。然后重新启动Ubuntu操作系统,IP地址就生效了。注意,系统重启以后,一定要使用ifconfig命令检查IP地址是否已经设置成功,同时,也要在Ubuntu中打开一个浏览器,测试一下是否可以正常访问网络(如访问百度网站)。

然后在hadoop01中,执行以下命令打开并修改“/etc/hosts”文件。
$ sudo vim /etc/hosts
在hosts文件中增加以下3条IP地址和主机名映射关系。
192.168.175.128 hadoop01
192.168.175.132 hadoop02
192.168.175.133 hadoop03
修改后的结果如图所示。

需要注意的是,一般hosts文件中只能有一个127.0.0.1映射,其对应主机名为localhost。如果有多余127.0.0.1映射,应删除,特别是不能存在“127.0.0.1 hadoop01”这样的映射记录。修改后需要重启Linux操作系统。
上面完成了hadoop01的配置,接下来要继续完成对其他节点的配置与修改。请参照上面的方法,分别到hadoop02和hadoop03中,在hosts文件中增加以下3条IP地址和主机名映射关系。
192.168.175.128 hadoop01
192.168.175.132 hadoop02
192.168.175.133 hadoop03
修改完成以后,请重新启动Linux操作系统。
需要在各个节点上都执行以下命令,测试是否相互ping得通。如果ping不通,后面就无法顺利配置成功。
$ ping hadoop01 -c 3 #只ping 3次就会停止,否则要按“Ctrl+C”组合键中断ping命令
$ ping hadoop02 -c 3
$ ping hadoop03 -c 3
例如,在hadoop01节点上执行ping命令。如果ping通,会显示如下图所示的结果。

3. SSH无密码登录节点
必须让hadoop01节点可以以SSH无密码登录到各个节点上(包括hadoop01可以以SSH无密码登录自己)。
首先需要再次确认3个节点上已经安装了SSH服务器端。如果之前没有安装,需要执行如下命令安装SSH服务器端。
$ sudo apt-get install openssh-server
然后检查hadoop01节点是否已经生成SSH密钥对。如果此前已经生成,可以继续使用;如果尚未生成,则执行以下步骤生成密钥对。
$ cd ~/.ssh #如果没有该目录,先执行一次ssh localhost
$ ssh-keygen -t rsa #执行该命令后,遇到提示信息,一直按“Enter”键即可
为了让hadoop01节点能够SSH无密码登录本机,需要在hadoop01节点上执行以下命令。
$ cat ./id_rsa.pub >> ./authorized_keys
完成后可以执行命令“ssh hadoop01”来验证一下,该过程中可能会遇到提示信息,只要输入“yes”即可。测试成功后,请执行“exit”命令返回原来的终端。
接下来,在hadoop01节点上将公匙传输到hadoop02和hadoop03节点上。
$ scp ~/.ssh/id_rsa.pub hadoop@hadoop02:/home/hadoop/
$ scp ~/.ssh/id_rsa.pub hadoop@hadoop03:/home/hadoop/
上面的命令中,scp(secure copy)用于在 Linux下进行远程复制文件,类似于cp命令。不过,cp只能在本机中复制。执行scp命令时会要求输入hadoop02和hadoop03节点上hadoop用户的密码,输入完成后会提示传输完毕,如图所示。传输完成以后,在hadoop02和hadoop03节点上的“/home/hadoop”目录下就可以看到文件id_rsa.pub了。

接着在节点hadoop02和hadoop03上分别执行以下命令将SSH公钥加入授权。
$ mkdir ~/.ssh #如果不存在该文件夹就需要先创建,若已存在,则忽略本命令
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ rm ~/id_rsa.pub #用完以后就可以删掉
这样,在hadoop01节点上就可以以SSH无密码登录到各个节点了(包括hadoop01、hadoop02和hadoop03)。在hadoop01节点上执行以下命令进行检验。
$ ssh hadoop02
$ ssh hadoop03
执行结果如图所示。

4. 下载安装文件
如果hadoop01节点上已经安装过Hadoop(如之前安装过伪分布式的Hadoop),则需要首先删除已经安装的Hadoop。
在hadoop01节点上下载Hadoop安装文件,并执行以下命令。
$ sudo tar -zxvf ~/Downloads/hadoop-3.5.0.tar.gz -C /usr/local #解压缩到/usr/local中
$ cd /usr/local/
$ sudo mv ./hadoop-3.5.0/ ./hadoop #将文件夹名改为hadoop
$ sudo chown -R hadoop:hadoop ./hadoop #修改文件权限
5. 配置PATH环境变量
在前面的伪分布式安装内容中,已经介绍过PATH环境变量的配置方法。按照同样的方法进行配置,这样就可以在任意目录中直接使用hadoop、hdfs等命令了。如果还没有配置PATH环境变量,那么需要在hadoop01节点上进行配置。首先执行命令“vim ~/.bashrc”,也就是使用Vim编辑器打开“~/.bashrc”文件,然后在该文件最上面的位置加入下面一行内容。
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
保存后执行命令“source ~/.bashrc”,使配置生效。
6. 配置集群/分布式环境
在配置集群/分布式模式时,需要修改“/usr/local/hadoop/etc/hadoop”目录下的配置文件,这里仅设置正常启动所必需的设置项,包括workers、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml共5个文件,更多设置项可查看官方说明。
(1)修改文件workers
执行以下命令打开wokers文件
$ cd /usr/local/hadoop/etc/hadoop
$ vim workers
需要把所有数据节点的主机名写入该文件,每行一个。把hadoop01节点中的workers文件中原来的localhost删除,添加以下3行内容。
hadoop01
hadoop02
hadoop03
(2)修改文件core-site.xml
执行以下命令打开core-site.xml文件
$ cd /usr/local/hadoop/etc/hadoop
$ vim core-site.xml
把hadoop01节点中的core-site.xml文件修改为以下内容。
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
各个配置项的含义可以参考前面伪分布式模式中的介绍,这里不再赘述。
(3)修改文件hdfs-site.xml
执行以下命令打开hdfs-site.xml文件
$ cd /usr/local/hadoop/etc/hadoop
$ vim hdfs-site.xml
对Hadoop的分布式文件系统HDFS而言,一般采用冗余存储,冗余因子通常为3,也就是说,一份数据保存3份副本,所以dfs.replication的值设置为3。把hadoop01节点中的hdfs-site.xml设置为以下内容。
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop03:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
(4)修改文件mapred-site.xml
hadoop01节点中的“/usr/local/hadoop/etc/hadoop”目录下有一个mapred-site.xml,把mapred-site.xml文件配置成以下内容。
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
</configuration>
(5)修改文件yarn-site.xml
把hadoop01节点中的yarn-site.xml文件配置成以下内容。
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
上述5个文件全部配置完成以后,需要把hadoop01节点上的“/usr/local/hadoop”文件夹复制到各个节点上。如果之前已经运行过伪分布式模式,建议在切换到集群模式之前,首先删除在伪分布式模式下生成的临时文件。具体来说,需要首先在hadoop01节点上执行以下命令。
$ cd /usr/local/hadoop
$ sudo rm -r ./tmp #删除Hadoop临时文件
$ sudo rm -r ./logs/* #删除日志文件
$ cd /usr/local
$ tar -zcf ~/hadoop.master.tar.gz ./hadoop #先压缩再复制
$ cd ~
$ scp ./hadoop.master.tar.gz hadoop02:/home/hadoop
$ scp ./hadoop.master.tar.gz hadoop03:/home/hadoop
然后在hadoop02和hadoop03节点上分别执行以下命令。
$ cd ~
$ sudo rm -r /usr/local/hadoop #删掉旧的(如果存在)
$ sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
$ sudo chown -R hadoop /usr/local/hadoop
首次启动Hadoop集群时,需要先在hadoop01节点上进行名称节点的格式化(只需要进行这一次,后面再启动Hadoop时,不要再次格式化名称节点),执行以下命令。
$ cd /usr/local/hadoop
$ ./bin/hdfs namenode -format
现在就可以启动Hadoop了。启动需要在hadoop01节点上进行,执行以下命令。
$ cd /usr/local/hadoop
$ ./sbin/start-dfs.sh
$ ./sbin/start-yarn.sh
$ ./bin/mapred --daemon start historyserver
通过命令jps可以查看各个节点所启动的进程。如果已经正确启动,则在hadoop01节点上可以看到NameNode、NodeManager、DataNode、JobHistoryServer和ResourceManager进程,如图所示。

在hadoop02节点上可以看到DataNode和NodeManager进程,如图所示。

在hadoop03节点上可以看到DataNode、SecondaryNameNode和NodeManager进程,如图所示。

缺少任一进程都表示出错。另外,还需要在hadoop01节点上通过以下命令查看数据节点是否正常启动。
$ cd /usr/local/hadoop
$ ./bin/hdfs dfsadmin -report
如果屏幕信息中的“Live datanodes”为 3 ,则说明集群启动成功,如图所示。

当然,也可以在任意一个节点的Linux操作系统的浏览器中输入地址“http://hadoop01:9870/”,通过Web界面查看名称节点和数据节点的状态(如图所示)。如果不成功,则可以通过启动日志排查原因。

7. 执行分布式模式实例
执行分布式模式实例过程与执行伪分布式模式实例过程一样,首先创建HDFS上的用户目录,在hadoop01节点上执行以下命令。
$ hdfs dfs -mkdir -p /user/hadoop #此前已经配置了PATH环境变量,所以不用路径全称
然后在HDFS中创建一个input目录,并把“/usr/local/hadoop/etc/hadoop”目录中的配置文件作为输入文件复制到input目录中,命令如下。
$ hdfs dfs -mkdir input
$ hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input
接着就可以运行MapReduce作业了,命令如下。
$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar grep input output 'dfs[a-z.]+'
运行时的输出信息与伪分布式模式的类似,会显示MapReduce作业的进度,如图所示。

执行过程可能会有点慢,但是,如果迟迟没有进度,如5min都没看到进度变化,那么不妨重启Hadoop再次测试。若重启还不行,则很有可能是由内存不足引起的,建议增大虚拟机的内存,或者通过更改YARN的内存配置来解决。
在执行过程中,可以在Linux操作系统中打开浏览器,在地址栏中输入"http://hadoop01:9870/",通过Web界面查看任务进度。只需在Web界面中单击“Tracking UI”这一列的“ApplicationMaster”链接(如图所示),就可以看到作业的执行情况,如图所示。


MapReduce作业执行完后的输出结果如图所示。

最后,关闭Hadoop集群,需要在hadoop01节点上执行以下命令。
$ stop-yarn.sh
$ stop-dfs.sh
$ mapred --daemon stop historyserver
至此,我们就顺利完成了Hadoop集群搭建。
