# 实验三 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
# 1.2 查看虚拟机网络
为虚拟机实例分配的仅主机网络,子网划分为 192.168.109.0/24
可以看到 IP
地址为 192.168.109.129
# 1.3 本机 cmd 中 ping 192.168.109.129
# 1.4 修改主机名
可以看到创建虚拟机的时候就已经让主机名符合实验要求了
# 1.5 建立 IP 与虚拟机名称的映射
在 Windows
环境下,配置 ip 地址和主机之间的映射
需要在 C:\Windows\System32\drivers\etc
目录下修改 hosts
文件
使用 VSCode
进行修改,添加条目 192.168.109.129 dengbohao001
如果是 Linux 环境下
使用如下命令,配置 ip 地址和主机之间的映射
nano /etc/hosts
# 1.6 本机终端如 cmd 中 ping 虚拟机主机名
可以看到已经成功完成了映射
# 2.Hadoop 单例模型搭建
# 2.1 安装 Java 根据助教所发的文件,实验需要使用的 Java
版本为 jdk-8u161
为了实现文件传输,在宿主机搭建了一个 HTTP 服务器
VMNet 子网划分时,宿主机分配到了 192.168.109.1
的地址
因此使用如下命令获取文件
cd /home
wget http://192.168.109.1/chfs/shared/jdk-8u161-linux-x64.tar.gz
使用如下命令完成 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 已经配置完毕
根据文档要求,写一个简单的 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
可以看到 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
使用如下命令完成安装
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 命令测试一下安装是否完成,可以看到安装已经完成
# 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
# 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 单例模式已经搭建好了
再检查下输出文件
# 3.Hadoop 伪分布式模式搭建
# 3.1 修改配置文件
# 3.1.1 配置 hadoop-env.sh
前面已经设置好了
# 3.1.2 配置 core-site.xml
<property>
<name>fs.default.name</name>
<value>hdfs://dengbohao001:9000</value>
</property>
# 3.1.3 配置 hdfs-site.xml
首先在 data 目录创建 namenode,datanode,tmp 文件夹
然后进入 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>
# 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>
# 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>
# 3.1.6 配置 slaves
# 3.1.7 配置环境变量 PATH
在单例模式中已经配置过
# 3.2 Namenode 格式化
输入 hdfs namenode -format
出现这个说明格式化成功
# 3.3 启动
start-dfs.sh
start-yarn.sh
出现这六个都没少,说明已全部成功启动了。
# 3.4 通过浏览器访问
也可以通过访问 http://192.168.109.129:50070 / 来监控伪分布式文件系统是否搭建成功
出现下图显示的页面,代表伪分布式搭建成功
# 4. 虚拟机克隆及相关网络设置
# 4.1 克隆虚拟机
# 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 地址
输入 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
然后重启网络服务
systemctl restart networking.service
再次输入 ip address
,可以看到新 IP 地址已分配成功
dengbohao1 dengbohao3 同理
# 4.2.2 修改主机名
需要更改 ** /etc/hostname
和 /etc/hosts
**
nano /etc/hostname
这个是本机主机名
nano /etc/hosts
顺带把其他虚拟机的 IP 与虚拟机名称的映射也加入
192.168.109.129 dengbohao001
192.168.109.139 dengbohao002
192.168.109.149 dengbohao003
最后应用更改
systemctl restart systemd-hostnamed
可以看到 hostname
已经更改完毕
dengbohao1 dengbohao3 同理
# 4.2.3 建立 IP 地址与虚拟机名称的对应关系
上面在配置 hostname 时已经顺带配置好了 hosts
# 4.3 虚拟机互 ping
此时需要完成的效果是:
Hadoop1、2、3 相互能 ping 通。包括 ping 主机名、ping ip.
宿主机可以 ping 通 Hadoop1、2、3. 包括 ping 主机名、ping ip.
Linux 系统 ping 虚拟机 hostname,可以看到正常解析出 IP 地址,正常 ping 通
dengbohao001 ping dengbohao002
dengbohao001 ping dengbohao003
dengbohao002 ping dengbohao001
dengbohao002 ping dengbohao003
dengbohao003 ping dengbohao001
dengbohao003 ping dengbohao002
再测试一下 ping IP
dengbohao001 ping 192.168.109.139
dengbohao001 ping 192.168.109.149
dengbohao002 ping 192.168.109.129
dengbohao002 ping 192.168.109.149
dengbohao003 ping 192.168.109.129
dengbohao003 ping 192.168.109.139
以及虚拟机内 ping 宿主机 IP 地址
dengbohao001
dengbohao002
dengbohao003
# 4.4 Windows 主机中 ping
首先需要在在 Windows
环境下,配置 ip 地址和主机之间的映射
需要在 C:\Windows\System32\drivers\etc
目录下修改 hosts
文件
首先测试 ping 三个 Hostname
简单测试下直接 ping IP
可以看到均正常 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
其余两台虚拟机同理
验证一下,使用 dengbohao001 免密码访问自己
# 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
hosts 已经在之前添加,因此可以直接用 hostname 实现免密访问
dengbohao002 dengbohao003 同理配置
如 dengbohao002 免密码访问 dengbohao001
# 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
systemctl restart ntpsec
ntpq -p
设置具体时间
脚本同步
crontab -e
0-59/10 * * * * ntpd dengbohao001
简单测试运行后,工作正常
# 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
配置 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>
配置 hdfs-site.xml
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>dengbohao003:50090</value>
</property>
配置 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>
配置 slaves
# 5.2 集群节点分发与启动
# 5.2.1 修改 /etc/profile 文件
随后将修改后的文件推送给剩下两个客户端
# 5.3 格式化
输入 bin/hdfs 可以看到有格式化文件
bin/hdfs namenode -format,格式化
出现以上信息则表示格式化成功
# 5.4 分别启动三台机器
(1)在第一台机器上输入 sbin/start-dfs.sh
在第二台机器上使用 jps 命令可以看出只有一个 dananode
同理第三台有一个 datanode 和 secondarynamenode
(2)在第二台机器上输入 sbin/start-yarn.sh
这里会有一个找不到 mapreduce 文件夹中的类的 bug,使用如下方式解决
创建 mapreduce 的软链接
cd /hadoop/software/hadoop-2.6.0-cdh5.15.0/share/hadoop
ln -s mapreduce2 mapreduce
# 5.5 最后结果
符合了实验预期
dengbohao001, 第一台机器
dengbohao002, 第二台机器
dengbohao003, 第三台机器
# 6.MapReduce 应用案例
# 6.1 配置 Eclipse
双击启动
配置 JVM 参数
创建快捷方式
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
调整键位
# 6.2 复制 jar 包
首先新建实验项目
然后复制 jar 包
添加依赖
# 6.3 编写实验代码
创建 word.txt
建包 com.hadoop.mapreduce
# 6.4 运行
可以看到正常运行成功
# 6.5 使用 gui 界面在 /workspace/mapreduceOu 查看输出内容
可以看出 word.txt 的单词数目为 10 个
# 四、实验总结
本次实验让我深入理解了 Hadoop 的安装部署和 MapReduce 的应用。以下是主要收获:
- 系统基础设施搭建:
- 学会了在虚拟机环境下安装和配置 Linux 系统
- 掌握了网络配置、主机名配置、hosts 映射等基础网络知识
- 理解了 SSH 免密登录的配置方法和时间同步服务的重要性
- Hadoop 不同模式的部署:
- 掌握了 Hadoop 单机模式、伪分布式模式和完全分布式模式的区别和配置方法
- 理解了各个配置文件 (core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml) 的作用和配置要点
- 学会了 namenode 格式化、启动服务等基本运维操作
- 分布式集群的搭建:
- 理解了 Master 和 Slave 节点的角色分工
- 掌握了集群间配置文件同步和分发的方法
- 学会了使用 jps 等命令监控集群状态
- MapReduce 开发环境搭建:
- 学会了配置 Eclipse 开发环境
- 掌握了 MapReduce 程序开发的基本流程
- 实践了 WordCount 等经典 MapReduce 案例
- 遇到的主要问题和解决方案:
- 网络配置问题:通过仔细配置 IP 地址、子网掩码和网关解决
- 权限问题:通过正确设置文件和目录权限解决
- 服务启动问题:通过查看日志定位和解决错误
本次实验加深了对 Hadoop 分布式系统的理解,不仅学习了理论知识,更重要的是获得了实践经验。这为后续深入学习大数据处理技术打下了良好基础。