hadoop之旅6-windows本地MapReducer离线单词统计

通过上篇文章hadoop之旅5-idea通过maven搭建hdfs环境,相信大家都可以在idea上做hadoop访问hdfs文件系统的开发了。一个云盘其实就可以基于这样的系统做出来。有兴趣的大家可以试着自己去实战一下。

今天带大家在本地执行Mapreduce,进行单词个数的统计,一般用于调试。线上模式也很简单,只需要打好jar包,在线上服务通过 hadoop jar xxxx.jar 包名+类 命令执行即可,可自行探究

MapReduce

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。他也属于hadoop的核心组件之一,hdfs是一个分布式文件系统,MapReduce就是一个分布式计算框架。专门为计算而生

最简单的流程图

image
  1. 读取文件
  2. map操作
  3. reduce操作
  4. 输出结果文件

详细过程图

image

在map,reduce中间还有一系列,合并,排序等等过程,系统会将复杂的数据进行整理筛选,最终到达我们需要用代码编写的业务端。我们一般情况做数据离线分析可以只考虑编写map端,reduce端即可。话不多说直接带大家上代码体会。

开始实现

1.首先

在准备好一个输入文件input.txt,放在项目任意一个目录下,我建的是SpringBoot项目放在resources下的map_input目录下

c   2
c++ 1
java    2
python  1

2.导入依赖


    2.7.3



    org.apache.hadoop
    hadoop-common
    ${hadoop.version}


    org.apache.hadoop
    hadoop-client  
    ${hadoop.version}


        org.apache.hadoop
    hadoop-hdfs
    ${hadoop.version}

3.准备自己map端

实现map端其实很简单,只需要创建一个类继承Mapper类,然后实现它的map方法即可。

public class MyMapper extends Mapper {
    /**
     *
     * @param key 当前行的标识(键),一般文件输入可以不用管
     * @param text 当前行的值
     * @param context 上下文内容
     * 文件内容:
     *  java,c++
     *  c,java
     *  python,c
     */
    @Override
    protected void map(Object key, Text text, Context context) throws IOException, InterruptedException {
        //拿到当前输入的行内容
        String line = text.toString();
        //拆分当前行,如 java,c++
        String[] lines = line.split(",");
        for (String word : lines) {
            /**
             * 也就是在map端,把输出置为: java 1,c 1,c++ 1等
             */
            context.write(new Text(word),new LongWritable(1));
        }
    }
}

4.实现Reduce端

同理,继承Reducer类,实现reduce方法即可

/**
 * 前两个参数:reducer输入参数,即map输出的键,值集合(相同key的会整合在一起)
 * 后两个参数:reducer 输出的键,值(即最终结果)
 * 在reduce里做累加即可统计出每个单词的个数
 */
public class MyReduce extends Reducer{
    @Override
    protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
        /**
         * key,values
         * 以map里的输出的键值:如:map里输出的是:
         * c:[1,1]也可能是 c:[2] ,主要涉及MapReducer运行原理中的 分片合并 过程
         * c++:[1]
         * java:[1,1]也可能是java:[2]
         * python:[1]
         */
        long sum = 0; //该单词总共出现的次数
        for (LongWritable value : values) {
            sum+=value.get();
        }
        context.write(key,new LongWritable(sum)); //输出结果:如,c:2,java:1...
    }
}

5. 实现客户端代码

调用代码很常规,基本上都是一样的模板

   public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Configuration conf = new Configuration();
        //线上运行在hadoop集群里需要配置
        //conf.set("fs.defaultFS", "hdfs://master:9000/");//主master访问路径
        //conf.set("mapreduce.framework.name", "yarn"); //运行框架yarn
        //conf.set("yarn.resourcemanager.hostname", "master"); //设置主机
        Job job = Job.getInstance(conf); //拿到一个作业job,来执行mapReduce
        //设置运行的主类
        job.setJarByClass(MapReduceClient.class);
        job.setJobName("wordCount"); //设置应用名称
        //设置输入文件的位置
        FileInputFormat.addInputPaths(job,"J:\\IDEA\\springboot-hadoop\\src\\main\\resources\\map_input");
        //设置输出文件的位置
        FileOutputFormat.setOutputPath(job,new Path("J:\\IDEA\\springboot-hadoop\\src\\main\\resources\\map_output"));
        //设置mapper类和reducer类
        job.setMapperClass(MyMapper.class);
        job.setReducerClass(MyReduce.class);

        //设置输入,输出类型,map和reduce是一样的话可以只写reducer的
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);

        //执行
        job.waitForCompletion(true);

    }

在本地运行有个要求,需要本地hadoop的bin目录下拥有windows下的执行文件。大家可以下好hadoop之后直接解压,然后把windows执行包复制到bin目录即可

最终的运行结果如下

image

你可能感兴趣的:(hadoop之旅6-windows本地MapReducer离线单词统计)