Hadoop分布式文件系统(HDFS)和MapReduce计算框架实训

内容大概

本次实训报告主要围绕Hadoop分布式文件系统(HDFS)和MapReduce计算框架进行。

大概可以这样子总结需要的命令:

  1. HDFS操作
    • 使用hadoop fs -mkdir命令在HDFS根目录下创建了一个名为/project的目录。
    • 使用hadoop fs -put命令将本地文件系统中的/opt/test.txt文件上传到HDFS的/project目录下。
    • 使用hadoop fs -ls命令查看HDFS中/project目录下的内容,确认test.txt文件已成功上传。
  2. MapReduce作业执行
    • 使用hadoop jar命令执行了hadoop-mapreduce-examples-3.1.4.jar中的wordcount程序,对/project/test.txt文件进行单词计数。
    • 将MapReduce作业的输出结果保存到了HDFS的/result目录下。
    • 通过hadoop fs -cat命令查看了/result目录中的part-r-00000文件,该文件包含了单词计数的结果。
  3. 结果下载与查看
    • 使用hadoop fs -get命令将HDFS中/result目录的所有内容下载到了Linux本地文件系统的/opt/result目录。
    • 在Linux中使用lscat命令查看下载的文件,确认了part-r-00000文件中包含了单词计数的结果。

在电脑上创建文本文件test.txt, 将以下内容复制进文件内

Is a quiet village in which there was a military camp. It was far from the towns and cities and there were some high mountains around. Of course it was a good place for training the new soldiers. But it was difficult for the young men to go outside. Mr. White,an officer of forty,was strict with them and he hardly let them leave the camp.

Once Mr. White was ill in bed. He couldn’t work and a young officer,Mr. Hunt,began to train the new soldiers instead of him. He knew the young men well and let nine soldiers go to the nearest town to have a holiday. But night fell and none came back to the camp. He was worried about it and stood at the gate. It was five to twelve when Mr. Hunt decided to go to the town and see what was happening with the young men. He started the car quickly and set off. At that moment the nine soldiers came back. It seemed they were all drunk. Of course they found the officer was angry.

“I’m sorry,sir,” said the first soldier. “I left the town on time. But something was wrong with my bus on my way here. I had to buy a horse and made it run fast. Bad luck!It died and I had to run back.”

And the other seven soldiers said they were late for the same reasons. It was the last soldier’s turn. He said,”I’m sorry,sir. I got on a bus on time,but…”

Having heard this,the officer became even angrier and stopped him at once. He called out,”If you say something was wrong with your bus,I’ll punish you at once!”

“No,no,sir,” said the young man. “My bus was all right,but the dead horses were in its way!”

上传之前创建并写入内容的test.txt

使用xftp将文本文件test.txt上传到安装好Hadoop的虚拟机Centos的/opt目录之下。

使用hadoop命令 在hdfs中根目录之下创建目录 /project

在Hadoop文件系统(HDFS)中创建目录可以使用hadoop fs命令。

hadoop fs -mkdir /project
要查看上一步在Hadoop分布式文件系统(HDFS)中创建的目录,可以使用`hadoop fs -ls`命令:
hadoop fs -ls /

这个命令会列出HDFS根目录(/)下的所有文件和目录。输出将类似于以下内容:

drwxr-xr-x   - hadoop supergroup          0 2023-04-01 12:00 /project

这里,drwxr-xr-x表示目录的权限,hadoop是目录所有者的用户名,supergroup是组名,0表示目录的大小(字节),最后是目录的路径和名称。

如果你需要创建嵌套的目录结构,即使父目录不存在,也可以使用-p选项,该选项会同时创建所有必要的父目录:

hadoop fs -mkdir -p /project/subdirectory

上述命令会在HDFS中创建/project以及/project/subdirectory目录。如果/project目录不存在,它也会被创建。

使用hadoop 命令将linux中的test.txt文件上传至 hdfs中的project目录之下

要将本地文件系统中的文件/opt/test.txt上传到Hadoop分布式文件系统(HDFS)中的/project目录下,可以使用hadoop fs -put命令。如果/project目录不存在,命令会报错。

hadoop fs -put /opt/test.txt /project

如果文件上传成功,hadoop fs - ls /project可以看到上传的文件。

hadoop fs -ls /project

使用hadoop命令查看hdfs里面的test.txt文件

要查看Hadoop分布式文件系统(HDFS)中的test.txt文件内容,可以使用hadoop fs -cat命令:

hadoop fs -cat /project/test.txt

