zoukankan      html  css  js  c++  java
  • mapreduce从wordcount开始


    1.wordcount的代码如下


    public class WordCount
    {
        public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>
        {
    
            private final static IntWritable one = new IntWritable(1);
            private Text word = new Text();
    
            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());
                    context.write(word, one);
                }
            }
        }
    
        public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable>
        {
            private IntWritable result = new IntWritable();
    
            public void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException
            {
                int sum = 0;
                for (IntWritable val : values)
                {
                    sum += val.get();
                }
                result.set(sum);
                context.write(key, result);
            }
        }
    
        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, "word count");
            job.setJarByClass(WordCount.class);
            job.setMapperClass(TokenizerMapper.class);
            job.setCombinerClass(IntSumReducer.class);
            job.setReducerClass(IntSumReducer.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
            FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
            System.exit(job.waitForCompletion(true) ? 0 : 1);
        }
    }

     

    2.一个可以运行的mapreduce程序可以包含哪些元素呢?

    JobConf 常用可定制参数

     

     

    参数

    作用

    缺省值

    其它实现

    InputFormat

    将输入的数据集切割成小数据集 InputSplits, 每一个InputSplit 将由一个 Mapper 负责处理。此外InputFormat 中还提供一个 RecordReader 的实现,将一个 InputSplit 解析成 <key,value> 对提供给 map函数。

    TextInputFormat 
    (针对文本文件,按行将文本文件切割成 InputSplits, 并用LineRecordReader 将 InputSplit 解析成 <key,value> 对,key 是行在文件中的位置,value 是文件中的一行)

    SequenceFileInputFormat

    OutputFormat

    提供一个 RecordWriter 的实现,负责输出最终结果

    TextOutputFormat 
    (用 LineRecordWriter 将最终结果写成纯文件文件,每个 <key,value>对一行,key 和 value 之间用 tab分隔)

    SequenceFileOutputFormat

    OutputKeyClass

    输出的最终结果中 key 的类型

    LongWritable

     

    OutputValueClass

    输出的最终结果中 value 的类型

    Text

     

    MapperClass

    Mapper 类,实现 map 函数,完成输入的<key,value> 到中间结果的映射

    IdentityMapper 
    (将输入的 <key,value> 原封不动的输出为中间结果)

    LongSumReducer, 
    LogRegexMapper, 
    InverseMapper

    CombinerClass

    实现 combine 函数,将中间结果中的重复 key 做合并

    null 
    (不对中间结果中的重复 key 做合并)

     

    ReducerClass

    Reducer 类,实现 reduce 函数,对中间结果做合并,形成最终结果

    IdentityReducer 
    (将中间结果直接输出为最终结果)

    AccumulatingReducer,

    LongSumReducer

    InputPath

    设定 job 的输入目录, job 运行时会处理输入目录下的所有文件

    null

     

    OutputPath

    设定 job 的输出目录,job 的最终结果会写入输出目录下

    null

     

    MapOutputKeyClass

    设定 map 函数输出的中间结果中 key 的类型

    如果用户没有设定的话,使用OutputKeyClass

     

    MapOutputValueClass

    设定 map 函数输出的中间结果中 value 的类型

    如果用户没有设定的话,使用OutputValuesClass

     

    OutputKeyComparator

    对结果中的 key 进行排序时的使用的比较器

    WritableComparable

     

    PartitionerClass

    对中间结果的 key 排序后,用此 Partition 函数将其划分为R份,每份由一个 Reducer 负责处理。

    HashPartitioner 
    (使用 Hash 函数做 partition)

    KeyFieldBasedPartitioner

    PipesPartitioner

     

     

     

    比较容易疑惑的是:

    InputFormat:读取输入文件,以自定义map的输入数据格式,传给map.(如下红色字体) 
    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>

    MapOutputKeyClass,MapOutputValueClass:定义了map的输出数据的格式,reduce的输入数据格式

    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>

    public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable>

    OutputKeyClass,OutputValueClass:定义了reduce的输出数据格式,OutputFormat的输入格式

    public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable>

    OutputFormat:将mapreduce的结果数据写入到文件中去

    OutputKeyComparator/OutputValueGroupingComparator:二次排序用的

     

    参考文献:

    1.http://hadoop.apache.org/docs/r0.19.1/cn/mapred_tutorial.html

    2.http://caibinbupt.iteye.com/blog/338785

    3.http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop2/index.html

    4.http://www.riccomini.name/Topics/DistributedComputing/Hadoop/SortByValue/

    5.http://blog.csdn.net/chjjunking/article/details/6747011

  • 相关阅读:
    python内建函数
    python中fromkeys的用法
    python中append和+号的区别
    python中input用法
    opencv3.2.0之绘图
    opencv3.2.0之Mat
    【学习】Python进行数据提取的方法总结【转载】
    【python】python中的enumerate()函数【笔记】
    【学习】如何安装GraphLab Create 【转载】
    【学习】python文件读写,用with open as的好处,非常好【转载】
  • 原文地址:https://www.cnblogs.com/daichangya/p/12959674.html
Copyright © 2011-2022 走看看