# 实验三 Hadoop 安装

# 一、实验目的

通过本次实验,希望学生能够达到以下目标:

1. 了解 Hadoop 的起源、发展和意义

2. 学会安装 Linux 系统和创建虚拟机

3. 学会 Hadoop 的三种运行模式安装

4. 掌握 MapReduce 的执行原理并学会应用

# 二、实验内容

本次实验主要包括以下几个方面的内容:

1.Linux 系统安装及配置

2.Hadoop 单例模式搭建

3.Hadoop 伪分布式模式搭建

4. 虚拟机克隆及相关网络配置

5. 集群时间同步

6.Hadoop 集群模式部署

7.MapReduce 案例应用

# 三、实验过程

# 1.Linux 系统安装及配置

# 1.1 创建一台虚拟机,主机名命名规则为姓名全拼 001

全新创建了一台虚拟机,将 hostname 命名为 001

image-20241018102914327

# 1.2 查看虚拟机网络

为虚拟机实例分配的仅主机网络,子网划分为 192.168.109.0/24

可以看到 IP 地址为 192.168.109.129

image-20241018104543006

# 1.3 本机 cmd 中 ping 192.168.109.129

image-20241018104743681

# 1.4 修改主机名

可以看到创建虚拟机的时候就已经让主机名符合实验要求了

image-20241018104807491

# 1.5 建立 IP 与虚拟机名称的映射

Windows 环境下,配置 ip 地址和主机之间的映射

需要在 C:\Windows\System32\drivers\etc 目录下修改 hosts 文件

image-20241018105242432

使用 VSCode 进行修改,添加条目 192.168.109.129 dengbohao001

image-20241018105427886

如果是 Linux 环境下

使用如下命令,配置 ip 地址和主机之间的映射

nano /etc/hosts

image-20241018105016526

# 1.6 本机终端如 cmd 中 ping 虚拟机主机名

可以看到已经成功完成了映射

image-20241018105537333

# 2.Hadoop 单例模型搭建

# 2.1 安装 Java 根据助教所发的文件,实验需要使用的 Java 版本为 jdk-8u161

为了实现文件传输,在宿主机搭建了一个 HTTP 服务器

VMNet 子网划分时,宿主机分配到了 192.168.109.1 的地址

image-20241018111711842

因此使用如下命令获取文件

cd /home
wget http://192.168.109.1/chfs/shared/jdk-8u161-linux-x64.tar.gz

image-20241018111830713

使用如下命令完成 Java 配置

cd /home
tar -zxvf jdk-8u161-linux-x64.tar.gz
mv jdk1.8.0_161 /usr/lib
echo "export JAVA_HOME=/usr/lib/jdk1.8.0_161" >> /etc/profile && \
echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> /etc/profile
source /etc/profile

可以看到 Java 已经配置完毕

image-20241018114000889

根据文档要求,写一个简单的 Java 程序进行 Javac 命令验证

mkdir /workspace
cd /workspace
touch HelloWorld.java
vi HelloWorld.java

HelloWorld.java 编写为如下

public class HelloWorld{
	public static void main(String args[]){
		System.out.println("HelloWorld!");
	}
}

输入下面命令进行编译并运行

javac HelloWorld.java
java HelloWorld

image-20241029084101067

可以看到 Java 正常工作,说明配置成功

# 2.2 配置 Hadoop

根据助教所发的文件,实验需要使用的 hadoop 版本为 hadoop-2.5.0-cdh5.3.6

相关文件也已经储存在宿主机 HTTP 服务器下,因此使用如下命令获取文件

cd /home
wget http://192.168.109.1/chfs/shared/hadoop-2.5.0-cdh5.3.6.tar.gz

image-20241018114230128

使用如下命令完成安装

cd /home
tar -zxvf hadoop-2.5.0-cdh5.3.6.tar.gz -C /root/app
cd /root/app/hadoop-2.5.0-cdh5.3.6/etc/hadoop
echo "export HADOOP_HOME=/root/app/hadoop-2.5.0-cdh5.3.6" >> /etc/profile
echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> /etc/profile
source /etc/profile

输入 hadoop 命令测试一下安装是否完成,可以看到安装已经完成

image-20241029082038598

# 2.3 搭建好单例模式并运行

# 2.3.1 配置 hadoop-env.sh
cd  ~/app/Hadoop-2.5.0-cdh5.3.6/etc/hadoop
vi hadoop-env.sh

