Hadoop学习总结(MapRdeuce的词频统计)

2024-07-06 1948阅读

      MapRdeuce编程示例——词频统计

一、MapRdeuce的词频统计的过程

Hadoop学习总结(MapRdeuce的词频统计)

二、编程过程

      以下操作是对报错进行改进,让人能看出代码出现什么错误

  •  *对pom.xml添加内容

            
                org.slf4j
                slf4j-log4j12
                1.7.30
            
        
        
        
            org.apache.maven.plugins
            maven-compiler-plugin
            3.6.1
            
                1.8
                1.8
            
        
        
        
            maven-assembly-plugin
            
                
                    jar-with-dependencies
                
            
            
                
                    make-assembly
                    package
                    
                        single
                    
                
            
        
        
        

     在这个位置进行添加

    Hadoop学习总结(MapRdeuce的词频统计)

    *在resources创建文件

    在resources创建文件log4j.properties

    Hadoop学习总结(MapRdeuce的词频统计)

    添加以下内容

    log4j.rootLogger=INFO, stdout
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
    log4j.appender.logfile=org.apache.log4j.FileAppender
    log4j.appender.logfile.File=target/spring.log
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
    log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

    Hadoop学习总结(MapRdeuce的词频统计)

    1、Mapper 组件

    WordcountMapper.java

    package com.itcast.mrdemo;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
    import java.io.IOException;
    /**
     * Map 需要指定四个泛型,用来限定输入和输出的 key 和 value 的类型
     *
     * hadoop 有自己的数据类型,不使用 java 的数据类型,对应的 java 类型名字后面 + Writable 就是 hadoop 类型
     * String 除外,String 对于的 hadoop 类型叫做 Text
     *  
     * */
    public class WordcountMapper extends Mapper {
        //重写Ctrl+o
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            /**
             * 1、把一行字符串拆分成单词 "hello java"
             * 2、把单词、数字每一个按照 map 规定的格式输出
             */
            // 把 hadoop 类型转换为 java 类型(接收传入进来的一行文本,把数据类型转换为 String 类型)
            String line = value.toString();
            // 把字符串拆分为单词
            String[] words = line.split(" ");
            //使用 for 循环把单词数组胡每个单词输出
            for (String word : words){
                context.write(new Text(word), new IntWritable(1));
            }
        }
    }
    

    2、Reducer 组件

    WordcountReducer.java

    package com.itcast.mrdemo;
    import org.apache.hadoop.io.IntWritable;
    //import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    import java.io.IOException;
    /**
     * Reduce 需要指定四个泛型,用来限定输入和输出的 key 和 value 的类型
     * 1、Map 的输出就是 Reduce 的输入
     * 2、Reduce 的输出是 
     */
    public class WordcountReducer extends Reducer {
        @Override
        protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable value : values){
                sum ++;
            }
            context.write(key,new IntWritable(sum));
        }
    }
    

    3、MapRdeuce 运行模式

    MapRdeuce 程序的运行模式主要有两种

    (1)本地运行模式

          在当前的开发环境模拟 MapRdeuce 执行环境,处理的数据及输出结果在本地操作系统WordcountDriver.java

    package com.itcast.mrdemo;
    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.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import java.io.IOException;
    public class WordcountDriver{
        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
            //通过 Job 来封装本次 MR 的相关信息
            Configuration conf = new Configuration();
            //System.setProperty("HADOOP_USER_NAME","root");
            //配置 MR 运行模式,使用 local 表示本地模式,可以省略
            conf.set("mapreduce.framework.name","local");
            Job job = Job.getInstance(conf);
            //指定 MR Job jar 包运行主类
            job.setJarByClass(WordcountDriver.class);
            //指定本次 MR 所有的 Mapper Reducer 类
            job.setMapperClass(WordcountMapper.class);
            job.setReducerClass(WordcountReducer.class);
            //设置业务逻辑 Mapper 类的输出 key 和 value 的数据类型
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
            //设置业务逻辑 Reducer 类的输出 key 和 value 的数据类型
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            //使用本地模式指定处理的数据所在的位置
            FileInputFormat.setInputPaths(job,"D:/homework2/Hadoop/mr/input");
            //使用本地模式指定处理完成之后的结果所保存的位置
            FileOutputFormat.setOutputPath(job, new Path("D:/homework2/Hadoop/mr/output"));
            //提交程序并且监控打印程序执行情况
            boolean res = job.waitForCompletion(true);
            //执行成功输出 0 ,不成功输出 1
            System.exit(res ? 0 : 1);
        }
    }
    

    运行结果为:

    Hadoop学习总结(MapRdeuce的词频统计)

    (2)集群运行模式

    • *在HDFS中创建文件

      在HDFS中的/input目录下有word.txt文件,且文件中编写有内容(内容随意编写)

      Hadoop学习总结(MapRdeuce的词频统计)

      • *对 WordcountDriver.java 修改

         修改WordcountDriver.java中的路径为HDFS上的路径

        package com.itcast.mrdemo;
        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.lib.input.FileInputFormat;
        import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
        import java.io.IOException;
        public class WordcountDriver{
            public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
                //通过 Job 来封装本次 MR 的相关信息
                Configuration conf = new Configuration();
                //System.setProperty("HADOOP_USER_NAME","root");
                //配置 MR 运行模式,使用 local 表示本地模式,可以省略
                conf.set("mapreduce.framework.name","local");
                Job job = Job.getInstance(conf);
                //指定 MR Job jar 包运行主类
                job.setJarByClass(WordcountDriver.class);
                //指定本次 MR 所有的 Mapper Reducer 类
                job.setMapperClass(WordcountMapper.class);
                job.setReducerClass(WordcountReducer.class);
                //设置业务逻辑 Mapper 类的输出 key 和 value 的数据类型
                job.setMapOutputKeyClass(Text.class);
                job.setMapOutputValueClass(IntWritable.class);
                //设置业务逻辑 Reducer 类的输出 key 和 value 的数据类型
                job.setOutputKeyClass(Text.class);
                job.setOutputValueClass(IntWritable.class);
                //使用本地模式指定处理的数据所在的位置
                FileInputFormat.setInputPaths(job,"/input");
                //使用本地模式指定处理完成之后的结果所保存的位置
                FileOutputFormat.setOutputPath(job, new Path("/output"));
                //提交程序并且监控打印程序执行情况
                boolean res = job.waitForCompletion(true);
                //执行成功输出 0 ,不成功输出 1
                System.exit(res ? 0 : 1);
            }
        }
        
        • *打包成jar包

           双击,进行打包

          Hadoop学习总结(MapRdeuce的词频统计)

           结果出现以下字段则打包成功

          Hadoop学习总结(MapRdeuce的词频统计)

          • *上传到虚拟机的home目录下

            右键打开

            Hadoop学习总结(MapRdeuce的词频统计)

            重命名为wc 

            Hadoop学习总结(MapRdeuce的词频统计)

             随便复制到一个目录下

            Hadoop学习总结(MapRdeuce的词频统计)

            使用远程连接工具(Xshell或者SecurityCRT)进行上传

            Hadoop学习总结(MapRdeuce的词频统计)

            • *进行集群运行

              进入home目录

              cd /home
              ll

              Hadoop学习总结(MapRdeuce的词频统计)

               在 WordcountDriver.java下复制路径

              Hadoop学习总结(MapRdeuce的词频统计)

              hadoop jar wc.jar com.itcast.mrdemo.WordcountDriver

              运行结果 

              Hadoop学习总结(MapRdeuce的词频统计)

              • *查看HDFS 集群

                Hadoop学习总结(MapRdeuce的词频统计)

                进行查看

                Hadoop学习总结(MapRdeuce的词频统计)

                      集群运行成功

                4、运行前准备操作

                现在目录下创建一个文本

                Hadoop学习总结(MapRdeuce的词频统计)

                编写内容(随意编写)

                Hadoop学习总结(MapRdeuce的词频统计)

                5、Error while running command to get file permissions : java.io.IOException: (null) entry in command string: null ls -F D:\homework2\Hadoop\mr\input\word.txt

                出现以下错误

                Hadoop学习总结(MapRdeuce的词频统计)

                解决方法一

                下载winutils.exe和hadoop.dll放到C:\Windows\System32

                链接:https://pan.baidu.com/s/1XwwUD9j3YT2AJMUNHmyzhw 

                提取码:q7i7

                解决方法二

                输入指定文本路径

                Hadoop学习总结(MapRdeuce的词频统计)

                然后运行

                解决方法三

                //{input2\*} 表示读取该路径下所有的文件

                Hadoop学习总结(MapRdeuce的词频统计)

                然后运行

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]