• 初学MapReduce离线计算(eclipse实现)


    一、导入jia包

    需要导入common,hdfs以及mapreduce下的所有jar包

    二、代码实现诗词出现字数统计

    先在桌面上创建一个文本文档(明月几时有.txt),内容为一首诗词

    在eclipse新建三个类:WordCountMapper、WordCountReducer、WordCountDriver。

    在我们用MAPREDUCE编程的时候 MAPREDUCE有一套自己的数据类型
    字符串 Text 提供Java的数据类型可以和MapReduce的类型做一个数据转换
    整数 IntWritable ShortWritable LongWritbale
    浮点数 FloatWritable DoubleWritable
    字符串类型 Text Text.toString转换为字符串 new Text("") 把字符串转换为Text
    整数类型 IntWritable get() 转换为int new IntWritable(1) 把Java类型转换为MapReduce的类型

    WordCountMapper类:

    Map类会输出成一个文件 temp.html
    Map类 规范 必须得 继承Mapper类 并且重写mapper方法

    Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>:
    KEYIN :表示我们当前读取一个文件[xxx.txt] 读到多少个字节了 数量词
    VALUEIN :表示我们当前读的是文件的多少行 逐行读取 表示我们读取的一行文字
    KEYOUT: 我们执行MAPPER之后 写入到文件中KEY的类型
    VALUEOUT :我们执行MAPPER之后 写入到文件中VALUE的类型

    package com.blb.core;
    
    import java.io.IOException;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
    
    public class WordCountMapper extends Mapper<LongWritable,Text,Text,IntWritable>
    {
    
    
        protected void map(LongWritable key,Text value,Mapper<LongWritable,Text,Text,IntWritable>.Context context) throws IOException, InterruptedException
        {
            String replace = value.toString().replace(" ", "");
            char[] array=replace.toCharArray();
            for (char c : array) {
                context.write(new Text(c+""), new IntWritable(1));
            }
    
        }
    
    
    
    }

    Mapper阶段 产生一个临时文件
    Reduce 读取Mapper生成的那个临时文件

    WordCountReducer类:

    Reduce类 规范 必须得 继承Reducer类 并且重写Reducer方法
    Reducer会把我们Mapper执行后的那个临时文件 作为他的输入,使用之后会把这个临时文件给删除掉

    Reducer<Text,IntWritable, Text,IntWritable>:
    KEYIN Text
    VALUEIN IntWritbale
    KEYOUT Text :我们Reduce之后 这个文件中内容的 Key是什么
    VALUEOUT IntWritable :这个文件中内容Value是什么

    package com.blb.core;
    
    import java.io.IOException;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    
    public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
    
        @Override
        protected void reduce(Text key,Iterable<IntWritable> values,Reducer<Text,IntWritable,Text,IntWritable>.Context context) throws IOException, InterruptedException
        {
            int sum=0;
            for(IntWritable value:values)
            {
                sum+=value.get();
            }
            context.write(key, new IntWritable(sum));
        }
    
    }

    WordCountDriver类:

    Driver这个类 用来执行一个任务 Job
    任务=Mapper+Reduce+HDFS把他们3者 关联起来

    package com.blb.core;
    
    import java.io.IOException;
    
    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;
    
    public class WordCountDriver {
    
        public static void main(String[] args) {
            Configuration conf=new Configuration();
            conf.set("fs.defaultFS", "hdfs://192.168.0.32:9000");
            try {
                Job job=Job.getInstance(conf);
                job.setJarByClass(WordCountDriver.class);  //要给当前的任务取一个名称
    
                job.setMapperClass(WordCountMapper.class);    //我当前的任务的Mapper类是谁
                job.setMapOutputKeyClass(Text.class);      //我们Mapper任务输出的文件的Key值类型
                job.setMapOutputValueClass(IntWritable.class); //我们Mapper任务输出的文件的Value值类型
    
                job.setReducerClass(WordCountReducer.class);  //我们当前任务的Reducer类是谁
                job.setOutputKeyClass(Text.class);        //我们Reducer任务输出的文件的Key值类型
                job.setOutputValueClass(IntWritable.class);  //我们Reducer任务输出的文件的Value值类型
    
                FileInputFormat.setInputPaths(job,new Path("/words"));  

            //关联我们HDFS文件 HDFS文件的绝对路径
            //输入的路径是文件夹 把这个文件夹下面的所有文件 都执行一遍

                FileOutputFormat.setOutputPath(job, new Path("/out"));

            //最终要有一个结果 我最终计算完成生成的结果存放在HDFS上的哪里
            //Mapper执行的后的结果是一个临时文件 这个文件存放在本地
            //Reducer执行后的结果自动的上传到HDFS之上 并且还会把Mapper执行后的结果给删除掉

                job.waitForCompletion(true);  //我们关联完毕后  我们要执行了
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    三、执行

    写完之后,将程序导出成jar包:WordCount.jar

    1、在hdfs上新建文件夹words

    hadoop fs -mkdir /words

    2、将要计算的文件(明月几时有.txt)上传到hdfs上。

    先rz上传到linux上,再用命令hadoop fs -put 明月几时有.txt  /words

    3、将jar包上传到linux上。

    4、开启服务

    start-all.sh

    5、运行jar包(hadoop jar jar包名称 主类[带main方法的那个类])

    hadoop jar WordCount.jar  com.blb.core.WordCountDriver

    最后成功后会在hdfs的/out目录下生成最终的结果的文件part-r-00000

    可以将文件下载下来查看

  • 相关阅读:
    A* Pathfinding for Beginners
    OpenGL Draw Mesh
    CentOS6.5下安装、配置SSH
    Ubuntu18.04下搭建LAMP环境
    滚动合集
    关闭页面触发事件
    在table中tr的display:block在firefox下显示布局错乱问题
    sharepoint添加模板及删除模板
    常用正则表达式
    javascript对象的property和prototype是这样一种关系
  • 原文地址:https://www.cnblogs.com/yangy1/p/12409738.html
Copyright © 2020-2023  润新知