hadoop mapreduce wordcount识别字符 idea

本文详细介绍了一个典型的Hadoop WordCount程序实现,包括Mapper和Reducer的编写,以及运行过程中可能遇到的问题及其解决方法。

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

这个代码,大家刚接触maoreduce的时候一定会遇到,这是一个比较典型的程序,具体的我都在代码中有注释,其中需要注意的地方就是 hadoop在每次产生输出以后,output的文件夹不能存在,否则会报错,其中我在运行的时候遇到了一些其他的错误,这里简单说一下如果报错提示 一直在connect hdfs连接不上,那么可能是你hadoop的防火墙没有关闭,还有可能是ssh的原因。如果报错是权限问题 那么 你可以更改一下权限 hadoop fs -chmod -R 777 / 这个来更改hadoop下全部的文件权限。 其中输入输出我是写死的,其实这个你可以在idea下 runconfigure下更改,在program arguments 里面加入两个路径记得中间空格隔开就可以。 如果还有什么问题,可以下面评论,欢迎交流

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.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class wordcount {
    public static class TokenizerMapper
            extends Mapper<Object, Text, Text, IntWritable>{
        //四个参数,这个四个参数 k1,v1 k2 v2 其中k2 v2 是你要写入的内容,所以如果你是想两个字符串的话,应该是 Text Text 其中k2 v2 也是reduce 参数中的两个
        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);//写入参数 k2 v2 其中word单词作为key value为数字1 表示出现过一次
            }
        }
    }

    public static class IntSumReducer
            extends Reducer<Text,IntWritable,Text,IntWritable> {
        private IntWritable result = new IntWritable();
        //这里的四个参数 k2 v2 k3 v3 这里如同上面的map 这四个参数前两个是你传入的 后两个是你要传出的数据类型
        public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) { // 相同key 也就是相同的单词
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result);//经过处理后,讲单词作为key 后面的result就是统计后的单词数
        }
    }
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "word count"); //创建job 
        job.setJarByClass(wordcount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class); //combiner 这个是在map 和 reduce之间,这个用来优化map分开后的数据,有没有combiner对reduce的结果应该没有影响。
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);//设置输出的类型
        job.setOutputValueClass(IntWritable.class); 
        FileInputFormat.addInputPath(job, new Path("hdfs://192.168.200.132:9000/home/fym/input"));//  获取源数据 得到输入数据
        FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.200.132:9000/home/fym/output")); // 讲数据导出在这个文件夹下
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

 

### 配置和运行 MapReduce 程序 要在 IntelliJ IDEA 中配置和运行 MapReduce 程序,可以按照以下方法操作: #### 1. 开发环境准备 确保已安装必要的软件组件,包括 JDK、Maven 和 Hadoop SDK。例如,在引用中提到的环境中,使用的是 JDK 1.8、IntelliJ IDEA 2018.1、Hadoop 2.6.0 和 Maven 3.5.4[^3]。 #### 2. 创建 Maven 项目 在 IntelliJ IDEA 中创建一个新的 Maven Java 项目,并完成基本配置(如设置 JDK 版本)。此过程可以通过 IDE 的向导快速完成。 #### 3. 添加依赖项 编辑 `pom.xml` 文件以引入 Hadoop 相关依赖库。以下是典型的依赖声明示例: ```xml <dependencies> <!-- Hadoop Core --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>2.6.0</version> </dependency> </dependencies> ``` 这些依赖允许开发者编写基于 HadoopMapReduce 应用程序并模拟其执行行为。 #### 4. 编写 MapReduce 程序 定义 Mapper 和 Reducer 类来实现业务逻辑。下面是一个经典的 WordCount 示例代码片段: ```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<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); @Override protected void map(Object key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); for (String token : line.split("\\s+")) { word.set(token); context.write(word, one); } } } ``` 上述代码实现了将输入文本按单词分割的功能,并为每个单词计数一次。 #### 5. 测试与调试 利用 Configuration 类加载默认参数或自定义参数文件,从而支持本地模式下的测试工作流。例如: ```java Configuration conf = new Configuration(); conf.set("fs.defaultFS", "file:///"); // 设置本地文件系统路径作为存储介质 Job job = Job.getInstance(conf, "Word Count"); job.setOutputKeyClass(Text.class); // 输出键类型指定为字符串形式 job.setOutputValueClass(IntWritable.class); // 值则采用整型表示法 // 更多配置... if (!job.waitForCompletion(true)) { System.exit(-1); } // 启动作业等待结束状态返回 ``` 以上脚本展示了如何初始化一个标准的任务实例以及关联相应的 I/O 数据结构[^1]。 #### 6. 打包与部署 当确认无误后可借助插件功能一键生成 JAR 包文件以便上传至远程服务器或者直接集成进生产流水线当中去[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值