MapReduce的应用案例(WordCount单词计数)

MapReduce的应用案例(WordCount单词计数)

1. WordCount单词计数

作用:

计算文件中出现每个单词的频数

输入结果按照字母顺序进行排序

Map过程

Reduce过程

WordCount的源代码

  1. import java.io.IOException;
    import java.util.StringTokenizer;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.hadoop.mapreduce.Reducer;
    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.hadoop.mapreduce.lib.output.TextOutputFormat;

    public class WordCount {
    public static class WordCountMap extends
    Mapper<LongWritable, Text, Text, IntWritable> {
    private final IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(LongWritable key, Text value, Context context)
    throws IOException, InterruptedException {
    String line = value.toString();
    StringTokenizer token = new StringTokenizer(line);
    while (token.hasMoreTokens()) {
    word.set(token.nextToken());
    context.write(word, one);
    }
    }
    }

    public static class WordCountReduce extends
    Reducer<Text, IntWritable, Text, IntWritable> {
    public void reduce(Text key, Iterable<IntWritable> values,
    Context context) throws IOException, InterruptedException {
    int sum = 0;
    for (IntWritable val : values) {
    sum += val.get();
    }
    context.write(key, new IntWritable(sum));
    }
    }

    public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = new Job(conf);
    job.setJarByClass(WordCount.class);
    job.setJobName("wordcount");
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    job.setMapperClass(WordCountMap.class);
    job.setReducerClass(WordCountReduce.class);
    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    job.waitForCompletion(true);
    }
    }

代码解析:

首先是导入各种的相应的类import

开始定义一个类WordCount

  1. public class WordCount{}

在这个类里面包含了两个内置的类,一个叫TokenizerMapper,另一个叫IntSumReducer

  1. public static class TokenizerMapper
    public static class IntSumReducer

其中第一个设置了Mapper的输入格式分别是Object(key)和Text(value),输出类型是Text(key)和IntWritable(value)

其中

  1. extends Mapper<Object,Text,Text,IntWritable>{}

这里的one表示单词出现过1次

  1. private final IntWritable one = new IntWritable(1);

接下来就是map操作

  1. public void map(Object key,Text value,Context context)

map操作做一个节段进行分词,如果发现一个词以后就进行写入一个word一个one

  1. word.set(itr.nextToken());
    context.write(word,one);

第二个类IntSumReducer,它继承于Reduce接口,设置Reducer的类型是Text和IntWritable,输出类型是Text和IntWritable

  1. public static class IntSumReducer
    extends Reducer<Text,IntWritable,Text,IntWritable>{}

Reducer做累加

  1. sum+=val.get();

写好之后有个main函数,用于设置相应的配置文件,包括输入文件目录和输出文件目录,配置作业名字,配置作业中的各个类等等

  1. public static void main(String[] args) throws Exception{}

