004简单介绍WordCount,统计文本单词次数

MapReduce简介

  1. MapReduce是一种分布式计算模型,主要解决海量数据的计算问题。
  2. MR有两个阶段组成:Map和Reduce,用户只需实现map()和reduce()两个函数,即可实现分布式计算。

MapReduce的原理图

  1. MR执行的流程

             2.MR原理图

    

  • 根据代码简单了解MR。
package com.lj.MR;

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;

public class WCMapper extends Mapper<LongWritable, Text, Text, IntWritable>  {
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //super.map(key, value, context);
        String[] arr = value.toString().split(" ");
        Text keyOut = new Text();
        IntWritable valueOut = new IntWritable();
        for(String s :arr){
            keyOut.set(s);
            valueOut.set(1);
            try {
                context.write(keyOut,valueOut);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

  

package com.lj.MR;

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

import java.io.IOException;

public class WCReducce extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        //super.reduce(key, values, context);
        int count = 0;
        for(IntWritable iw:values){
             count = count + iw.get();
        }
        context.write(key,new IntWritable(count));
    }
}
package com.lj.MR;

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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.log4j.BasicConfigurator;

public class WCApp {
    public static void main(String[] args) {
        BasicConfigurator.configure();

        Configuration conf = new Configuration();        //此处为本地测试
        // conf.set("fs.defaultFS","file:///D://ItTools");
        try {
            //单例模式
            Job job = Job.getInstance(conf);
            //任务作业名字
            job.setJobName("WCApp");
            //搜索类
            job.setJarByClass(WCApp.class);
            //设置输入格式
            job.setInputFormatClass(TextInputFormat.class);

            FileInputFormat.addInputPath(job, new Path(args[0]));
            FileOutputFormat.setOutputPath(job, new Path(args[1]));

            job.setMapperClass(WCMapper.class);
            job.setReducerClass(WCReducce.class);

            job.setNumReduceTasks(1);
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);

            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            job.waitForCompletion(false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 代码简单解析:

根据执行流程图我们不难发现,首先我们从Mapper下手,然后着手Reducer,而Reducer的key(in),value(in),肯定是Mapper的key(out),value(out),否则我们不难发现,一定会类型不匹配,直接报错。

MAP:就是将原本文字转换成(k,v),其中k就是word,v就是单词的出现的次数

Shuffle:将相同的k排列一起

Reduce:将相同的k的v相加

原文地址:https://www.cnblogs.com/sirlijun/p/9588965.html

时间: 2024-10-10 23:52:40

004简单介绍WordCount,统计文本单词次数的相关文章

shell统计文本中单词的出现次数

Ubuntu14.04 给定一个文本,统计其中单词出现的次数 # solution 1 grep与awk配合使用,写成一个sh脚本 fre.sh sh fre.sh wordfretest.txt #! /bin/bash# solution 1 if [ $# -eq 0 ] then echo "Usage:$0 args error" exit 0 fi if [ $# -ge 2 ] then echo "analyse the first file $1"

&quot;分拣&quot; 思路 统计每个单词出现的次数

package collection.map; public class Letter { public String name; public int count; } package collection.map; /* * 统计每个单词出现的次数 * "分拣" 思路 * 1.为所有key创建容器 * 之后容器中存放对应value * 2.第一次创建容器,并存放值value * 第二次之后,直接使用容器存放值 */ import java.util.HashMap; import

java统计文本中某个字符串出现的次数

原文: java统计文本中某个字符串出现的次数 源代码下载地址:http://www.zuidaima.com/share/1550463297014784.htm 统计文本中某个字符串出现的次数或字符串中指定元素出现的次数 文件样本: 程序查找的上此文件带"a"的字符在多少次 结果: package com.zuidaima.util.string; import java.io.*; /** * @author www.zuidaima.com **/ public class C

JSP简单实现统计网页访问次数

JSP简单实现统计网页访问次数 需求:统计网页的访问次数 核心思想:利用application对象,将访问次数的信息放入application对象中,每次访问就+1.这里利用了application对象每次只有当应用关闭才被销毁的特性. 核心代码如下: <% Object obj =application.getAttribute("counter"); if(obj==null){ application.setAttribute("counter", ne

Hadoop简单介绍

  从数据爆炸開始...  1.1 第三次工业革命 第一次:18世纪60年代.手工工厂向机器大生产过渡,以蒸汽机的发明和使用为标志. 第二次:19世纪70年代.各种新技术新发明不断被应用于工业生产,以电力的发明使用为标志. 第三次:20世界四五十年代末.以高新技术为代表的新科学技术革命,以原子能.航天技术和电子计算机 为标志. 1.2 信息技术发展带来的数据爆炸 纽约证券所交易    每天 1TB FaceBook一千亿照片  1PB 腾讯 每天 300TB 淘宝 每天 pv20亿 数据量 50

C++map类型 之 简单介绍

一:map的前世今生 (1)从关联容器与顺序容器说起.关联容器通过键(key)存储和读取元素.而顺序容器则通过元素在容器中的位置顺序存储和訪问元素(vector,queue,stack,list等). 关联容器(Associative containers)支持通过键来高效地查找和读取元素. 两个主要的关联容器类型是 map 和 set. 当中map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据.set 仅包括一个键.并有效地支持

shell语法简单介绍

一.基本的语法 1.1.shell文件开头 shell文件必须以以下的行開始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的參数是用来运行该文件的程序.在这个样例中我们使用/bin/sh来运行程序. 当编辑好脚本时,假设要运行该脚本,还必须使其可运行. 要使脚本可运行: 执行chmod +x filename 这样才干用./filename 来执行 1.2 凝视 在进行shell编程时,以#开头的句子表示凝视,直到这一行的结束.我们真诚地建议您在程序中使用凝视. 假设

《PHP 5.5从零開始学(视频教学版)》内容简单介绍、文件夹

<PHP 5.5从零開始学(视频教学版)>当当网购买地址: http://product.dangdang.com/23586810.html <PHP 5.5从零開始学(视频教学版)>源码.教学视频下载地址: http://pan.baidu.com/s/1zt9hW 内 容 简 介 本书循序渐进地介绍了PHP 5.5开发动态站点的主要知识和技能,提供了大量的PHP应用实例供读者实践.每一章节都清晰讲述了代码作用及其编写思路,使读者能在最短时间内迅速掌握PHP的应用开发技能. 全

python的列表,元组和字典简单介绍

引 入 java                                   python 存取多个值:数组或list集合 ------------------------> 列表,元组 key-value格式:    Map        ------------------------>    字典 自己学习发现,java跟python这两门面向对象语言在数据类型的定义上,很多思想都是互通的,这里不说java,简单介绍一下python的列表,元组和字典. 一.列表 List: 最通