当前位置:   article > 正文

MapReduce实例 - 实现词频统计_实现词频统计案例

实现词频统计案例

一、MapReduce基础

## MapReduce概述?
1、MapReduce是一个分布式计算框架

  • 它将大型数据操作作业分解为可以跨服务器集群并行执行的 单个任务。
  • 起源于Google

2、适用于大规模数据处理场景

  • 每个节点处理存储在该节点的数据

3、每个job包含Map和Reduce两部分
4、MapReduce 的设计目标是方便编程人员在不熟悉分布式并行开发的情况下,将编写的程序运行在分布式系统上,从而降低了分布式开发的入门门槛。

MapReduce特点
优点

  • 易于编程
  • 可扩展性
  • 高容错性
  • 高吞吐量

不适用领域

  • 难以实时计算
  • 不适合流式计算
  • 不适合DAG(有向图)计算

二、MapReduce 编程模型

1、MapReduce模型概述
MapReduce是一种编程模型,其创意和灵感来源于函数式编程。MapReduce 从名称上就表现出它的核心原理,即由Map和Reduce两个阶段组成。Map 表示“映射”,由一定数量的 Map Task 组成。Reduce 表示“归约”,由一定数量的Reduce Task 组成。用户只需要写 map() 和 reduce() 函数,就可以完成分布式程序的设计。
MapReduce编程模型:
在这里插入图片描述
2、MapReduce编程三部曲

1.输入Input.MapReduce 输入一系列k1/v1对。
2. Map 和 Reduce 阶段。Map:(k1,v1)->list(k2,v2),Reduce:(k2,list(v2))->list(k3,v3)。其中k2/v2是中间结果对
3. 输出Output。MapReduce输出一系列k3/v3对。

三、MapReduce实现词频统计实例

1.需求分析:
编程实现如输入/输出内容。
输入:
在这里插入图片描述输出:
在这里插入图片描述
2、WordCount代码实现
1.新建Maven工程mapreducesTest,添加pom文件依赖,代码如下。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.kgc</groupId>
    <artifactId>bigdata</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <hadoop.version>2.6.0</hadoop.version>
        <hive.version>1.1.0-cdh5.14.2</hive.version>
        <hbase.version>1.2.0-cdh5.14.2</hbase.version>
    </properties>

    <repositories>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
    </repositories>

    <dependencies>
        <!--hadoop-->
        <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>

        <!--日志-->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

        <!--MapReduce-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-auth</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-core</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
            <version>${hadoop.version}</version>
        </dependency>

        <!--log4j-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!--测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <!--<scope>test</scope>-->
        </dependency>
    </dependencies>
</project>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83

2.在 WordCount 类中编写 WordMapper 类
关键代码:

package cn.kgc.mr.wc;

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;

/*
KEYIN,      输入的key类型
VALUEIN,    输入的value类型
KEYOUT,     输出的key类型
VALUEOUT    输出的value类型
 */
public class WCMapper extends Mapper<LongWritable, Text,Text, IntWritable> {
    Text k = new Text();
    IntWritable v = new IntWritable(1);
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //1、将文本转换成string
        String line = value.toString();

        //2、将字符串切割
        String[] words = line.split("\\s+");//line.split(" ").var可以直接转成需要接收的对象

        //3、将每一个单词写出
        for (String word : words) {
            k.set(word);
            context.write(k,v);
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

3、在 WordCount 类中编写 WordMapper 类
关键代码:

package cn.kgc.mr.wc;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;

/*
KEYIN,      reduce端输入的key类型,即map端输出的key
VALUEIN,    reduce端输入的value类型,即map端输出的value
KEYOUT,     reduce端输出的key类型
VALUEOUT    reduce端输出的key类型
 */
public class WCReduce extends Reducer<Text, IntWritable,Text, IntWritable> {
    IntWritable v = new IntWritable();
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        //reduce端接受到的类型大概是这样的   (wish,  (1,1,1,1,1,1,1,1))
        //遍历迭代器
        int sum = 0;
        for (IntWritable count : values) {
            //对迭代器进行累加求和
            sum+=count.get();
        }
        //将key和value写出
        v.set(sum);
        context.write(key,v);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

4.编写编写启动词频统计功能的驱动类WordMain。
关键代码:

package cn.kgc.mr.wc;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import org.apache.hadoop.io.Text;
import java.io.IOException;

public class WCDriver {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        //1、创建配置文件
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf,"wordcount");

        //2、设置jar的位置
        job.setJarByClass(WCDriver.class);

        //3、设置map和reduce的位置
        job.setMapperClass(WCMapper.class);
        job.setReducerClass(WCReduce.class);

        //4、设置map输出的key,value类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        //5、设置reduce输出的key,value类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        //6、设置输出的路径
        FileInputFormat.setInputPaths(job, new Path("file:///D:\\Idea\\ideaMaven\\hadoopdfs1\\data\\wcinput"));
        FileOutputFormat.setOutputPath(job, new Path("file:///D:\\Idea\\ideaMaven\\hadoopdfs1\\data\\wcoutput"));

        //7、提交程序运行
        boolean result = job.waitForCompletion(true);
        System.out.println(result ? 0:1);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/747938
推荐阅读
相关标签
  

闽ICP备14008679号