MapReduce基础编程实践(Hadoop 3.5.0和TRAE)

💡 原文中文,约9000字,阅读约需22分钟。
📝

内容提要

本教程介绍在Ubuntu虚拟机上使用TRAE CN创建Java项目,编写MapReduce词频统计程序:以两个本地文本文件为输入并上传至HDFS,添加Hadoop 3.5.0相关JAR依赖,编译导出WordCount.jar并部署到Hadoop目录,最后提交作业统计单词出现次数,结果按单词排序输出到HDFS。

🔎

延伸解读

本地运行模式的实际含义

文章日志显示作业使用LocalJobRunner,即MapReduce任务在本地JVM中执行,而非提交到YARN集群。这意味着输入输出仍通过HDFS读写,但计算不涉及分布式资源调度。对于学习MapReduce编程模型和调试逻辑,这种模式足够;但若想验证集群环境下的并行行为,需要额外配置YARN并调整提交方式。

依赖添加的易错点

添加JAR依赖时,需按顺序选择mapreduce目录下的JAR、common目录中的hadoop-common和hadoop-nfs,以及common/lib中的所有第三方JAR。容易出错的是误选jdiff、lib或sources文件夹,或漏掉common/lib中的依赖,导致编译时org.apache.hadoop导入报错。添加后应等待Java扩展刷新,并确认项目已切换到标准模式。

输出目录与重复运行

MapReduce要求输出目录在作业提交前不存在,否则会报错。首次运行可直接提交;若之前已生成output,需先删除或改用新目录如output2。输入目录可重复使用,但若其中包含额外文件,词频结果会受影响。因此每次运行前应检查输入目录内容,确保只包含预期的两个文本文件。

分词规则对结果的影响

程序按空白字符分词,区分大小写且不去除标点。因此Spark和spark会被统计为不同单词,标点符号若与单词相连也会被计入。示例输入中单词均为纯字母且大小写固定,所以结果符合预期。若输入文本包含标点或大小写混用,实际词频会与直觉不同,需要根据需求调整分词逻辑。

❓

Q&A

MapReduce编程模型的核心思想是什么?

MapReduce是一种分布式计算编程模型,Hadoop提供了它的开源实现。它把数据处理过程抽象为Map和Reduce两个主要阶段,使编程人员能够通过编写映射和归并逻辑完成并行计算。

在TRAE中创建Java项目时,如何选择项目类型?

在项目类型选择界面中选择“No build tools”,创建一个不使用Maven或Gradle的普通Java项目。

为WordCount项目添加Hadoop JAR依赖时,需要添加哪些目录下的JAR文件?

按顺序添加:1. /usr/local/hadoop/share/hadoop/mapreduce 当前目录中的.jar文件(子目录不选);2. /usr/local/hadoop/share/hadoop/common 中的hadoop-common-3.5.0.jar和hadoop-nfs-3.5.0.jar;3. /usr/local/hadoop/share/hadoop/common/lib 中的所有.jar文件。

WordCount程序的输入文件内容是什么?预期词频统计结果如何?

输入文件wordfile1.txt内容为“I love Spark”和“I love Hadoop”;wordfile2.txt内容为“Hadoop is good”和“Spark is fast”。预期结果为:Hadoop 2, I 2, Spark 2, fast 1, good 1, is 2, love 2。

如何导出WordCount.jar?

按Ctrl+Shift+P打开命令面板,输入“Java: Export Jar”,选择“Java: 导出到Jar文件...”。在“Export Jar: Determine main class”界面中选择“WordCount”,按Enter确认。在“Export Jar: Determine elements”界面取消所有依赖JAR的勾选,只保留bin编译输出,点击“确定”。

提交MapReduce作业的命令是什么?

在Ubuntu终端执行:cd /usr/local/hadoop 然后 ./bin/hadoop jar ./myapp/WordCount.jar input output。其中WordCount.jar是本地JAR文件,最后两个路径分别为HDFS输入目录和输出目录。

运行WordCount程序前,对输出目录有什么要求?

MapReduce提交前,/user/hadoop/output必须不存在,不要事先创建这个目录。如果上次实验已经生成了output,且旧结果无需保留,可以删除旧输出:./bin/hdfs dfs -rm -r /user/hadoop/output。如果需要保留旧结果,应把输出路径改成一个尚不存在的新目录,例如/user/hadoop/output2。

🏷️

标签

➡️

继续阅读