修改 JAVA_HOME 为 /usr/lib/jdk1.8.0_161

image-20241029082514729

# 2.3.2 测试

根据文档,输入以下命令完成测试

cd /workspace
hadoop jar /root/app/hadoop-2.5.0-cdh5.3.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.6.jar wordcount /workspace/HelloWorld.java /workspace/out

可以看到正常运行,说明 hadoop 单例模式已经搭建好了

image-20241029085005338

再检查下输出文件

image-20241029085118721

# 3.Hadoop 伪分布式模式搭建

# 3.1 修改配置文件

# 3.1.1 配置 hadoop-env.sh

前面已经设置好了

image-20241029082514729

# 3.1.2 配置 core-site.xml
    <property>
        <name>fs.default.name</name>
        <value>hdfs://dengbohao001:9000</value>
    </property>

image-20241111114455900

# 3.1.3 配置 hdfs-site.xml

首先在 data 目录创建 namenode,datanode,tmp 文件夹

image-20241111114950860

然后进入 etc/hadoop 内配置 hdfs-site.xml

        <property>
                <name>dfs.name.dir</name>
                <value>/root/app/hadoop-2.5.0-cdh5.3.6/data/namenode</value>
        </property>
        <property>
                <name>dfs.data.dir</name>
                <value>/root/app/hadoop-2.5.0-cdh5.3.6/data/datanode</value>
        </property>
        <property>
                <name>dfs.tmp.dir</name>
                <value>/root/app/hadoop-2.5.0-cdh5.3.6/data/tmp</value>
        </property>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>

image-20241111115438528

# 3.1.4 配置 mapred-site.xml
mv mapred-site.xml.template mapred-site.xml
nano mapred-site.xml

        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>

image-20241111115644835

# 3.1.5 配置 yarn-site.xml
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>dengbohao001</value>
        </property>
        
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        

image-20241111120011526

# 3.1.6 配置 slaves

image-20241111120041240

# 3.1.7 配置环境变量 PATH

在单例模式中已经配置过

# 3.2 Namenode 格式化

输入 hdfs namenode -format

image-20241111120221383

出现这个说明格式化成功

# 3.3 启动

start-dfs.sh
start-yarn.sh

image-20241111120509821

出现这六个都没少,说明已全部成功启动了。

# 3.4 通过浏览器访问

也可以通过访问 http://192.168.109.129:50070 / 来监控伪分布式文件系统是否搭建成功

出现下图显示的页面,代表伪分布式搭建成功

image-20241111120619423

# 4. 虚拟机克隆及相关网络设置

# 4.1 克隆虚拟机

image-20241111120929943

image-20241111121101373

# 4.2 设置网络

直接使用 root 账户编辑即可

设想的地址分配为

dengbohao001 采用ip: 192.168.109.129
dengbohao002 采用ip: 192.168.109.139
dengbohao003 采用ip: 192.168.109.149
# 4.2.1 网络配置

以 dengbohao002 虚拟机为例

输入 ip addr,可以看到我的网卡叫做 ens33,IP 地址为 dengbohao001 的 IP 地址

image-20241111121908847

输入 nano /etc/network/interfaces (debian 系统)

更改配置文件如下

allow-hotplug ens33
iface ens33 inet static
address 192.168.109.139
netmask 255.255.255.0
gateway 192.168.109.1

image-20241111122353153

然后重启网络服务

systemctl restart networking.service

再次输入 ip address ,可以看到新 IP 地址已分配成功

image-20241111122526458

dengbohao1 dengbohao3 同理

# 4.2.2 修改主机名

需要更改 ** /etc/hostname/etc/hosts **

nano /etc/hostname

这个是本机主机名

image-20241111122927092

nano /etc/hosts

顺带把其他虚拟机的 IP 与虚拟机名称的映射也加入

192.168.109.129 dengbohao001
192.168.109.139 dengbohao002
192.168.109.149 dengbohao003

image-20241111123142693

最后应用更改

systemctl restart systemd-hostnamed

可以看到 hostname 已经更改完毕

image-20241111123612635

dengbohao1 dengbohao3 同理

# 4.2.3 建立 IP 地址与虚拟机名称的对应关系

上面在配置 hostname 时已经顺带配置好了 hosts

image-20241111124543699

# 4.3 虚拟机互 ping

此时需要完成的效果是:

Hadoop1、2、3 相互能 ping 通。包括 ping 主机名、ping ip.

