解决Hadoop命令方式运行WordCount异常Class WordCount$XXXMapper not found

本文介绍了一个基于Hadoop的WordCount实现案例,通过Java代码展示了如何进行文本单词计数,包括Mapper和Reducer的设计,以及如何编译和运行程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WordCount.java 注意把job.setJarByClass(WordCount.class);改成job.setJar("wc.jar");,解决类找不到的问题

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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;

public class WordCount {

  public static class TokenizerMapper
       extends Mapper<Object, Text, Text, IntWritable>{

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {
      StringTokenizer itr = new StringTokenizer(value.toString());
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);
      }
    }
  }

  public static class IntSumReducer
       extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values,
                       Context context
                       ) throws IOException, InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
    }
  }

  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "word count");
    //job.setJarByClass(WordCount.class);
    job.setJar("wc.jar");
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

使用hadoop命令进行编译和执行

[hadoop@nn01 ~]$ mkdir demo
[hadoop@nn01 ~]$ cd demo
[hadoop@nn01 demo]$ mkdir input
[hadoop@nn01 demo]$ cd input/
[hadoop@nn01 input]$ echo "hello hadoop hello world" > 1.txt
[hadoop@nn01 input]$ echo "hello zheng from hadoop" > 2.txt
[hadoop@nn01 ~]$ hadoop fs -put ./demo /
[hadoop@nn01 hadoop-2.9.0]$ bin/hadoop com.sun.tools.javac.Main WordCount.java
[hadoop@nn01 hadoop-2.9.0]$ jar cf wc.jar WordCount*.class
[hadoop@nn01 hadoop-2.9.0]$ bin/hadoop jar wc.jar WordCount /demo/input /demo/output
执行结果


<think>好的,我现在要解决用户的问题:在Hadoop 3.3.6中遇到hadoop-mapreduce-examples.jar文件不存在或不是一个普通文件的问题。首先,我需要回忆之前与用户的对话历史。用户之前询问了如何启动YARN进程来检验History功能,我给出了步骤,其中包括提交测试作业时使用hadoop-mapreduce-examples.jar。现在用户遇到了这个文件缺失的问题,可能是因为他们按照之前的步骤操作时发现这个jar包不存在。 首先,我需要确定这个jar包在Hadoop中的位置。通常,Hadoop安装包中会包含示例jar文件,但可能用户安装的是二进制分发包而不是源码包,或者安装过程中某些步骤遗漏了。Hadoop 3.3.6版本的结构可能与旧版本不同,需要确认默认路径是否正确。 接下来,用户提到的错误信息是文件不存在或不是普通文件,这可能意味着路径错误,或者文件确实不存在,或者存在符号链接问题。我需要考虑几种可能性:jar包是否被误删,安装包是否不完整,或者环境变量配置错误导致系统不到该文件。 解决方案方面,第一步应该是指导用户查该jar包的位置,使用find命令Hadoop安装目录下搜索。如果到,可能需要检查Hadoopclasspath配置是否正确,或者使用绝对路径来运行示例程序。如果不到,可能需要重新生成示例jar,比如通过编译源码,或者从其他来源获取。 另外,用户可能没有正确安装Hadoop的示例部分,某些Hadoop发行版可能将示例jar单独打包,需要额外下载。或者用户可能误删了该文件,这时候需要重新安装相关组件。 还需要考虑到用户可能对Hadoop的目录结构不熟悉,所以需要给出具体的路径示例,比如在Hadoop安装目录下的share/hadoop/mapreduce目录中查。同时,用户可能不知道如何编译源码生成jar包,因此需要详细步骤,比如使用Maven命令进行编译。 最后,需要提醒用户检查文件权限,确保jar文件可读,并确认文件类型是否正确,避免符号链接导致的问题。如果所有方法都无效,建议用户重新安装Hadoop或联系社区支持。 总结下来,我需要分步骤引导用户检查文件是否存在,提供不同情况下的解决方案,并确保用户能够理解每一步的操作。同时,要预见到用户可能遇到的常见问题,比如路径错误或安装不完整,并给出对应的解决方法。</think>针对Hadoop 3.3.6中`hadoop-mapreduce-examples.jar`文件缺失或无效的问题,请按以下步骤排查解决: --- ### 一、定位文件路径 #### 1. 验证默认安装位置 Hadoop 3.x版本的示例程序通常位于以下路径: ```bash $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar ``` 可通过以下命令全局搜索: ```bash find / -name "hadoop-mapreduce-examples*.jar" 2>/dev/null ``` #### 2. 检查安装完整性 若未到文件,可能是以下原因: - **安装包类型错误**:确认下载的是**二进制发行版**(文件名含`-bin`),而非源码包 - **文件被误删**:检查`$HADOOP_HOME/share/hadoop/mapreduce/`目录是否存在 --- ### 二、解决方案 #### 方案1:手动生成示例JAR(推荐) 通过源码编译生成: ```bash # 进入Hadoop源码目录 cd hadoop-3.3.6-src/hadoop-mapreduce-project # 编译示例模块 mvn clean package -DskipTests -Pdist # 生成的JAR位于: target/hadoop-mapreduce-examples-3.3.6.jar ``` #### 方案2:从官方资源补全 直接从Apache仓库下载对应版本: ```bash wget https://repo.maven.apache.org/maven2/org/apache/hadoop/hadoop-mapreduce-examples/3.3.6/hadoop-mapreduce-examples-3.3.6.jar ``` #### 方案3:符号链接修复 若文件类型异常(如误创建为目录): ```bash rm -rf hadoop-mapreduce-examples-3.3.6.jar # 删除异常文件 ln -s $HADOOP_HOME/share/hadoop/mapreduce/client/hadoop-mapreduce-client-examples-3.3.6.jar hadoop-mapreduce-examples.jar ``` --- ### 三、验证修复 运行WordCount测试: ```bash hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /input /output ``` --- ### 关键配置检查 1. **环境变量**:确认`$HADOOP_HOME`指向正确路径 2. **文件权限**:确保JAR文件有读取权限 ```bash chmod +r hadoop-mapreduce-examples-3.3.6.jar ``` 3. **安装日志**:检查初始安装时的`install.log`是否有报错记录 --- ### 附:Hadoop 3.x文件结构对比 | 文件类型 | 标准路径 | |-------------------|----------------------------------------| | 核心JAR | `$HADOOP_HOME/share/hadoop/common/` | | MapReduce示例JAR | `$HADOOP_HOME/share/hadoop/mapreduce/` | | YARN组件 | `$HADOOP_HOME/share/hadoop/yarn/` | --- ### 相关问题 1. 如何通过Maven自定义编译Hadoop特定模块? 2. Hadoop二进制包与源码包的主要区别是什么? 3. 如何修复Hadoop环境变量配置错误导致的ClassNotFound异常
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值