并行计算实验报告:使用Hadoop进行WorldCount
-
实验环境
-
宿主机:
- 操作系统:Manjaro 20.0.3 Lysia
- 内核:x86_64 Linux 5.7.0-3-MANJARO
- CPU:Intel Core i5-8400 @ 6x 4GHz
- GPU:GeForce GTX 1080 Ti
- 内存:16GB
-
虚拟机1:
- 操作系统:Manjaro 20.0.3 Lysia
- 内核:x86_64 Linux 5.6.15-1-MANJARO
- CPU:Intel Core i5-8400 @ 2.808GHz
- GPU:llvmpipe (LLVM 10.0.0, 256 bits)
- 内存:2GB
-
虚拟机2:
- 操作系统:Manjaro 20.0.3 Lysia
- 内核:x86_64 Linux 5.6.15-1-MANJARO
- CPU:Intel Core i5-8400 @ 2.808GHz
- GPU:llvmpipe (LLVM 10.0.0, 256 bits)
- 内存:2GB
-
-
Hadoop环境搭建与实验测试
-
随机生成包含如下内容的3个文件保存至
~/Desktop/hadoop/input/
,作为输入
~/Desktop/input/hadoop/1.in:
jydyuignjk jydyuignjk ymsnsjjsbb tkozsuesbv
~/Desktop/input/hadoop/2.in:
tkozsuesbv ymsnsjjsbb tkozsuesbv ymsnsjjsbb
~/Desktop/input/hadoop/3.in:
ymsnsjjsbb jydyuignjk jydyuignjk tkozsuesbv
-
进入Hadoop的安装目录
$ cd /usr/lib/hadoop
-
使用Hadoop运行
./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar
中的wordcount
模块$ hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar \ wordcount ~/Desktop/hadoop/input ~/Desktop/hadoop/output
(注:运行hadoop需首先将
$JAVA_HOME
设置为Java的安装目录)在
~/Desktop/output/
中得到两个输出文件,一个名为_SUCCESS
的空文件,和一个名为part-r-00000
的文本文件,part-r-00000
里的内容为:jydyuignjk 4 tkozsuesbv 4 ymsnsjjsbb 4
于是在单机部署下使用Hadoop完成了WordCount任务
-
使用Oracle VM VirtualBox创建两个相同的虚拟机并组建内网
虚拟机配置已在实验环境中列出,而在网卡设置时,我们需要使虚拟机不仅能够访问外网,同时还能与Host机和另一台虚拟机进行内网通信,有两种方法可以实现:
- 为虚拟机设置一张桥接网卡
- 为虚拟机设置两张网卡,一张NAT网卡,一张Host-Only网卡,其中NAT网卡用于虚拟机连接外网,Host-Only网卡用于主机与虚拟机、虚拟机与虚拟机之间的互连
由于在设置桥接网卡后,内网设备间的通信数据都要经过路由器转发,经过测试效率较低,因此这里采用了设置两张网卡的方式:
首先在主机网络管理器中,创建一张虚拟网卡,这里设置的参数为:
IPv4地址: 192.168.99.100 IPv4网络掩码: 255.255.255.0
随后在虚拟机中会找到两个有线网络,将NAT网络的IPv4地址设置为自动获取,将Host-Only网卡的IPv4地址设置为
192.168.99.x
,其中x
为在内网中不重复的值,在这里,两台虚拟机的IPv4地址分别被设置为了192.168.99.101
和192.168.99.102
.接着测试网络的连通性,将虚拟机中的网络连接切换为Host-Only连接,接着使用
ping
来测试:
宿主机:$ ping 192.168.99.101 $ ping 192.168.99.102
虚拟机1:
$ ping 192.168.99.100 $ ping 192.168.99.102
虚拟机2:
$ ping 192.168.99.100 $ ping 192.168.99.101
经测试,均能连通,内网组建完成。
然后在每个机器上均创建名为
hadoop
的账户useradd hadoop
接下来使用
ssh-keygen
生成密钥,并用ssh-copy-id
方便地保存密钥,使得宿主机和虚拟机、虚拟机和虚拟机的hadoop
账户之间可以无需密码进行ssh
登录。最后对宿主机和虚拟机均使用如下命令关闭防火墙,就可以开始配置Hadoop集群了:
systemctl stop iptables
-
启动Hadoop服务并进行测试
首先在文件
/etc/hadoop/workers
中添加两个虚拟机的内网IPv4地址:192.168.99.101 192.168.99.102
然后修改一下配置文件
/etc/hadoop/core-site.xml
,增加如下配置,这里使用了端口9000用作数据传输:<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration>
以及
/etc/hadoop/hdfs-site.xml
:<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
接下来在宿主机上对Hadoop分布式文件系统进行格式化:
$ hadoop namenode -format
最后就可以启动Hadoop了,只需在宿主机上执行:
$ /lib/hadoop/sbin/start-dfs.sh
这时候,Hadoop分布式集群就已经构建完毕了。
可以执行
jps
来查看运行的Hadoop进程:
宿主机:$ jps 34272 Jps 32681 NameNode 32845 SecondaryNameNode
虚拟机1:
$ jps 13768 Jps 13614 DataNode
虚拟机2:
$ jps 12509 DataNode 12606 Jps
使用
http
协议访问宿主机的9870
端口,即http://192.168.99.100:9870
,就进入了集群后台,可以看到集群中有2个数据节点,IPv4地址分别为192.168.99.101
与192.168.99.102
,即为组建内网时设置的值:
在集群的文件系统中创建input
文件夹:$ /lib/hadoop/bin/hdfs dfs -mkdir input
随机生成总大小约1G的3个文本文件,内容格式与单机测试时的格式相同,存至本地的
./input/
,然后使用如下命令上传至Hadoop集群:$ /lib/hadoop/bin/hdfs dfs -put ./input/* input
这时再次访问集群后台,可以看到数据节点的存储空间已被占用了一部分:
这时就可以以分布式的方式进行WordCount了:$ hadoop jar /lib/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar\ wordcount input output
计算完成后,通过如下命令显示结果:
$ /lib/hadoop/bin/hdfs dfs -cat output/*
显示的结果为:
gcmjplyxwc 29997181 igwzvrjcmd 30002820 tbtwrtsxji 29999999
至此就完成了使用Hadoop进行WordCount的实验。
-
-
总结
通过这次实验,可以发现使用Hadoop框架是可以非常方便地搭建一个分布式计算集群的,多个节点间唯一需要满足的条件就是可以通过网络互连。搭建好Hadoop集群后,便可以方便地执行分布式任务。Hadoop集群的文件系统也是非常强大的,在上面上传1G大小的文件可以看出:Hadoop在后端自动地将文件分布式地存储于两个节点,可是对于用户来说,却好像是在操作同一个节点上的文件系统。当然,环境的搭建和简单程序的运行只是学习Hadoop的开端,我会更加深入地学习Hadoop的应用与优化,并深入了解其底层实现方法。相信通过学习Hadoop这样一个优秀的框架,会对我理解分布式架构有很大的帮助。