Mapreduce-实验、实践

本文详细介绍了MapReduce实验中的五个关键部分,包括数值概要、计数器、舆情过滤、StackOverflow数据结构操作和数据连接。实践部分着重于combiner的应用、大数据平台使用、布隆过滤器实践、Top10排序以及去重用户操作。这些内容展示了MapReduce在实际项目中的应用和优化策略。

实验:

实验(一)数值概要—中位数与标准差

检查实验环境、运行示例程序。
利用数据概要完成中位数与标准差计算。
数据集可以采用Ctrip数据集,计算内容可自定义。

在这里插入图片描述

实验(二):MapReduce计数器实验

在给定数据集上完成计数实验,可以用ctrip数据集或50w数据集。

在这里插入图片描述

实验(三):MapReduce布隆过滤器的舆情过滤

按指定的热点词列表训练布隆过滤器,对舆情数据集进行过滤,过滤后的数据写入HDFS。

在这里插入图片描述

实验(四)StackOverflow数据集的分层操作

构建StackOverflow数据集中问题与回复的分层结构,将贴子与回复关联起来。

在这里插入图片描述

实验(五): Reduce端连接

用利ctrip数据集,将product_info 与quantity数据集进行连接操作,连接的字段为product_id。

基本思路
(1):Map端读取所有的文件,并在输出的内容里加上标示,代表数据是从哪个文件里来的。
(2):在reduce处理函数中,按照标识对数据进行处理。
(3):然后根据Key去join来求出结果直接输出。

在这里插入图片描述

代码详情

mapreduce-实验

实践:

(实践一)数值概要中combiner的作用

在前述数值概要的运用中,加入不同的combiner,测试不同环境下系统的性能,并给出分析、说明。
检查在内存优化模式下系统性能的区别。

Combiner的作用和用法
①每一个map可能会产生大量的输出,Combiner的作用就是在map端对输出先做一次合并,以减少传输到reducer的数据量。
②Combiner最基本是实现本地key的归并,Combiner具有类似本地的reduce功能。
如果不用Combiner,那么,所有的结果都是reduce完成,效率会相对低下。
使用Combiner,先完成的map会在本地聚合,提升速度。
注意:Combiner的输出是Reducer的输入,如果Combiner是可插拔的,添加Combiner绝不能改变最终的计算结果。所以Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。

结论:使用combiner先进行本地reduce,它能有效的减少mapper的输出以降低网络和reducer上的压力。另外注意,combine在数据转换上需与reducer等价。就是说,如果去掉combiner,输出应该保持不变。

(实践二)大数据平台的使用步骤

在这里插入图片描述

(实践三)MapReduce 布隆过滤器

过滤器训练、过滤器应用、结果验证及分析

布隆过滤器(Bloom Filter)是1970年由布隆提出,是一个很长的二进制向量和一系列随机映射函数,可以用于检索一个元素是否在一个集合中
优点:空间效率和查询时间都比一般的算法要好的多
缺点:有一定的误识别率和删除困难

(实践四)MapReduce Top 10模式示例

在ctrip数据集上进行Top 10排序。

Top10
• 无论数据集大小,都可以得到一个确定的 Top K输出集合
• 找出某一特定标准下的最好记录集
• 此模式需要一个比较两记录的比较函数
• 同时使用了mapper和reducer,mapper找出本地的Top K,reducer负责做合并后的Top K运算

在这里插入图片描述

(实践五)去重的用户—针对ctrip数据集去重

对ctrip数据集中的product-id进行去重操作

去重
• 遍历整个数据集,输出由唯一记录构成的集合
• 使用MapReduce框架的功能将相近记录分到一起实现去重
• 可以使用combiner提高效率
• Reducer基于键将null值分组,简单地输出键,保证其唯一性

在这里插入图片描述

代码详情

mapreduce-实践

### MapReduce 初学者编程实践教程 #### 实验五:Word Count 编程实例 对于初次接触MapReduce的开发者来说,理解其基本工作流程至关重要。MapReduce是一种用于处理大规模数据集的编程模型,它通过两个主要阶段来简化并行计算任务——映射(Map)和化简(Reduce)[^1]。 在本实验中,将指导读者创建一个简单的Java Maven项目,在本地环境中运行Hadoop集群上的WordCount应用程序。此案例旨在帮助学习者掌握如何利用分布式文件系统(HDFS),以及怎样编写Mapper类与Reducer类之间的协作逻辑[^2]。 ```java // Mapper.java 文件内容如下: import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); StringTokenizer itr = new StringTokenizer(line.toLowerCase()); while (itr.hasMoreTokens()) { word.set(itr.nextToken().trim()); context.write(word, one); } } } ``` 接着定义Reducer部分: ```java // Reducer.java 文件内容如下: import java.util.Iterator; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable> { public void reduce(Text key, Iterable<IntWritable> values, Context context ) throws IOException, InterruptedException{ int sum=0; Iterator<IntWritable> iterator = values.iterator(); while(iterator.hasNext()){ sum +=iterator.next().get(); } context.write(key,new IntWritable(sum)); } } ``` 最后配置Job驱动器以启动整个过程: ```java // Driver.java 文件内容如下: 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.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCountDriver { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf,"word count"); job.setJarByClass(WordCountDriver.class); job.setMapperClass(WordCountMapper.class); job.setCombinerClass(WordCountReducer.class); job.setReducerClass(WordCountReducer.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 ); } } ``` 上述代码展示了完整的WordCount程序结构,包括输入路径、输出路径设置等细节操作。这有助于加深对MapReduce框架的理解,并为进一步探索更复杂的算法打下坚实的基础[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百里 Jess

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值