• 通过mapReduce实现对单词的统计及遇到的问题点


    一、MapReduce概念 

    MapReduce是一种分布式计算模型,主要用于搜索领域,解决海量数据的计算问题. 由两个阶段组成:Map和Reduce,

    Map阶段对数据集上的独立元素进行指定操作,生成键值对形式中间结果;Reduce则对中间结果中相同的值进行规约,以得到最终的结果

    二、实现对单词的统计

    目标:对文件hello.txt中单词进行统计

    1、定义map方法

    1. public static class MyMapper extends Mapper {
    2. @Override
    3. protected void map(LongWritable k1, Text v1, Context context) throws IOException, InterruptedException {
    4. //接受传入进来的一行文件,把数据类型转成String,并把这行内容按照分割符切割
    5. String[] words = v1.toString().split("");
    6. //遍历数组,每出现一个单词就标志一个数组1,列入<单词,1>
    7. for (String word : words) {
    8. Text k2 = new Text(word);
    9. LongWritable V2 = new LongWritable(1L);
    10. //使用context,把map阶段处理的数据发送给Reduce阶段作为输入数据
    11. context.write(k2, V2);
    12. }
    13. }
    14. }

    2、定义Reduce方法

    1. public static class MyReducer extends Reducer {
    2. @Override
    3. protected void reduce(Text k2, Iterable v2s, Context context) throws IOException, InterruptedException {
    4. //定义一个计数器
    5. long sum = 0L;
    6. //遍历一组迭代器,把每一个数量1累加起来构成了单词的总次数
    7. for (LongWritable v2 : v2s) {
    8. sum += v2.get();
    9. }
    10. Text k3 = k2;
    11. LongWritable v3 = new LongWritable(sum);
    12. context.write(k3, v3);
    13. }
    14. }

    3、组装map方法和Reduce方法

    1. public class WordCountJob {
    2. public static void main(String[] args) {
    3. if (args.length != 2) {
    4. System.exit(100);
    5. }
    6. try {
    7. Configuration conf = new Configuration();
    8. Job job = null;
    9. try {
    10. job = Job.getInstance(conf);
    11. } catch (IOException e) {
    12. e.printStackTrace();
    13. }
    14. //指定job jar运行的主类
    15. job.setJarByClass(WordCountJob.class);
    16. FileInputFormat.setInputPaths(job, new Path(args[0]));
    17. FileOutputFormat.setOutputPath(job, new Path(args[1]));
    18. //指定本次mr所有的mapper reducer类
    19. job.setMapperClass(MyMapper.class);
    20. job.setReducerClass(MyReducer.class);
    21. //指定业务逻辑mapper类的输出key和value的类型
    22. job.setMapOutputKeyClass(Text.class);
    23. job.setMapOutputValueClass(LongWritable.class);
    24. //指定业务逻辑reducer类的输出key和value的类型
    25. job.setOutputKeyClass(Text.class);
    26. job.setOutputValueClass(LongWritable.class);
    27. job.waitForCompletion(true);
    28. } catch (Exception e) {
    29. e.printStackTrace();
    30. }
    31. }

     接下来就可以向集群提交MapReduce任务了 具体的命令是这样的

    hadoop jar db_hadoop-1.0-SNAPSHOT-jar-with-dependencies.jar hadoop.WordCountJob   /test/hello.txt /out

    • hadoop:表示使用hadoop脚本提交任务,其实在这里使用yarn脚本也是可以的
    • jar:表示执行jar包 db_hadoop-1.0-SNAPSHOT-jar-with-dependencies.jar:指定具体的jar包路径信息
    • hadoop.WordCountJob:指定要执行的mapreduce代码的全路径
    • /test/hello.txt:指定mapreduce接收到的第一个参数,代表的是输入路径,这里的输入路径可以直 接指定hello.txt的路径,
    • /out:指定mapreduce接收到的第二个参数,代表的是输出目录,这里的输出目录必须是不存在 的,MapReduce程序在执行之前会检测这个输出目录,如果存在会报错,因为它每次执行任务都需 要一个新的输出目录来存储结果数据

    任务提交到集群上面之后,可以在shell窗口中看到如下日志信息,最终map执行到100%,reduce执行 到100%,说明任务执行成功了。

     当然了,也可以到web界面中查看任务执行情况。

     最终结果:

     

    三、出现的异常及解决方案

    1.Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster

    解决方案:

    在yarn-site.xml添加

     
         
         yarn.application.classpath
         
             /data/soft/hadoop-3.2.0/etc/hadoop,
             /data/soft/hadoop-3.2.0/share/hadoop/common/*,
             /data/soft/hadoop-3.2.0/share/hadoop/common/lib/*,
             /data/soft/hadoop-3.2.0/share/hadoop/hdfs/*,
             /data/soft/hadoop-3.2.0/share/hadoop/hdfs/lib/*,
             /data/soft/hadoop-3.2.0/share/hadoop/mapreduce/*,
             /data/soft/hadoop-3.2.0/share/hadoop/mapreduce/lib/*,
             /data/soft/hadoop-3.2.0/share/hadoop/yarn/*,
             /data/soft/hadoop-3.2.0/share/hadoop/yarn/lib/*
         

         

    2、expected org.apache.hadoop.io.Text,recieved org.apache.hadoop.io.LongWritable

    原因:本应该是:job.setMapOutputValueClass(LongWritable.class);
    误写成job.setMapOutputKeyClass(LongWritable.class);这块需要注意
    
    

  • 相关阅读:
    力扣分发糖果(解析)
    11-定位
    js创建 ajax 过程
    SpringBoot 整合Nacos配置中心
    CentOS 安装Python3
    4.js中next()方法与prev()方法使用
    字节跳动测试岗面试挂在二面,我复盘总结了失败原因,决定再战一次
    【KEIL】keil MDK for ARM无法编译老版本程序问题解决方案
    土壤温湿度传感器
    《vtk9 book》 官方web版 第3章 - 计算机图形基础 (3 / 5)
  • 原文地址:https://blog.csdn.net/libaowen609/article/details/126311577