WordCount单词计数步骤:

  1. 编写WordCount.java,包含Mapper类和Reducer类
  2. 编译WordCount.java,javac -classpath
  3. 打包jar -cvf WordCount.jar classes/*
  4. 作业提交 hadoop jar WordCount.jar WordCount input output

详细:

检查hadoop的运行情况jps,确定NameNode、DataNode、TaskTracker、Jobtracker、SecondaryNameNode的启动情况

java程序编写

  1. vim WordCount.java

写完之后保存,然后进行编译(因为要动用hadoop里面的一些架包,所以如果用命令行的话要用-classpath进行架包的加入,如果是一些IDE可以直接进行编译)

  1. javac -classpath /opt/hadoop-1.2.1/hadoop-core-1.2.1.jar:/opt/hadoop-1.2.1/lib/commons-cli-1.2.jar -d word_count_class/ WordCount.java
    cd word_count_class/
    ls

会在word_count_class文件目录下看到三个已经编译好的文件:WordCount.class、WordCount$WordCountMap.class、WordCount$WordCountReduce.class

把编译好的文件打包

  1. jar -cvf wordcount.jar *.class

把原始文件打开WordCount.java,有两个参数输入和输出

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

进入输入文件目录cd input/,在input文件目录下有两个个文件file1、file2,文件内有一些字符串,将file1和file2提交到hadoop里面去

  1. hadoop fs -mkdir input_wordcount
    hadoop fs -put input/* input_wordcount/
    hadoop fs -ls input_wordcount
    hadoop fs -cat input_wordcount/file1

把输入文件上传到hadoop之后就可以提交作业

  1. hadoop jar word_count_class/wordcount.jar WordCount input_wordcount output_wordcount

输入是input_wordcount,输出是output_wordcount,如果没有output_wordcount这个文件夹,那将会新建一个

查看output文件

  1. hadoop fs -ls output_wordcount

注意最后一个文件,例如这里是part-r-00000

  1. hadoop fs -cat output_wordcount/part-r-00000

这就是WordCount单词计数的完整过程,用的是hadoop1.2.1版本

hadoop笔记之MapReduce的应用案例(WordCount单词计数)的更多相关文章

  1. hadoop笔记之MapReduce的应用案例(利用MapReduce进行排序)

    MapReduce的应用案例(利用MapReduce进行排序) MapReduce的应用案例(利用MapReduce进行排序) 思路: Reduce之后直接进行结果合并 具体样例: 程序名:Sort. ...

  2. hadoop笔记之MapReduce的运行流程

    MapReduce的运行流程 MapReduce的运行流程 基本概念: Job&Task:要完成一个作业(Job),就要分成很多个Task,Task又分为MapTask和ReduceTask ...

  3. hadoop笔记之MapReduce原理

    MapReduce原理 MapReduce原理 简单来说就是,一个大任务分成多个小的子任务(map),并行执行后,合并结果(reduce). 例子: 100GB的网站访问日志文件,找出访问次数最多的I ...

  4. Hadoop WordCount单词计数原理

    计算文件中出现每个单词的频数 输入结果按照字母顺序进行排序 编写WordCount.java 包含Mapper类和Reducer类 编译WordCount.java javac -classpath ...

  5. Spark本地环境实现wordCount单词计数

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6814778610788860424/ 编写类似MapReduce的案例-单词统计WordCount 要统计的文件为 ...

  6. [spark案例学习] 单词计数

    数据准备 数据下载:<莎士比亚全集> 我们先来看看原始数据:首先将数据加载到RDD,然后显示数据框的前15行. shakespeareDF = sqlContext.read.text(f ...

  7. 每天收获一点点------Hadoop之初始MapReduce

    一.神马是高大上的MapReduce MapReduce是Google的一项重要技术,它首先是一个编程模型,用以进行大数据量的计算.对于大数据量的计算,通常采用的处理手法就是并行计算.但对许多开发者来 ...

  8. Hadoop MapReduce编程入门案例

    Hadoop入门例程简介 一个.有些指令 (1)Hadoop新与旧API差异 新API倾向于使用虚拟课堂(象类),而不是接口.由于这更easy扩展. 比如,能够无需改动类的实现而在虚类中加入一个方法( ...

  9. 【hadoop代码笔记】Mapreduce shuffle过程之Map输出过程

    一.概要描述 shuffle是MapReduce的一个核心过程,因此没有在前面的MapReduce作业提交的过程中描述,而是单独拿出来比较详细的描述. 根据官方的流程图示如下: 本篇文章中只是想尝试从 ...

随机推荐

  1. 对拍BAT

    :loop makedata.exe K.exe Kture.exe fc a.out b.out if %errorlevel%==0 goto loop pause

  2. UVA 12166 Equilibrium Mobile

    题意: 给出数个天平,每个天平的结构都类似于二叉树,只有左右重量都相等时才平衡,求每个天平最少改多少个秤砣,也就是叶子结点可以使得整个天平平衡.天平的深度不超过16. 分析: 要使得改动的数量最少,那 ...

  3. VMware虚拟机中调整Linux分区大小手记(转发)

      前段时间用VMware5.5安装了CentOS5.3,安装的时候分配了5Gb的虚拟硬盘空间给Linux系统,系统安装选择很多组件和软件,后面使用时又安装也一些软件,结果导致虚拟硬盘空间不足.查看分 ...

  4. html form表单提交数据并后台获取

    前台: HTML的代码:(关键是要在form里设置enctype="multipart/form-data",这样才能在提交表单时,将文件以二进制流的形式传输到服务器) <h ...

  5. 回滚Swtichover

    从11.2.0.2开始,如果由于某种原因switchover没有成功,可以回滚switchover. For physical standby databases in situations wher ...

  6. Redis系列整理

    0.Redis系列-安装部署维护篇 1.Redis系列-远程连接redis并给redis加锁 2.Redis系列-存储篇string主要操作函数小结 3.Redis系列-存储篇list主要操作函数小结 ...

  7. python基础之语句结束

    1 2 3 4 5 if a :     if b:          # 这里是if b的作用区间     #这里是if a的作用区间 #这里不在if 区间 python 是按缩进来识别代码块的.

  8. C++结构体中sizeof(1)

    sizeof sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的 ...

  9. 如何实现 Excel方式二维变色提示的 m*n 表格

    此代码当m≠n 时,有问题.暂时还未解决此问题. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  10. Linux05--Shell程序设计01

    1.Shell脚本介绍 基本介绍: shell脚本是一个可执行的纯文本文件,由多个shell命令组成. 命令的执行是从上而下,从左而右的分析和执行 命令,参数间的多个空白也会被忽略 #是注释 #!用于 ...