• Hadoop示例程序WordCount详解及实例


    部分参考:http://www.javaeye.com/topic/606962

    1.图解MapReduce

    MapReduce整体流程图

    并行读取文本中的内容,然后进行MapReduce操作

    Map过程:并行读取三行,对读取的单词进行map操作,每个词都以<key,value>形式生成

    reduce操作是对map的结果进行排序,合并,最后得出词频。

    2.简单过程:

    Input:

    Hello World Bye World

    Hello Hadoop Bye Hadoop

    Bye Hadoop Hello Hadoop

    Map:

    <Hello,1>

    <World,1>

    <Bye,1>

    <World,1>

    <Hello,1>

    <Hadoop,1>

    <Bye,1>

    <Hadoop,1>

    <Bye,1>

    <Hadoop,1>

    <Hello,1>

    <Hadoop,1>

    Sort:

    <Bye,1>

    <Bye,1>

    <Bye,1>

    <Hadoop,1>

    <Hadoop,1>

    <Hadoop,1>

    <Hadoop,1>

    <Hello,1>

    <Hello,1>

    <Hello,1>

    <World,1>

    <World,1>

    Combine:

    <Bye,1,1,1>

    <Hadoop,1,1,1,1>

    <Hello,1,1,1>

    <World,1,1>

    Reduce:

    <Bye,3>

    <Hadoop,4>

    <Hello,3>

    <World,2>

    MergeSort的过程(ps:2012-10-18)

    Map:

    <Hello,1><World,1><Bye,1><World,1><Hello,1><Hadoop,1><Bye,1><Hadoop,1><Bye,1><Hadoop,1><Hello,1><Hadoop,1>

    MergeSort:

    1. <Hello,1><World,1><Bye,1><World,1><Hello,1><Hadoop,1><Bye,1><Hadoop,1><Bye,1><Hadoop,1><Hello,1><Hadoop,1>
    2. <Hello,1><World,1><Bye,1> || <World,1><Hello,1><Hadoop,1><Bye,1><Hadoop,1><Bye,1> || <Hadoop,1><Hello,1><Hadoop,1>
    3. <Hello,1><World,1> ||| <Bye,1> || <World,1><Hello,1> ||| <Hadoop,1> | <Bye,1><Hadoop,1> ||| <Bye,1> || <Hadoop,1><Hello,1> ||| <Hadoop,1>
    4. MergeArray结果:<Hello,1><World,1> ||| <Bye,1> || <Hello,1><World,1> ||| <Hadoop,1> | <Bye,1><Hadoop,1> ||| <Bye,1> || <Hadoop,1><Hello,1> ||| <Hadoop,1> 在|||这一层级
    5. MergeArray结果:<Bye,1><Hello,1><World,1> || <Hadoop,1><Hello,1><World,1> | <Bye,1><Bye,1><Hadoop,1> || <Hadoop,1><Hadoop,1><Hello,1> 在||这一层级
    6. MergeArray结果:<Bye,1><Hadoop,1><Hello,1><World,1><Hello,1><World,1> | <Bye,1><Bye,1><Hadoop,1><Hadoop,1><Hello,1><Hadoop,1> 在|这一层级
    7. MergeArray结果:<Bye,1><Bye,1><Bye,1><Hadoop,1><Hadoop,1><Hadoop,1><Hadoop,1><Hello,1><Hello,1><Hello,1><World,1><World,1> 排序完成

    3.代码实例:

    View Code
    package com.felix;
    import java.io.IOException;
    import java.util.Iterator;
    import java.util.StringTokenizer;
    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.mapred.FileInputFormat;
    import org.apache.hadoop.mapred.FileOutputFormat;
    import org.apache.hadoop.mapred.JobClient;
    import org.apache.hadoop.mapred.JobConf;
    import org.apache.hadoop.mapred.MapReduceBase;
    import org.apache.hadoop.mapred.Mapper;
    import org.apache.hadoop.mapred.OutputCollector;
    import org.apache.hadoop.mapred.Reducer;
    import org.apache.hadoop.mapred.Reporter;
    import org.apache.hadoop.mapred.TextInputFormat;
    import org.apache.hadoop.mapred.TextOutputFormat;
    /**
     * 
     * 描述:WordCount explains by Felix
     * @author Hadoop Dev Group
     */
    public class WordCount
    {
        /**
         * MapReduceBase类:实现了Mapper和Reducer接口的基类(其中的方法只是实现接口,而未作任何事情)
         * Mapper接口:
         * WritableComparable接口:实现WritableComparable的类可以相互比较。所有被用作key的类应该实现此接口。
         * Reporter 则可用于报告整个应用的运行进度,本例中未使用。 
         * 
         */
        public static class Map extends MapReduceBase implements
                Mapper<LongWritable, Text, Text, IntWritable>
        {
            /**
             * LongWritable, IntWritable, Text 均是 Hadoop 中实现的用于封装 Java 数据类型的类,这些类实现了WritableComparable接口,
             * 都能够被串行化从而便于在分布式环境中进行数据交换,你可以将它们分别视为long,int,String 的替代品。
             */
            private final static IntWritable one = new IntWritable(1);
            private Text word = new Text();
            
            /**
             * Mapper接口中的map方法:
             * void map(K1 key, V1 value, OutputCollector<K2,V2> output, Reporter reporter)
             * 映射一个单个的输入k/v对到一个中间的k/v对
             * 输出对不需要和输入对是相同的类型,输入对可以映射到0个或多个输出对。
             * OutputCollector接口:收集Mapper和Reducer输出的<k,v>对。
             * OutputCollector接口的collect(k, v)方法:增加一个(k,v)对到output
             */
            public void map(LongWritable key, Text value,
                    OutputCollector<Text, IntWritable> output, Reporter reporter)
                    throws IOException
            {
                String line = value.toString();
                StringTokenizer tokenizer = new StringTokenizer(line);
                while (tokenizer.hasMoreTokens())
                {
                    word.set(tokenizer.nextToken());
                    output.collect(word, one);
                }
            }
        }
        public static class Reduce extends MapReduceBase implements
                Reducer<Text, IntWritable, Text, IntWritable>
        {
            public void reduce(Text key, Iterator<IntWritable> values,
                    OutputCollector<Text, IntWritable> output, Reporter reporter)
                    throws IOException
            {
                int sum = 0;
                while (values.hasNext())
                {
                    sum += values.next().get();
                }
                output.collect(key, new IntWritable(sum));
            }
        }
        public static void main(String[] args) throws Exception
        {
            /**
             * JobConf:map/reduce的job配置类,向hadoop框架描述map-reduce执行的工作
             * 构造方法:JobConf()、JobConf(Class exampleClass)、JobConf(Configuration conf)等
             */
            JobConf conf = new JobConf(WordCount.class);
            conf.setJobName("wordcount");           //设置一个用户定义的job名称
            conf.setOutputKeyClass(Text.class);    //为job的输出数据设置Key类
            conf.setOutputValueClass(IntWritable.class);   //为job输出设置value类
            conf.setMapperClass(Map.class);         //为job设置Mapper类
            conf.setCombinerClass(Reduce.class);      //为job设置Combiner类
            conf.setReducerClass(Reduce.class);        //为job设置Reduce类
            conf.setInputFormat(TextInputFormat.class);    //为map-reduce任务设置InputFormat实现类
            conf.setOutputFormat(TextOutputFormat.class);  //为map-reduce任务设置OutputFormat实现类
            /**
             * InputFormat描述map-reduce中对job的输入定义
             * setInputPaths():为map-reduce job设置路径数组作为输入列表
             * setInputPath():为map-reduce job设置路径数组作为输出列表
             */
            FileInputFormat.setInputPaths(conf, new Path(args[0]));
            FileOutputFormat.setOutputPath(conf, new Path(args[1]));
            JobClient.runJob(conf);         //运行一个job
        }
    }
    作者:xwdreamer
    欢迎任何形式的转载,但请务必注明出处。
    分享到:
  • 相关阅读:
    在django中怎么解决没有MySQLdb库的问题
    py下windows用户安装lxml
    发现一个强大的可视化第三方库pyecharts
    failed to create process怎么解决
    做透视表时,提示“数据源引用无效”
    用户运营招聘分析报告
    如何修改启动jupyter的文件路径
    如何卸载EXCEL中的插件?
    解决python3环境下twisted安装问题
    解决python多版本共存问题
  • 原文地址:https://www.cnblogs.com/xwdreamer/p/2297049.html
Copyright © 2020-2023  润新知