mapreduce-从wordcount开始
2013-05-14 22:04
211 查看
1.wordcount的代码如下
2.一个可以运行的mapreduce程序可以包含哪些元素呢?
JobConf 常用可定制参数
比较容易疑惑的是:
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./article/2902645.html
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./article/2902645.html
相关文章推荐
- hadoop源代码分析(二)从wordCount开始,剖析mapreduce的运行机制
- [hadoop源码阅读][9]-mapreduce-从wordcount开始
- hadoop源代码分析(一)从wordCount开始,剖析mapreduce的运行机制
- 从wordcount 开始 mapreduce (C++\hadoop streaming模式)
- 从wordcount 开始 mapreduce (C++\hadoop streaming模式)
- 初学Hadoop之图解MapReduce与WordCount示例分析
- Hadoop MapReduce示例程序WordCount.java手动编译运行解析
- hadoop基础----hadoop实战(四)-----myeclipse开发MapReduce---myeclipse搭建hadoop开发环境并运行wordcount
- hadoop2x WordCount MapReduce
- 运行mapreduce实例wordcount时, 出现ClassNotFoundException: org.myorg.WordCount错误解决方法
- Hadoop2_mapreduce_wordcount
- MapReduce实战之WordCount
- mapreduce入门之wordcount注释详解
- MapReduce实验之WordCount
- Hadoop MapReduce编程 API入门系列之wordcount版本2(六)
- Mapreduce 测试自带实例 wordcount
- 并行wordcount的MapReduce实现
- [Mapreduce]eclipse下写wordcount
- Hadoop之道--MapReduce之Hello World实例wordcount
- Hadoop MapReduce示例程序WordCount.java手动编译运行解析