`

WordCount源码详解

阅读更多

1.源码解释

package org.apache.hadoop.examples;
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.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.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
 
public class WordCount {
 
  public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{

 


 /*定义hadoop数据类型IntWritable实例one,并且赋值为1,为什么是1呢?

因为不管一个单词出现几次,我们都会直接输出1

 假如输入数据是 nice to nice 那么用context.write(word,one)处理的结果就是

nice   1

to       1

nice   1

假如赋值是2 那么输出就变成了,

nice  2

to      2

nice   2

*/

 

    private final static IntWritable one = new IntWritable(1);
 
 //定义hadoop数据类型Text
    private Text word = new Text();
 
    //实现map函数,其中countext参数可以记录key和value
    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
      StringTokenizer itr = new StringTokenizer(value.toString()); //字符串分解类 把一行单词分解成一个个
      while (itr.hasMoreTokens()) {   //循环条件表示返回是否还有分隔符
        word.set(itr.nextToken());  //itr.nextToken获取单词,word.set() 方法将Java数据类型转换成hadoop数据类型转换,只有这样才能输出
        context.write(word, one);   //按照格式输出结果,比如nice 1  

      }
    }
  }
 
  public static class IntSumReducer    //继承泛型类reducer
       extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();
 
    public void reduce(Text key, Iterable<IntWritable> values, Context context

) throws IOException,  InterruptedException {

   //用sum来记录相同单词的数量,是java类型的数据
      int sum = 0;
      for (IntWritable val : values) {      //遍历得到结果
        sum += val.get();        //因为val的数据类型是IntWritable,所以需要将IntWritable类型的数据转换成java可以识别的数据类型,Intwritable.set(),   IntWritable.get()都能进行数据转换,set()方法是将Java数据类型转换成hadoop可识别的数据类型,而get()方法是将hadoop的数据类型转换成java可识别的数据类型
      }


      result.set(sum);     //将java的数据类型转换成Hadoop可识别的数据类型
      context.write(key, result);   //输出结果到hdfs
    }
  }
 
  public static void main(String[] args) throws Exception {
  //读取hadoop的配置参数,也就是安装hadoop时候的配置文件例如:core-site.xml、hdfs-site.xml和mapred-site.xml等等文件里的信息
    Configuration conf = new Configuration();   
 
//GenericOptionsParser类,它是用来解释常用hadoop命令,并根据需要为Configuration对象设置相应的值
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
 
//运行WordCount程序时候一定是两个参数,如果不是就会报错退出,其实这2个参数的作用就是告诉机器输入文件的地址和输出文件的地址
    if (otherArgs.length != 2) {      
      System.err.println("Usage: wordcount <in> <out>");
      System.exit(2);
    }
 
    Job job = new Job(conf, "word count");  //创建一个任务,第二个参数word count是任务的名称
    job.setJarByClass(WordCount.class);   
 
    job.setMapperClass(TokenizerMapper.class); //装载程序员编写好的计算程序,例如我们的程序类名就是WordCount了。这里我要做下纠正,虽然我们编写mapreduce程序只需要实现map函数和reduce函数,但是实际开发我们要实现三个类,第三个类是为了配置mapreduce如何运行map和reduce函数,准确的说就是构建一个mapreduce能执行的job了,例如WordCount类。
 
 
    job.setCombinerClass(IntSumReducer.class); 
    job.setReducerClass(IntSumReducer.class);  //指定要使用的reduce类
    job.setOutputKeyClass(Text.class);  
    job.setOutputValueClass(IntWritable.class); //定义输出结果的key/value的类型,也就是最终存储在hdfs上结果文件的key/value的类型。
 
    FileInputFormat.addInputPath(job, new Path(otherArgs[0]));   //确定输入文件的路径
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));  //确定输出文件的路径
 
    System.exit(job.waitForCompletion(true) ? 0 : 1); //如果job成功运行,我们的程序就会正常退出
  }
}

 

2.自己动手写出WordCount程序

分析WordCount的示例程序,可以看出一个基本的结构

底层的东西,hadoop的框架已经帮我们搞定了,我们剩下的工作其实就是设计以下3个方面

  • mapper类
  • reducer类
  • main() 方法

package org.apache.hadoop.examples;
 
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.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.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
 
public class xxx {
 
  public static class MyMapper extends Mapper<xxx, xxx, xxx, xxx>{
 
    public void map(xxx key, xxx value, Context context) throws IOException, InterruptedException {
    编写你的代码

      }
 }
 
  public static class MyReducer extends Reducer<xxx,xxx,xxx,xxx> {

    public void reduce(xxx key, xxx values, Context context) throws IOException, InterruptedException {
    编写你的代码  

    }
 }
 
  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
    if (otherArgs.length != 2) {
      System.err.println("Usage: wordcount <in> <out>");
      System.exit(2);
    }
    Job job = new Job(conf, "xxx");
    job.setJarByClass(xxx.class);   //根据自己编写的类来填写
    job.setMapperClass(xxx.class);
    job.setCombinerClass(xxx.class);
    job.setReducerClass(xxx.class);
    job.setOutputKeyClass(xxx.class);
    job.setOutputValueClass(xxx.class);
    FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }

 

分享到:
评论

相关推荐

    WordCount 源码浅析(1)

    《WordCount 源码浅析(1)》 在大数据处理领域,Hadoop 是一个不可或缺的名字,而 WordCount 是 Hadoop 的经典示例程序,它用于统计文本中单词出现的频率。这篇博客将对 WordCount 的源码进行初步解析,帮助初学者...

    Hadoop开发WordCount源码详细讲解

    Hadoop开发WordCount源码程序详细讲解,每一行都带注释说明。

    WordCount源码

    WordCount是Hadoop生态系统中最经典的示例程序,用于统计文本数据中单词出现的频率。它展示了MapReduce编程模型的基本工作原理,这也是分布式大数据处理的核心。在这个程序中,"Map"阶段将原始输入数据拆分成键值对...

    Hadoop集群-WordCount运行详解.pdf

    1.3WordCount源码分析中,1.3.1特别数据类型介绍了Hadoop自定义的几种数据类型,它们在实现MapReduce程序中扮演重要角色。1.3.2旧的WordCount分析与1.3.3新的WordCount分析,从源码层面解读了旧版和新版的WordCount...

    MapReduce经典例子WordCount运行详解.pdf

    4. WordCount源码分析 WordCount的实现涉及到了Hadoop自定义的数据类型,如Text和IntWritable,它们实现了WritableComparable接口,便于数据序列化和比较。Map函数解析输入文本,生成&lt;单词, 1&gt;的键值对,reduce函数...

    hadoop-1.2.1运行WordCount

    ### Hadoop-1.2.1 运行WordCount实例详解 #### 一、环境准备与搭建 在开始运行WordCount实例之前,首先确保已经按照之前的步骤完成了Hadoop-1.2.1环境的搭建。这包括但不限于安装JDK、配置Hadoop环境变量以及设置...

    006_hadoop中MapReduce详解_3

    "006_hadoop中MapReduce详解_3"可能是指一个系列教程的第三部分,着重讲解MapReduce的核心概念、工作原理以及实际应用。在这个部分,我们可能会探讨更深入的技术细节和优化策略。 MapReduce的工作流程分为两个主要...

    Hadoop从入门到上手企业开发

    019 测试环境(HDFS Shell基本命令和运行WordCount程序) 020 结合WordCount实例讲解Hadoop的数据存储和数据计算 021 Hadoop 五大服务与配置文件中的对应关系 022 分析Hadoop 三种启动停止方式的Shell 脚本 023 去除...

    Apache Spark源码读解

    ### Spark的启动流程详解 #### Worker向Master发送注册消息 - 当Worker启动后,它会主动向Master发送注册消息(`RegisterWorker`)。 - 这一过程建立了Worker与Master之间的通信通道。 #### Master向Worker发送...

    使用命令行编译打包运行自己的MapReduce程序 Hadoop2.6.0

    下面是WordCount.java的一部分源码,用于展示其基本结构: ```java import java.io.IOException; import java.util.Iterator; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; ...

    Hadoop实战初级部分PPT及源码下载

    4. **源码实践**:提供的源码可能是简单的MapReduce示例,如WordCount程序,这是Hadoop初学者常用来学习分布式计算的入门案例。通过分析和运行这些源码,学习者能深入理解MapReduce的工作原理。 5. **实际应用**:...

    cdeditor 使用

    **CDitor 使用详解** CDitor 是一款开源的文本编辑器工具,主要应用于网页端,用于提供富文本编辑功能。在Web开发中,它扮演着重要角色,为用户提供类似Word的编辑体验,支持插入图片、创建链接、格式化文本等操作...

    Apache Spark源码走读之3 -- Task运行期之函数调用关系分析

    ### Apache Spark源码走读之3 -- Task运行期之函数调用关系分析 #### 概述 Apache Spark作为一款高效的大数据处理框架,在其内部有着复杂的任务调度与执行机制。本文将深入探讨Spark中Task执行期间的具体流程以及...

    hadoop2.2编译安装详解

    2. 运行一个简单的WordCount示例,验证Hadoop工作正常。 八、安全模式与高可用性 Hadoop 2.2引入了HA(高可用性)特性,通过配置多个NameNode实现故障切换。在生产环境中,还需要考虑安全性,可以启用Kerberos以...

    Spark从入门到精通

    6、大量全网唯一的知识点:基于排序的wordcount,Spark二次排序,Spark分组取topn,DataFrame与RDD的两种转换方式,Spark SQL的内置函数、开窗函数、UDF、UDAF,Spark Streaming的Kafka Direct API、...

    linux安装详解

    Linux安装详解 Linux是一种自由和开放源码的操作系统,它基于Unix系统,广泛应用于服务器、嵌入式设备和个人计算机。本教程将详细讲解Linux的安装过程,以帮助初学者掌握这一核心技能。 首先,我们需要了解Linux...

    Hadoop-Eclipse开发环境配置经验

    二、Hadoop-Eclipse开发环境配置步骤详解 1. 安装Java开发工具包(JDK)与Hadoop环境 首先需要安装Java开发工具包,因为Hadoop是用Java语言编写的。推荐使用OpenJDK,可以通过命令`sudo apt-get install openjdk-6...

Global site tag (gtag.js) - Google Analytics