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

原文地址:https://www.cnblogs.com/daichangya/p/12959674.html