轻松入门大数据 第4章 入门到进阶:系统玩转分布式计算框架MapReduce 4.1 Hadoop之MapReduce 4.1.5 官方词频统计案例分析 |
您所在的位置:网站首页 › hadoop题库(第5章) › 轻松入门大数据 第4章 入门到进阶:系统玩转分布式计算框架MapReduce 4.1 Hadoop之MapReduce 4.1.5 官方词频统计案例分析 |
轻松入门大数据
文章目录
轻松入门大数据第4章 入门到进阶:系统玩转分布式计算框架MapReduce4.1 Hadoop之MapReduce4.1.5 官方词频统计案例分析
第4章 入门到进阶:系统玩转分布式计算框架MapReduce
4.1 Hadoop之MapReduce
初识MapReduceMR优缺点MR核心思想官方词频统计案例分析MR编程规范MR数据类型词频统计分析详解模板方法设计模式序列化Hadoop序列化之Writable自定义序列化案例实战初识InputFormat&InputSplitInputSplit和Block的关系InputFormat系列编程PartitionerCombiner排序初识OutputFormat自定义OutputFormat实战场景题之group by场景题之distinct场景题之joinShuffle详解MR核心组件总结
4.1.5 官方词频统计案例分析
官网文档:https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html 稍微了解一下 通过官方的wordcount案例来了解mr作业 wordcount:词频的统计 是一个非常经典的例子 一定要深入掌握的 目标:求每个单词出现的次数 官网给的栗子中大概是分成了三个部分 TokenizerMapperIntSumReducermain:Driver暂且抛开MR 不谈,例如下面这个内容: wc.data pk,pk,pk zhangsan,zhangsan lisi我们自己实现这个目标,可以怎么做? key:value ==> Map 可以通过Java IO把文件内容读取进来,一行一行的读取数据 按照指定的分隔符对这一行数据的内容进行拆分, 按照逗号 pk,pk,pk String[] splits = line.split(",") ==> pk pk pk map.get("pk") ==> pk -> 1 ==> 1 + 1 2+1如果是用MR, 一个字符串,一个数值 import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCount { public static class TokenizerMapper extends Mapper{ // 继承自Mapper private final static IntWritable one = new IntWritable(1); private Text word = new Text(); // 一行一行的数据进来,按照分隔符拆开,每个单词都给个1 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 { private IntWritable result = new IntWritable(); // 【聚合】 public void reduce(Text key, Iterable values, Context context ) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { // 遍历 sum += val.get(); } result.set(sum); context.write(key, result); } } // 将Map 和 Reduce 串起来 public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(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(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }思想,先分是为了方便进行并行计算。 分而治之: 先分 再合 MapTask ReduceTask (word,1) (word, N)宏观上有个认识就OK。后面我们还会更为详细的进行实现讲解。这里就先开个头。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |