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

经过上篇文章hadoop之旅5-idea经过maven搭建hdfs环境,相信你们均可以在idea上作hadoop访问hdfs文件系统的开发了。一个云盘其实就能够基于这样的系统作出来。有兴趣的你们能够试着本身去实战一下。java

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

MapReduce

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

最简单的流程图c++

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

详细过程图spring

在map,reduce中间还有一系列,合并,排序等等过程,系统会将复杂的数据进行整理筛选,最终到达咱们须要用代码编写的业务端。咱们通常状况作数据离线分析能够只考虑编写map端,reduce端便可。话很少说直接带你们上代码体会。

开始实现

1.首先

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

c	2
c++	1
java	2
python	1
复制代码

2.导入依赖

<properties>
	<hadoop.version>2.7.3</hadoop.version>
</properties>

<dependency>
	<groupId>org.apache.hadoop</groupId>
	<artifactId>hadoop-common</artifactId>
	<version>${hadoop.version}</version>
</dependency>
<dependency>
	<groupId>org.apache.hadoop</groupId>
	<artifactId>hadoop-client</artifactId>	
	<version>${hadoop.version}</version>
</dependency>
<dependency>
        <groupId>org.apache.hadoop</groupId>
	<artifactId>hadoop-hdfs</artifactId>
	<version>${hadoop.version}</version>
</dependency>
复制代码

3.准备本身map端

实现map端其实很简单,只须要建立一个类继承Mapper类,而后实现它的map方法便可。编程

public class MyMapper extends Mapper<Object, Text, Text, LongWritable> {
    /**
     *
     * @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方法便可windows

/**
 * 前两个参数:reducer输入参数,即map输出的键,值集合(相同key的会整合在一块儿)
 * 后两个参数:reducer 输出的键,值(即最终结果)
 * 在reduce里作累加便可统计出每一个单词的个数
 */
public class MyReduce extends Reducer<Text,LongWritable,Text,LongWritable>{
    @Override
    protected void reduce(Text key, Iterable<LongWritable> 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. 实现客户端代码

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

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目录便可bash

最终的运行结果以下app

相关文章
相关标签/搜索