IDEA 本地远程执行MapReduce(HA集群)程序找不到自定义Mapper与Reduce类

本文主要描述了在IDEA中直接运行MapReduce程序遇到的Nojobjarfileset错误,原因是任务未被打包成Jar提交给ResourceManager。解决方案是使用Maven将项目打包成Jar,并在配置中指定mapreduce.job.jar为相对路径的Jar包。然而,即使解决了Nojobjarfileset问题,仍然可能出现找不到类的错误。文章提供了完整的WordCountDriver代码示例,展示如何设置Job和Mapper、Reducer类。

本文通过IDEA本地执行MR程序的main函数 ,而不是打包成Jar手工放到服务器上运行,发现以下错误提示:No job jar file set,然后在HDFS的/tmp下也没发现有该项目的Jar包,可以推测是任务提交给yarn后,本地并没有将项目打包成Jar提交给ResourceManager,导致找不到Mapper与Reducer类。

所以总体思路就是将项目借助Maven打包成Jar,然后通过添加mapreduce.job.jar的xml配置指定该Jar包在本地的存储路径。注意不能是绝对路径,必须是相对路径(项目文件为根路径),否则还是无法提交成功,但是No job jar file set的提示消失了,却依旧找不到类。

 

package com.atguigu.mapreduce.wordcount;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
在运行 MapReduce 程序时,如果遇到提示“不到符号 Mapper”,这通常路径配置、依赖缺失或代码结构问题有关。以下是几种可能的原因及对应的解决方法: ### 1. 检查 Hadoop 依赖是否正确引入 确保项目中引入了 Hadoop 的核心依赖,尤其是 `hadoop-mapreduce-client-core` 和 `hadoop-common`,这些库包含了 `Mapper` 的定义。如果使用 Maven 构建项目,应在 `pom.xml` 中添加如下依赖: ```xml <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>3.3.6</version> <!-- 请根据实际使用的 Hadoop 版本调整 --> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.3.6</version> </dependency> ``` 如果未正确引入这些依赖,编译器将无法识别 `Mapper` ,导致“不到符号”错误[^3]。 ### 2. 检查 Mapper 的导入语句 确认代码中是否正确导入了 `org.apache.hadoop.mapreduce.Mapper` 。如果误导入了其他同名(如 `org.apache.hadoop.mapred.Mapper`),也会导致编译错误。应确保使用的是 `mapreduce` 包下的 `Mapper` : ```java import org.apache.hadoop.mapreduce.Mapper; ``` ### 3. 检查路径和编译环境 确保在编译和运行 MapReduce 程序时,Hadoop路径已正确设置。可以使用以下命令编译 Java 文件并打包成 JAR: ```bash javac -classpath $(hadoop classpath) -d . WordCountMapper.java jar -cvf wordcount.jar -C . . ``` 如果 `hadoop classpath` 未正确配置,编译时将无法到相关,导致“不到符号”错误[^3]。 ### 4. 检查 Hadoop 安装和共享库 如果 Hadoop 安装存在问题,可能导致程序无法正常加载。可以尝试重新安装或替换 Hadoop 的 `share` 目录,以确保所有必要的和库文件都存在: ```bash sudo rm -r /path/to/hadoop/share cp -ri /home/hadoop/下载/hadoop-3.1.2/share /path/to/hadoop/ ``` 此操作可以解决因共享库缺失或损坏导致的加载问题[^3]。 ### 5. 检查 IDE 配置 如果使用 IntelliJ IDEA 或 Eclipse 等 IDE 进行开发,确保项目的 SDK 和 Hadoop 依赖已正确配置。在 IntelliJ IDEA 中,可以通过以下步骤检查: - 打开 **File > Project Structure > Modules** - 确保 Hadoop 的 JAR 文件已添加到 **Dependencies** 选项卡中 - 在 **Sources** 选项卡中确认输出路径和资源路径设置正确 ### 示例代码:WordCountMapper 以下是一个典型的 `Mapper` 实现,用于词频统计: ```java import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; public class WordCountMapper extends Mapper<Text, Text, Text, IntWritable> { @Override protected void map(Text key, Text value, Context context) throws IOException, InterruptedException { String[] words = value.toString().split(" "); for (String word : words) { context.write(new Text(word), new IntWritable(1)); } } } ``` ### 6. 检查 Hadoop 版本兼容性 不同版本的 Hadoop 可能存在 API 差异,确保代码所使用的 Hadoop 版本兼容。例如,Hadoop 2.x 和 Hadoop 3.x 在某些和方法上可能存在差异,需查阅对应版本的文档进行适配。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值