一、前置准备(必做)
1. 环境要求
- 已安装 JDK 8(Hadoop 3.x 推荐,与你项目依赖的 Hadoop 3.3.6 兼容);
- 本地或集群有 Hadoop 环境(本地模式适合测试,集群模式适合生产);
- IDEA 已安装 Maven 插件(项目用 Maven 管理依赖,默认已装)。
2. 项目依赖确认(关键!避免 ClassNotFound)
确保 pom.xml 中已引入 Hadoop 核心依赖(之前的代码已包含,重点检查):
<dependencies>
<!-- Hadoop MapReduce 核心依赖 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.3.6</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>3.3.6</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-jobclient</artifactId>
<version>3.3.6</version>
</dependency>
<!-- HDFS 依赖(若输入/输出路径是 HDFS 需添加) -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.3.6</version>
</dependency>
</dependencies>- 右键项目 →
Maven→Reload Project,确保依赖下载完成(无红色下划线)。
3. Windows 额外配置(避坑!)
Hadoop 在 Windows 上运行需补充 winutils.exe(模拟 Linux 系统的 shell 命令),否则会报错 Could not locate executable null\bin\winutils.exe:
下载对应 Hadoop 版本的 winutils:
推荐地址:
winutils-master
(找到
hadoop-3.3.6/bin目录);
解压 winutils 到本地目录(如
D:\hadoop-3.3.6\bin);配置环境变量:
- 新增系统变量
HADOOP_HOME,值为D:\hadoop-3.3.6(bin 目录的上一级); - 在
Path变量中添加%HADOOP_HOME%\bin;
- 新增系统变量
重启 IDEA(让环境变量生效)。
二、两种运行模式(本地模式 vs 集群模式)
模式 1:本地模式(推荐测试用,无需集群)
本地模式下,MapReduce 程序在本地 JVM 中运行,输入 / 输出路径为本地文件系统(如 D:\input),无需启动 Hadoop 集群,适合开发调试。
步骤 1:准备输入数据
在本地新建输入目录(如
D:\hadoop-input),放入测试日志文件(CSV 格式,如test.log);日志示例(符合你之前的筛选逻辑,日期字段含 2024/1 或 2024/2):
plaintext1,电影A,张三,观看,2024/01/15 10:30,五星 2,电影B,李四,评论,2024/02/20 14:15,四星 3,电影C,张三,收藏,2024/01/25 09:45,五星确保输出目录不存在(如
D:\hadoop-output,Hadoop 禁止覆盖已有目录)。
步骤 2:配置 IDEA 运行参数
找到 MapReduce 程序的 主类(如你之前的
race.LogCount,含main方法的类);右键主类 →
Run 'LogCount.main()'→ 首次运行会失败(无参数),需配置运行参数:点击 IDEA 右上角的运行配置下拉框 →
Edit Configurations...;在弹出的窗口中,找到
Program arguments(程序参数)输入框;输入 输入路径 和 输出路径(本地路径格式,用空格分隔):
plaintextD:\hadoop-input D:\hadoop-output(若路径含空格,需用引号包裹,如
"D:\hadoop input");
点击
Apply→OK。
步骤 3:解决日志冲突(之前的报错问题)
若运行时出现 SLF4J: Class path contains multiple SLF4J bindings,按以下方式排除冲突:
右键项目 →
Maven→Show Dependencies;搜索
slf4j-log4j12,右键该依赖 →Exclude(排除冲突的日志绑定);在
src/main/resources目录下新建log4j.properties(日志配置文件),内容:propertieslog4j.rootLogger=INFO, CONSOLE log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n
步骤 4:运行程序并查看结果
- 点击 IDEA 右上角的
Run按钮(绿色三角),程序开始运行; - 查看运行日志:控制台无报错,且显示
Job completed successfully表示运行成功; - 查看输出结果:打开
D:\hadoop-output目录,核心文件:part-r-00000:Reducer 0 的输出(1 月数据,对应自定义分区器);part-r-00001:Reducer 1 的输出(2 月数据);_SUCCESS:任务成功标识文件(空文件)。
模式 2:集群模式(连接远程 Hadoop 集群)
若需将程序提交到远程 Hadoop 集群运行(输入 / 输出路径为 HDFS),需额外配置集群连接信息。
步骤 1:配置 Hadoop 集群信息
复制集群的
core-site.xml、hdfs-site.xml文件(从集群主节点的$HADOOP_HOME/etc/hadoop目录拷贝);将这两个文件粘贴到项目的
src/main/resources目录下(IDEA 会自动加载配置);core-site.xml关键配置(示例):xml<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://集群主节点IP:9000</value> <!-- 集群HDFS地址 --> </property> </configuration>
确保本地能访问集群(关闭集群防火墙,或配置端口映射)。
步骤 2:配置运行参数(HDFS 路径)
打开运行配置(
Edit Configurations...);在
Program arguments中输入 HDFS 路径(格式:hdfs://集群IP:9000/输入路径hdfs://集群IP:9000/输出路径):plaintexthdfs://192.168.1.100:9000/user/input hdfs://192.168.1.100:9000/user/output- 注意:HDFS 输出路径必须不存在(可通过
hdfs dfs -rm -r /user/output删除已有路径)。
- 注意:HDFS 输出路径必须不存在(可通过
步骤 3:配置集群用户(避免权限问题)
Windows 下默认用户可能无集群 HDFS 写入权限,需指定集群用户:
打开运行配置 →
VM options(VM 参数)输入框;输入:
plaintext-DHADOOP_USER_NAME=hadoop # hadoop 是集群的 HDFS 超级用户(根据实际集群用户修改)点击
Apply→OK。
步骤 4:运行并查看集群结果
点击
Run运行程序,控制台会显示任务提交到集群的日志;可通过集群 Web UI(
http://集群主节点IP:8088)查看任务状态;任务完成后,通过 HDFS 命令查看结果:
bashhdfs dfs -cat /user/output/part-r-00000
三、常见问题排查(避坑指南)
1. 运行时报 ClassNotFoundException: org.apache.hadoop.conf.Configuration
- 原因:Maven 依赖未下载完成,或依赖范围错误;
- 解决方案:
- 右键项目 →
Maven→Reload Project,等待依赖下载; - 检查
pom.xml中依赖的<scope>标签,若为provided需删除(provided表示集群已提供,本地运行需加载)。
- 右键项目 →
2. Windows 下报错 Could not locate executable null\bin\winutils.exe
- 原因:未配置
HADOOP_HOME或 winutils 路径错误; - 解决方案:
- 重新检查
HADOOP_HOME环境变量(值为 winutils 的上一级目录,如D:\hadoop-3.3.6); - 确保
Path中添加了%HADOOP_HOME%\bin,且 bin 目录下有winutils.exe; - 重启 IDEA 生效。
- 重新检查
3. 输出目录已存在报错 org.apache.hadoop.mapred.FileAlreadyExistsException
- 原因:Hadoop 禁止覆盖已有输出目录(避免数据丢失);
- 解决方案:
- 删除本地输出目录(如
D:\hadoop-output); - 集群模式下执行
hdfs dfs -rm -r /user/output删除 HDFS 输出路径。
- 删除本地输出目录(如
4. 集群模式下报错 Permission denied: user=XXX, access=WRITE
- 原因:本地用户无集群 HDFS 写入权限;
- 解决方案:
- 在运行配置的
VM options中添加-DHADOOP_USER_NAME=集群超级用户(如hadoop); - 或在集群中给本地用户授权:
hdfs dfs -chmod 777 /user。
- 在运行配置的
5. 程序运行无结果(输出文件为空)
- 原因:输入数据不符合筛选条件(如日期字段不是 2024/1 或 2024/2);
- 解决方案:
- 检查输入日志的日期格式(确保
arr[4]是日期字段,且包含2024/1或2024/2); - 在 Mapper 中添加日志打印(
System.out.println("当前行:" + line)),查看是否读取到数据。
- 检查输入日志的日期格式(确保
四、总结
IDEA 运行 MapReduce 程序的核心流程:
- 配置依赖(确保 Hadoop 核心依赖齐全);
- 准备输入数据(本地 / 集群路径);
- 设置运行参数(输入 / 输出路径、VM 参数);
- 解决兼容问题(Windows 需 winutils,日志冲突需排除依赖)。
本地模式适合开发调试(快速验证逻辑),集群模式适合大规模数据处理。按以上步骤操作,即可在 IDEA 中顺利运行你的日志统计 MapReduce 程序!