MapReduce是一种用于大规模数据集处理的编程模型,其设计思想是将任务分解为多个小任务,分别在多台机器上并行执行,最后汇总各任务的结果,MapReduce由两个主要阶段组成:Map阶段和Reduce阶段。
MapReduce概述
MapReduce是Google于2004年提出的一个编程模型,用于处理和生成大数据集,它通过将计算任务分解成多个小任务,在分布式系统中并行处理这些任务,从而加快数据处理速度,MapReduce的核心在于“分而治之”的思想,即将复杂任务拆解成简单的子任务,每个子任务独立运行,最终将结果汇总得到完整结果。
MapReduce工作原理
MapReduce的工作流程主要包括以下几个步骤:
1、输入分割:输入数据被分割成多个独立的数据块,通常每个数据块的大小为64MB或128MB。
2、Map阶段:每个数据块由一个Mapper处理,Mapper将输入的数据转换成键值对(keyvalue pairs),lt;k1, v1>。
3、Shuffle和Sort阶段:系统将所有Mapper输出的键值对进行排序和分组,以便相同键的值能聚合在一起。
4、Reduce阶段:Reducer接收到相同键的所有值,对这些值进行处理并输出最终结果,lt;k2, v2>。
5、输出结果:处理后的数据被写入到HDFS中,供后续使用。
WordCount实例
WordCount是MapReduce的经典案例,用于统计文本文件中每个单词的出现次数,以下是具体的实现步骤和代码示例:
1. 需求分析
在给定的文本文件中统计每个单词出现的总次数。
2. 数据准备
需要统计单词的文本文件,例如word.txt。
3. 编写程序
导入依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4jcore</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoopcommon</artifactId> <version>2.7.2</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoopclient</artifactId> <version>2.7.2</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoophdfs</artifactId> <version>2.7.2</version> </dependency> </dependencies>
Mapper类实现
package com.bigdata.mapreduce.wordcount; import java.io.IOException; 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 Text k = new Text(); private IntWritable v = new IntWritable(1); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); String[] words = line.split("\s+"); for (String word : words) { k.set(word); context.write(k, v); } } }
Reducer类实现
package com.bigdata.mapreduce.wordcount; import java.io.IOException; 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> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); } }
Driver类实现
package com.bigdata.mapreduce.wordcount; 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); } }
常见问题及解答FAQs
1. Hadoop集群如何启动和停止?
答:启动Hadoop集群通常包括启动HDFS和YARN,具体命令如下:
启动NameNode和DataNode:
$ startdfs.sh
启动ResourceManager和NodeManager:
$ startyarn.sh
停止Hadoop集群:
$ stopyarn.sh $ stopdfs.sh
2. 如何在Hadoop中查看作业运行状态?
答:可以通过访问Hadoop的资源管理器(ResourceManager)Web界面来查看作业的运行状态,默认情况下,ResourceManager的Web界面可以通过以下URL访问:http://localhost:8088,在该页面上,你可以查看正在运行的作业、已完成的作业以及失败的作业的详细信息。
由于MapReduce代码通常是在Hadoop环境中运行的,这里我将提供一个简单的MapReduce Java代码示例,该代码用于统计一个文本文件中单词的出现次数,下面是一个表格,其中包含了MapReduce代码的主要部分,包括Mapper和Reducer的代码。
类别 | 代码示例 |
Mapper类 | “java “ |
Reducer类 | “java “ |
配置类 | “java “ |
上述代码示例假设你已经有一个基本的Hadoop环境,并且理解了Hadoop的MapReduce编程模型,这个示例中的Mapper类负责读取输入的文本,分割成单词,并将它们转换为小写,然后将每个单词和1(IntWritable)一起写入上下文(Context),Reducer类则接收来自Mapper的输出,并计算每个单词的总出现次数,Driver类用于配置和运行MapReduce作业。
由于这是一个简单的例子,它没有处理一些可能的边缘情况,比如空字符串、非常长的单词等,在实际应用中,你可能需要添加额外的逻辑来处理这些情况。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1220932.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复