Hadoop单机WordCount实验踩坑全记录|Ubuntu虚拟机 MapReduce词频统计
环境:VirtualBox + Ubuntu + Hadoop2.x 实验目标:对文本做单词计数,输出词频结果,复刻课堂PPT示例 输入文本
I love Hadoop I love Spark Spark is fast Hadoop is good预期输出
Hadoop 2 I 2 Spark 2 fast 1 good 1 is 2 love 2一、两种实现方案
方案1:手写WordCount.java(踩坑超多,不推荐新手)
编写Java WordCount代码,编译、打包jar,提交MapReduce任务。
核心报错1:cannot find symbol IntWritable / Text
现象:javac编译代码,提示找不到Hadoop相关类。 原因:编译命令没有正确加载Hadoop的jar类库。
✅解决:编译时指定Hadoop classpath
javac -cp `hadoop classpath` WordCount.java⚠️注意:
`是左上角波浪键反引号,不是单引号。
核心报错2:Connection refused: localhost:9000
现象:执行hdfs命令提示连接被拒绝。 原因:HDFS的NameNode没有启动。
✅解决:启动Hadoop集群
# 启动HDFS start-dfs.sh # 启动YARN start-yarn.sh # 查看进程,确认NameNode、DataNode启动成功 jps补充:虚拟机每次重启后,都要重新执行
start-dfs.sh,Hadoop不会开机自启。 首次使用需要格式化HDFS(只执行一次!多次格式化会损坏数据)
hdfs namenode -format核心报错3:Input path does not exist: hdfs://localhost:9000/input
现象:任务提交失败,提示HDFS路径不存在。 原因:HDFS中/input目录不存在,或者没有上传输入文本。
✅解决:创建目录 + 上传本地文件到HDFS
# 创建HDFS目录 hdfs dfs -mkdir -p /input # 把本地input.txt上传到HDFS hdfs dfs -put input.txt /input # 校验文件是否上传成功 hdfs dfs -ls /input核心报错4:YARN任务失败 HADOOP_MAPRED_HOME占位符
现象:MapReduce任务提交后运行失败,日志提示HADOOP_MAPRED_HOME=${full path...}原因:mapred-site.xml配置文件没有替换占位符,YARN找不到Hadoop安装目录。
✅解决:修改mapred-site.xml
<property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value> </property>修改配置后重启YARN:
stop-yarn.sh start-yarn.sh方案2:Hadoop自带WordCount示例(推荐!避坑首选,不用写Java)
Hadoop内置WordCount的jar包,不用写代码、不用编译Java,一条命令直接跑实验,完美适配课程演示。
完整执行步骤
- 本地创建输入文件
nano input.txt粘贴文本:
I love Hadoop I love Spark Spark is fast Hadoop is goodCtrl+O保存,回车;Ctrl+X退出编辑器。
- 上传文件至HDFS
hdfs dfs -mkdir -p /input hdfs dfs -put input.txt /input- 删除旧输出目录(必须执行,输出目录不能预先存在)
hdfs dfs -rm -r /output- 执行自带WordCount任务
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples*.jar wordcount /input /output✨兜底命令(绕过YARN,本地执行,不用修改mapred-site.xml,强烈推荐)
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples*.jar wordcount -Dmapreduce.framework.name=local /input /output- 查看词频统计结果
hdfs dfs -cat /output/part-r-00000二、实验总结&避坑清单
- HDFS输出目录
/output不能提前存在,每次跑任务前必须删除,否则任务报错。 - 每次重启虚拟机,需要手动
start-dfs.sh启动HDFS,否则9000端口连接拒绝。 - 手写Java代码编译麻烦,新手课程实验优先使用Hadoop自带examples,快速拿到结果。
- YARN相关环境变量配置出错会导致MapReduce任务崩溃,遇到YARN报错可以直接切换本地运行模式绕开。
- 区分【本地Linux文件】和【HDFS里的文件】:
ls看本地;hdfs dfs -ls看HDFS分布式文件。
三、学习感悟
这次Hadoop MapReduce词频实验踩了一连串经典坑:集群未启动、HDFS文件不存在、Java类库缺失、YARN环境配置占位符错误。
很多报错不是代码逻辑问题,而是分布式环境配置、文件系统的区别。Hadoop的难点不在写业务代码,而在环境的调试。自带示例jar包非常适合课程快速验证实验效果,节省大量编译调试时间。
[TOC] # Hadoop单机WordCount实验踩坑全记录|Ubuntu虚拟机 MapReduce词频统计 > 环境:VirtualBox + Ubuntu + Hadoop2.x > 实验目标:对文本做单词计数,输出词频结果,复刻课堂PPT示例 > 输入文本I love Hadoop I love Spark Spark is fast Hadoop is good
预期输出Hadoop 2 I 2 Spark 2 fast 1 good 1 is 2 love 2
## 一、两种实现方案 ### 方案1:手写WordCount.java(踩坑超多,不推荐新手) 编写Java WordCount代码,编译、打包jar,提交MapReduce任务。 #### 核心报错1:`cannot find symbol IntWritable / Text` 现象:javac编译代码,提示找不到Hadoop相关类。 原因:编译命令没有正确加载Hadoop的jar类库。 ✅解决:编译时指定Hadoop classpath ```bash javac -cp `hadoop classpath` WordCount.java⚠️注意:
`是左上角波浪键反引号,不是单引号。
核心报错2:Connection refused: localhost:9000
现象:执行hdfs命令提示连接被拒绝。 原因:HDFS的NameNode没有启动。
✅解决:启动Hadoop集群
# 启动HDFS start-dfs.sh # 启动YARN start-yarn.sh # 查看进程,确认NameNode、DataNode启动成功 jps补充:虚拟机每次重启后,都要重新执行
start-dfs.sh,Hadoop不会开机自启。 首次使用需要格式化HDFS(只执行一次!多次格式化会损坏数据)
hdfs namenode -format核心报错3:Input path does not exist: hdfs://localhost:9000/input
现象:任务提交失败,提示HDFS路径不存在。 原因:HDFS中/input目录不存在,或者没有上传输入文本。
✅解决:创建目录 + 上传本地文件到HDFS
# 创建HDFS目录 hdfs dfs -mkdir -p /input # 把本地input.txt上传到HDFS hdfs dfs -put input.txt /input # 校验文件是否上传成功 hdfs dfs -ls /input核心报错4:YARN任务失败 HADOOP_MAPRED_HOME占位符
现象:MapReduce任务提交后运行失败,日志提示HADOOP_MAPRED_HOME=${full path...}原因:mapred-site.xml配置文件没有替换占位符,YARN找不到Hadoop安装目录。
✅解决:修改mapred-site.xml
<property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value> </property>修改配置后重启YARN:
stop-yarn.sh start-yarn.sh方案2:Hadoop自带WordCount示例(推荐!避坑首选,不用写Java)
Hadoop内置WordCount的jar包,不用写代码、不用编译Java,一条命令直接跑实验,完美适配课程演示。
完整执行步骤
- 本地创建输入文件
nano input.txt粘贴文本:
I love Hadoop I love Spark Spark is fast Hadoop is goodCtrl+O保存,回车;Ctrl+X退出编辑器。
- 上传文件至HDFS
hdfs dfs -mkdir -p /input hdfs dfs -put input.txt /input- 删除旧输出目录(必须执行,输出目录不能预先存在)
hdfs dfs -rm -r /output- 执行自带WordCount任务
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples*.jar wordcount /input /output✨兜底命令(绕过YARN,本地执行,不用修改mapred-site.xml,强烈推荐)
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples*.jar wordcount -Dmapreduce.framework.name=local /input /output- 查看词频统计结果
hdfs dfs -cat /output/part-r-00000