宿主机可以 ping 通 Hadoop1、2、3. 包括 ping 主机名、ping ip.

Linux 系统 ping 虚拟机 hostname,可以看到正常解析出 IP 地址,正常 ping 通

  1. dengbohao001 ping dengbohao002
    image-20241111124744380

  2. dengbohao001 ping dengbohao003
    image-20241111124809768

  3. dengbohao002 ping dengbohao001
    image-20241111124909046

  4. dengbohao002 ping dengbohao003
    image-20241111124937468

  5. dengbohao003 ping dengbohao001
    image-20241111125013160

  6. dengbohao003 ping dengbohao002
    image-20241111125032250

再测试一下 ping IP

  1. dengbohao001 ping 192.168.109.139
    image-20241111130028655

  2. dengbohao001 ping 192.168.109.149

    image-20241111130053557

  3. dengbohao002 ping 192.168.109.129
    image-20241111130124529

  4. dengbohao002 ping 192.168.109.149
    image-20241111130146687

  5. dengbohao003 ping 192.168.109.129
    image-20241111125401348

  6. dengbohao003 ping 192.168.109.139
    image-20241111130006236

以及虚拟机内 ping 宿主机 IP 地址

  1. dengbohao001
    image-20241111130235228

  2. dengbohao002
    image-20241111130307358

  3. dengbohao003
    image-20241111130349494

# 4.4 Windows 主机中 ping

首先需要在在 Windows 环境下,配置 ip 地址和主机之间的映射

需要在 C:\Windows\System32\drivers\etc 目录下修改 hosts 文件

image-20241111125253427

首先测试 ping 三个 Hostname

image-20241111125435462

image-20241111125623193

image-20241111125635826

简单测试下直接 ping IP

image-20241111125713351

image-20241111130425261

image-20241111130443636

可以看到均正常 ping 通

# 4.5 SSH 免密登录设置

# 4.5.1 创建公钥 / 私钥
cd /root
cd .ssh/
ssh-keygen -t rsa
# 4.5.2 对虚拟机自己实行免密码登录
root@dengbohao001:~/.ssh# ssh-copy-id dengbohao001

image-20241111131149173

其余两台虚拟机同理

验证一下,使用 dengbohao001 免密码访问自己

image-20241111131529421

# 4.5.3 虚拟机之间相互通讯
# 4.5.3.1 虚拟机 1 访问虚拟机 2 和虚拟机 3

在虚拟机 1 的.ssh 目录下:

通过 IP 地址

ssh-copy-id 192.168.109.139
ssh-copy-id 192.168.109.149

验证一下

ssh 192.168.6.139
hostname

image-20241111131843828

hosts 已经在之前添加,因此可以直接用 hostname 实现免密访问

image-20241111132155443

dengbohao002 dengbohao003 同理配置

如 dengbohao002 免密码访问 dengbohao001

image-20241111132522086

# 4.6 开启 ntpd 服务

sudo apt-get update
sudo apt-get install -y ntp
sudo apt-get install -y ntpdate

timedatectl set-ntp false

nano /etc/ntpsec/ntp.conf

注意编辑 minsane 参数为 1

image-20241111155845379

systemctl restart ntpsec
ntpq -p

image-20241111142343444

设置具体时间

image-20241111140058324

脚本同步

crontab -e
0-59/10 * * * * ntpd dengbohao001

简单测试运行后,工作正常

image-20241111160100276

# 5.Hadoop 集群模式部署

# 5.1 主节点部署

mkdir /usr/software
tar -zxvf hadoop-2.5.0-cdh5.3.6.tar.gz -C /usr/software/
mv /usr/software/hadoop-2.5.0-cdh5.3.6 ~/app/hadoop-2.5.0
# 5.1.1 修改配置文件

配置 hadoop-env.sh

image-20241111144259559

配置 core-site.xml

    <property>
        <name>fs.default.name</name>
        <value>hdfs://dengbohao001:9000</value>
    </property>
    
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/root/app/hadoop-2.5.0/data/tmp</value>
    </property>
    
    <property>
        <name>fs.trash.interval</name>
        <value>420</value>
    </property>

image-20241111144605873

配置 hdfs-site.xml

        <property>
                <name>dfs.namenode.secondary.http-address</name>
                <value>dengbohao003:50090</value>
        </property>

image-20241111144913850

配置 mapred-site.xml

