zoukankan      html  css  js  c++  java
  • [hadoop源码阅读][9]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

  • 相关阅读:
    第二次结对编程作业——毕设导师智能匹配
    第二次作业——结对项目之需求分析与原型设计(1.0)
    调研《构建之法》指导下的全国高校的历届软工实践作品、全国互联网+竞赛、物联网竞赛等各类全国性大学生信息化相关的竞赛平台的历届作品
    软件工程的实践项目课程的自我目标
    CMake
    软件工程实践总结
    软件产品案例分析(K米 APP)
    毕设导师智能匹配
    结对项目之需求分析与原型设计(导师选择)
    调研《构建之法》指导下的软工实践作品
  • 原文地址:https://www.cnblogs.com/xuxm2007/p/2702164.html
Copyright © 2011-2022 走看看