这个命令会输出/project目录下test.txt文件的内容到终端上。如果你只想查看文件的部分内容,可以使用hadoop fs -tail命令来查看文件的最后几行:

hadoop fs -tail /project/test.txt

运用hadoop里面的示例包hadoop-mapreduce-examples-3.1.4.jar 中的wordcount功能 统计 test.txt文档的单词出现次数,将统计结果输出到 /result目录中。

要使用Hadoop的hadoop-mapreduce-examples-3.1.4.jar中的wordcount功能来统计test.txt文档中的单词出现次数,并将统计结果输出到HDFS的/result目录中,你可以按照以下步骤操作:

  1. 确保你的Hadoop集群正在运行,并且你已经将test.txt文件上传到了HDFS的/project目录下。
  2. 使用Hadoop的wordcount示例程序来处理文件。以下是你需要运行的命令:
    hadoop jar /path/to/hadoop-mapreduce-examples-3.1.4.jar wordcount /project/test.txt /result
    /path/to/hadoop-mapreduce-examples-3.1.4.jar替换为实际hadoop-mapreduce-examples-3.1.4.jar文件所在的路径。这个命令会启动一个MapReduce作业,读取/project/test.txt文件,统计单词出现次数,并将结果输出到/result目录。

我执行的命令路径作为参考:

hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar wordcount /project/test.txt /result

如果你不知道实际路径,可以使用find命令查询:

find / -name "hadoop-mapreduce-examples-3.1.4.jar"

这个命令会在整个文件系统中搜索名为hadoop-mapreduce-examples-3.1.4.jar的文件,并返回它的路径。

  1. 等待作业完成。作业完成后,你可以查看输出结果。使用以下命令来查看/result目录的内容:
    hadoop fs -ls /result
  2. 请注意,如果/result目录已经存在,你可能会遇到错误,因为Hadoop不允许输出目录已经存在。如果发生这种情况,你可以先删除/result目录,或者使用一个不同的输出目录。以下是如何删除/result目录的命令:
    hadoop fs -rm -r /result
    确保在运行wordcount作业之前/result目录不存在!

执行完毕后的输出分析

以下为我的输出:

2024-05-10 13:53:18,768 INFO client.RMProxy: Connecting to ResourceManager at master/192.168.200.133:8032
2024-05-10 13:53:19,278 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/root/.staging/job_1715319391222_0001
2024-05-10 13:53:19,445 INFO input.FileInputFormat: Total input files to process : 1
2024-05-10 13:53:19,501 INFO mapreduce.JobSubmitter: number of splits:1
2024-05-10 13:53:19,612 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1715319391222_0001
2024-05-10 13:53:19,613 INFO mapreduce.JobSubmitter: Executing with tokens: []
2024-05-10 13:53:19,842 INFO conf.Configuration: resource-types.xml not found
2024-05-10 13:53:19,842 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2024-05-10 13:53:20,032 INFO impl.YarnClientImpl: Submitted application application_1715319391222_0001
2024-05-10 13:53:20,161 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1715319391222_0001/
2024-05-10 13:53:20,162 INFO mapreduce.Job: Running job: job_1715319391222_0001
2024-05-10 13:53:28,243 INFO mapreduce.Job: Job job_1715319391222_0001 running in uber mode : false
2024-05-10 13:53:28,243 INFO mapreduce.Job: map 0% reduce 0%
2024-05-10 13:53:34,315 INFO mapreduce.Job: map 100% reduce 0%
2024-05-10 13:53:37,331 INFO mapreduce.Job: map 100% reduce 100%
2024-05-10 13:53:38,341 INFO mapreduce.Job: Job job_1715319391222_0001 completed successfully
2024-05-10 13:53:38,403 INFO mapreduce.Job: Counters: 53
File System Counters
FILE: Number of bytes read=2044
FILE: Number of bytes written=447297
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=1673
HDFS: Number of bytes written=1370
HDFS: Number of read operations=8
HDFS: Number of large read operations=0
HDFS: Number of write operations=2
Job Counters
Launched map tasks=1
Launched reduce tasks=1
Data-local map tasks=1
Total time spent by all maps in occupied slots (ms)=3341
Total time spent by all reduces in occupied slots (ms)=1576
Total time spent by all map tasks (ms)=3341
Total time spent by all reduce tasks (ms)=1576
Total vcore-milliseconds taken by all map tasks=3341
Total vcore-milliseconds taken by all reduce tasks=1576
Total megabyte-milliseconds taken by all map tasks=3421184
Total megabyte-milliseconds taken by all reduce tasks=1613824
Map-Reduce Framework
Map input records=11
Map output records=296
Map output bytes=2741
Map output materialized bytes=2044
Input split bytes=100
Combine input records=296
Combine output records=168
Reduce input groups=168
Reduce shuffle bytes=2044
Reduce input records=168
Reduce output records=168
Spilled Records=336
Shuffled Maps =1
Failed Shuffles=0
Merged Map outputs=1
GC time elapsed (ms)=235
CPU time spent (ms)=1280
Physical memory (bytes) snapshot=484192256
Virtual memory (bytes) snapshot=5582262272
Total committed heap usage (bytes)=434634752
Peak Map Physical memory (bytes)=292511744
Peak Map Virtual memory (bytes)=2787889152
Peak Reduce Physical memory (bytes)=191680512
Peak Reduce Virtual memory (bytes)=2794373120
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=1573
File Output Format Counters
Bytes Written=1370