mv mapred-site.xml.template mapred-site.xml

        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>dengbohao001:10020</value>
        </property>
        
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>dengbohao001:19888</value>
        </property>

配置 yarn-site.xml

        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>dengbohao002</value>
        </property>
        
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>

        <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>
        </property>
        
        <property>
                <name>yarn.log-aggregation.retain-seconds</name>
                <value>420</value>
        </property>

image-20241111151413047

配置 slaves

image-20241111151424904

# 5.2 集群节点分发与启动

# 5.2.1 修改 /etc/profile 文件

image-20241111150544428

随后将修改后的文件推送给剩下两个客户端

image-20241111150520607

# 5.3 格式化

输入 bin/hdfs 可以看到有格式化文件

image-20241111150728484

bin/hdfs namenode -format,格式化

image-20241111150757420

出现以上信息则表示格式化成功

# 5.4 分别启动三台机器

(1)在第一台机器上输入 sbin/start-dfs.sh

image-20241111150857246

在第二台机器上使用 jps 命令可以看出只有一个 dananode

image-20241111150939587

同理第三台有一个 datanode 和 secondarynamenode

image-20241111151004705

(2)在第二台机器上输入 sbin/start-yarn.sh

image-20241111154604034

这里会有一个找不到 mapreduce 文件夹中的类的 bug,使用如下方式解决

创建 mapreduce 的软链接

cd /hadoop/software/hadoop-2.6.0-cdh5.15.0/share/hadoop
ln -s mapreduce2 mapreduce

# 5.5 最后结果

符合了实验预期

dengbohao001, 第一台机器

image-20241111154544709

dengbohao002, 第二台机器

image-20241111154648947

dengbohao003, 第三台机器

image-20241111154703584

# 6.MapReduce 应用案例

# 6.1 配置 Eclipse

双击启动

image-20241111161146406

配置 JVM 参数

image-20241111161347885

创建快捷方式

touch /usr/share/applications/eclipse.desktop
nano /usr/share/applications/eclipse.desktop


[Desktop Entry]
Type=Application
Name=eclipse
Exec=/home/eclipse/eclipse  //存放eclipse的绝对路径
GenericName=eclipse
Comment=Java development tools
Icon=/home/eclipse/icon.xpm  //eclipse图标存放路径
Categories=Application;Development;
Terminal=false

调整键位

image-20241111162058167

# 6.2 复制 jar 包

首先新建实验项目

image-20241111162248985

然后复制 jar 包

image-20241111163811983

添加依赖

image-20241111163720867

# 6.3 编写实验代码

创建 word.txt

image-20241111164012776

建包 com.hadoop.mapreduce

image-20241111164153947

# 6.4 运行

image-20241111170857535

可以看到正常运行成功

image-20241111170909098

# 6.5 使用 gui 界面在 /workspace/mapreduceOu 查看输出内容

可以看出 word.txt 的单词数目为 10 个

image-20241111170955461

# 四、实验总结

本次实验让我深入理解了 Hadoop 的安装部署和 MapReduce 的应用。以下是主要收获:

  1. 系统基础设施搭建:
  • 学会了在虚拟机环境下安装和配置 Linux 系统
  • 掌握了网络配置、主机名配置、hosts 映射等基础网络知识
  • 理解了 SSH 免密登录的配置方法和时间同步服务的重要性
  1. Hadoop 不同模式的部署:
  • 掌握了 Hadoop 单机模式、伪分布式模式和完全分布式模式的区别和配置方法
  • 理解了各个配置文件 (core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml) 的作用和配置要点
  • 学会了 namenode 格式化、启动服务等基本运维操作
  1. 分布式集群的搭建:
  • 理解了 Master 和 Slave 节点的角色分工
  • 掌握了集群间配置文件同步和分发的方法
  • 学会了使用 jps 等命令监控集群状态
  1. MapReduce 开发环境搭建:
  • 学会了配置 Eclipse 开发环境
  • 掌握了 MapReduce 程序开发的基本流程
  • 实践了 WordCount 等经典 MapReduce 案例
  1. 遇到的主要问题和解决方案:
  • 网络配置问题:通过仔细配置 IP 地址、子网掩码和网关解决
  • 权限问题:通过正确设置文件和目录权限解决
  • 服务启动问题:通过查看日志定位和解决错误

本次实验加深了对 Hadoop 分布式系统的理解,不仅学习了理论知识,更重要的是获得了实践经验。这为后续深入学习大数据处理技术打下了良好基础。