轻松入门大数据 第4章 入门到进阶:系统玩转分布式计算框架MapReduce 4.1 Hadoop之MapReduce 4.1.5 官方词频统计案例分析

您所在的位置:网站首页 hadoop题库(第5章) 轻松入门大数据 第4章 入门到进阶:系统玩转分布式计算框架MapReduce 4.1 Hadoop之MapReduce 4.1.5 官方词频统计案例分析

轻松入门大数据 第4章 入门到进阶:系统玩转分布式计算框架MapReduce 4.1 Hadoop之MapReduce 4.1.5 官方词频统计案例分析

2023-06-05 11:34| 来源: 网络整理| 查看: 265

轻松入门大数据

文章目录 轻松入门大数据第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