package com.my.hadoop.mapreduce.wordcount;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

/**
 * MapReduce中的WordCount
 * @author yao
 *
 */
public class WordCount {

/**
     * MapReduce中的map函数的泛型
     * KEYIN        map函数读取文件行内容的偏移量为key
     * VALUEIN         map函数读取文件行内容
     * KEYOUT        map函数处理后输出到reduce函数的key
     * VALUEOUT        map函数处理后输出到reduce函数的value
     * @author yao
     *
     */
    static class WcMap extends Mapper<LongWritable, Text, Text, LongWritable>{
        private static final LongWritable ONE = new LongWritable(1l);
        private Text word = new Text();
        public void map(LongWritable key, Text value, Context context) throws IOException ,InterruptedException {
            String[] words = value.toString().split(" ");
            for (String w : words) {
                word.set(w);
                context.write(word, ONE);
            }
        }
    }
    
    /**
     * MapReduce中的reduce函数的泛型
     * KEYIN        reduce函数读取map函数输出的key
     * VALUEIN        reduce函数读取map函数输出的value
     * KEYOUT        reduce函数处理后输出到hdfs上文件的key
     * VALUEOUT        reduce函数处理后输出到hdfs上文件的value
     * @author yao
     *
     */
    static class WcReduce extends Reducer<Text, LongWritable, Text, LongWritable>{
        public void reduce(Text key, Iterable<LongWritable> value, Context context) throws java.io.IOException ,InterruptedException {
            long count = 0;
            for (LongWritable i : value) {
                count += i.get();
            }
            context.write(key, new LongWritable(count));
        }
    }
    
    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        Configuration conf = new Configuration();                                            //new配置对象,默认读取顺序是default-site.xml<core-site.xml
        
        String[] paths = new GenericOptionsParser(conf, args).getRemainingArgs();
        if (paths.length != 2) {
            System.err.println("Usage: " + WordCount.class.getName() + " <in> <out>");
            System.exit(2);
        }
        
        Job job = Job.getInstance(conf, WordCount.class.getSimpleName());                    //1.x是new Job,2.x为Job.getInstance
        job.setJarByClass(WordCount.class);                                                    //设置main方法所在的类
        
        FileInputFormat.setInputPaths(job, new Path(args[0]));                                //设置当前作业的输入路径(可有多个输入路径)
        job.setMapperClass(WcMap.class);                                                    //指定自定义的map函数
        job.setMapOutputKeyClass(Text.class);                                                //指定自定义map函数的输出到reduce函数的key类型
        job.setMapOutputValueClass(LongWritable.class);                                        //指定自定义map函数的输出到reduce函数的value类型
        
        job.setCombinerClass(WcReduce.class);                                                //在map函数输出到reduce函数进行本地合并以减少网络传输的带宽资源(根据需求使用,并不适用所有业务)
        
        job.setReducerClass(WcReduce.class);                                                //指定自定义的reduce函数
        job.setOutputKeyClass(Text.class);                                                    //指定自定义的reduce函数输出到hdfs的key类型
        job.setOutputValueClass(LongWritable.class);                                        //指定自定义的reduce函数输出到hdfs的value类型
        FileOutputFormat.setOutputPath(job, new Path(args[1]));                                //设置当前作业的输出到hdfs的路径(只有一个输出路径且该路径必须不存在)
        
        int status = job.waitForCompletion(true) ? 0 : 1;                                    //提交作业:true是打印作业进度详情,false则是不打印
        System.exit(status);
    }

}

hadoop2.2.0的WordCount程序的更多相关文章

  1. hadoop2.7.0实践- WordCount

    环境要求 说明:本文档为wordcount的mapreduce job编写及执行文档. 操作系统:Ubuntu14 x64位 Hadoop:Hadoop 2.7.0 Hadoop官网:http://h ...

  2. hadoop2.7.x运行wordcount程序卡住在INFO mapreduce.Job: Running job:job _1469603958907_0002

    一.抛出问题 Hadoop集群(全分布式)配置好后,运行wordcount程序测试,发现每次运行都会卡住在Running job处,然后程序就呈现出卡死的状态. wordcount运行命令:[hado ...

  3. 搭建Hadoop2.6.0+Eclipse开发调试环境(以及log4j.properties的配置)

    上一篇在win7虚拟机下搭建了hadoop2.6.0伪分布式环境.为了开发调试方便,本文介绍在eclipse下搭建开发环境,连接和提交任务到hadoop集群. 1. 环境 Eclipse版本Luna ...

  4. 搭建Hadoop2.6.0+Eclipse开发调试环境

    上一篇在win7虚拟机下搭建了hadoop2.6.0伪分布式环境.为了开发调试方便,本文介绍在eclipse下搭建开发环境,连接和提交任务到hadoop集群. 1. 环境 Eclipse版本Luna ...

  5. Hadoop2.2.0 第一步完成MapReduce wordcount计算文本数量

    1.完成Hadoop2.2.0单机版环境搭建之后需要利用一个例子程序来检验hadoop2 的mapreduce的功能 //启动hdfs和yarn sbin/start-dfs.sh sbin/star ...

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

    使用命令行编译打包运行自己的MapReduce程序 Hadoop2.6.0 网上的 MapReduce WordCount 教程对于如何编译 WordCount.java 几乎是一笔带过… 而有写到的 ...

  7. eclipse开发hadoop2.2.0程序

    在 Eclipse 环境下可以方便地进行 Hadoop 并行程序的开发和调试.前提是安装hadoop-eclipse-plugin,利用这个 plugin, 可以在 Eclipse 中创建一个 Had ...

  8. 编写简单的Mapreduce程序并部署在Hadoop2.2.0上运行

    今天主要来说说怎么在Hadoop2.2.0分布式上面运行写好的 Mapreduce 程序. 可以在eclipse写好程序,export或用fatjar打包成jar文件. 先给出这个程序所依赖的Mave ...

  9. Hadoop-2.4.0安装和wordcount执行验证

    Hadoop-2.4.0安装和wordcount执行验证 下面描写叙述了64位centos6.5机器下,安装32位hadoop-2.4.0,并通过执行 系统自带的WordCount样例来验证服务正确性 ...

随机推荐

  1. [转] Python 模块学习:os模块

    一.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台 ...

  2. A+B问题(java)

    import java.util.Scanner; public class Main { public static void main ( String args[] ) { Scanner in ...

  3. Android Configuration change引发的问题及解决方法

    之前在学习Fragment和总结Android异步操作的时候会在很多blog中看到对Configuration Change的讨论,以前做的项目都是固定竖屏的,所以对横竖屏切换以及横竖屏切换对程序有什 ...

  4. NYOJ-104最大和

    我看了好多博客,都是拿一维的做基础,一维的比较简单,所以要把二维的化成一维的,一维的题目大意:给了一个序列,求那个子序列的和最大,这时候就可以用dp来做,首先dp[i]表示第i个数能构成的最大子序列和 ...

  5. C# ashx生成的验证码

    public void ProcessRequest(HttpContext context) { context.Response.ContentType = "image/jpeg&qu ...

  6. python对象(腌制)

    python的内置对象类型主要有数字,字符串,列表,元祖,字典,集合等等,在python中,一切皆为对象 #腌制在python中如果我们有一些对象需要持久性存储,并且不丢失我们这个对象的类型与数据,我 ...

  7. 小学生之深入C#

    一.深入C#数据类型 值类型传递和引用类型传递 方法的参数是值类型和引用类型 注意:值传递和引用传递判定依据是有没有ref 01.如果方法的参数类型本身就是引用类型,那么对参数值的修改会永久保存 例如 ...

  8. 项目中用到的input 遇到的问题的归类

    input 前几天 为了这个词 用在搜索框被我们总监喷,为了加强印象,我把它记录下来 最原始的造型 <input type="text" value="搜索&quo ...

  9. Android应用清单文件:AndroidManifest.xml

    AndroidMainfest.xml清单文件是每个Android项目所必需的,它是整个Android应用的全家描述文件. <?xml version="1.0" encod ...

  10. Php RSS

    RSS 聚合最近非常流行,因此至少对 RSS 及其工作方式有所了解是一名 PHP 开发人员的迫切需要.本文介绍了 RSS 基础知识.RSS 众多用途中的一些用途.如何使用 PHP 从数据库创建 RSS ...