输出信息分析:

  • 作业ID为job_1715319391222_0001
  • 作业运行在非uber模式(即不是在同一个JVM中运行Map和Reduce任务)。
  • 总共启动了1个Map任务和1个Reduce任务。
  • Map任务读取了11条记录,输出了296条记录。
  • Reduce任务接收了168个组,输出了168条记录。
  • 作业读取了1573字节的数据,并写出了1370字节的数据。
  • 作业完成时间为2024-05-10 13:53:38。

使用hadoop命令下载输出的结果,也就是HDFS里面的/result文件夹所有内容,将文件保存至 linux中的 /opt/result 目录

要将HDFS中的/result文件夹的所有内容下载到Linux中的/opt/result目录,你可以使用hadoop fs -get命令。以下是如何操作的命令:

hadoop fs -get /result /opt/result

这个命令会将HDFS中/result目录下的所有内容下载到Linux的/opt/result目录。如果/opt/result目录不存在,命令会自动创建它。
如果你只想下载/result目录下的特定文件,你可以指定文件名。例如,如果你只想下载part-r-00000文件,可以使用以下命令:

hadoop fs -get /result/part-r-00000 /opt/result

这会将part-r-00000文件下载到/opt/result目录。
请确保你有足够的权限来写入/opt/result目录,否则你可能需要使用sudo来执行这些命令。

使用命令查看 下载的结果

首先使用ls命令查看你下载下来的文件名字,然后将输出的实际名字替换到后面的命令

ls /opt/result

这个命令会输出/opt/result目录中的part-r-00000文件的内容到终端上。

一旦你使用Hadoop命令将/result目录的内容下载到Linux的/opt/result目录,你可以使用Linux的cat命令来查看下载的文件内容。以下是如何查看/opt/result目录下的文件的命令:

cat /opt/result/part-r-00000

请确保替换文件名为你实际下载的文件名。如果你下载了整个/result目录,那么/opt/result目录下应该有所有输出的文件。

多说几句

在Hadoop中,当一个MapReduce作业成功完成后,它会在输出目录中创建一个名为_SUCCESS的空文件,这表示作业已经成功完成。这个文件本身不包含任何结果数据,它只是一个标志,表明作业已经完成了。
要查看实际的输出结果,你应该查看part-r-00000文件,因为它通常包含了MapReduce作业的输出数据。在你的情况下,你可以使用cat命令来查看part-r-00000文件的内容:

cat /opt/result/part-r-00000

这个命令会显示文件的内容,即单词计数的结果。每个单词及其计数将会占据一行,通常以制表符分隔。
如果你想要以更友好的格式查看结果,你可以使用less命令,它允许你上下滚动查看文件内容:

less /opt/result/part-r-00000

或者,如果你想要在文本编辑器中打开文件,你可以使用nanovim命令:

nano /opt/result/part-r-00000

或者

vim /opt/result/part-r-00000

这些命令会打开文本编辑器,让你可以查看和编辑文件内容。

本次实训总结

  • 通过本次实训,深入理解了Hadoop分布式文件系统HDFS的基本操作,包括创建目录、上传文件、查看文件等。
  • 学习了如何使用Hadoop的MapReduce框架执行wordcount程序,对文本文件进行单词频率统计。
  • 掌握了如何将HDFS中的输出结果下载到本地文件系统,并使用Linux命令查看结果文件。
  • 本次实训不仅提高了对Hadoop生态系统组件的实际操作能力,也为进一步学习大数据处理和分析打下了坚实的基础。

总体来说,本次实训是一次成功的Hadoop实践,通过实际操作,加深了对Hadoop分布式计算环境的理解,并提高了使用Hadoop进行数据处理的能力。