✅作者简介:大家好,我是Philosophy7?让我们一起共同进步吧!🏆
📃个人主页:Philosophy7的csdn博客
🔥系列专栏:Hadoop
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博>主哦🤞
MapReduce
一、简单认识MapReduce
定义:
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。
优势:
①易于编程的
②良好的扩展性
③高容错
缺点:
①不擅长实时计算,因为要读写磁盘,大大影响了效率。
②不擅长流式计算,MapReduce处理的数据是静态的,无法动态变化。
③不擅长DAG(有向无环图)计算
二、官方案例WordCount
常用的数据序列化类型
Java类型Hadoop Writable类型BooleanBooleanWritableByteByteWritableIntIntWritableFloatFloatWritableLongLongWritableDoubleDoubleWritableStringTexxtArrayArrayWritableMapMapWritableNullNullWritable
编程步骤: Mapper、Reducer、Driver
Mapper阶段:
①自定义Mapper继承父类
②Mapper输入数据的格式是K V
③业务逻辑代码编写在map方法中
④输出的数据格式有是K V
⑤map()方法 对每一个KV调用一次Reducer阶段:
①自定义Reducer继承父类
②Reducerr输入数据类型对应Mapper输出的数据类型 也是KV
③业务逻辑代码编写在reduce方法中
④reduce()方法 对每一个KV调用一次Driver阶段:
将任务提高到Yarn集群当中,提交的MapReduce任务会被封装到Job对象中。
环境搭建
<dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.1.3</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>
①编写Mapper类
importjava.io.IOException;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.LongWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Mapper;publicclassWordCountMapperextendsMapper<LongWritable,Text,Text,IntWritable>{Text k =newText();IntWritable v =newIntWritable(1);@Overrideprotectedvoidmap(LongWritable key,Text value,Context context)throwsIOException,InterruptedException{// 1.获取文本文件当中的一行数据String line = value.toString();// 2 以空格字符串切割String[] words = line.split(" ");// 3 输出for(String word : words){
k.set(word);
context.write(k, v);}}}
②编写Reducer类
importjava.io.IOException;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Reducer;publicclassWordCountReducerextendsReducer<Text,IntWritable,Text,IntWritable>{int sum;IntWritable v =newIntWritable();@Overrideprotectedvoidreduce(Text key,Iterable<IntWritable> values,Context context)throwsIOException,InterruptedException{// 1 累加求和
sum =0;for(IntWritable count : values){
sum += count.get();}// 2 输出
v.set(sum);
context.write(key,v);}}
③Driver阶段提交任务
importjava.io.IOException;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;publicclassWordCountDriver{publicstaticvoidmain(String[] args)throwsIOException,ClassNotFoundException,InterruptedException{// 1 获取配置信息以及获取job对象Configuration conf =newConfiguration();Job job =Job.getInstance(conf);// 2 关联本Driver程序的jar
job.setJarByClass(WordCountDriver.class);// 3 关联Mapper和Reducer的jar
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);// 4 设置Mapper输出的kv类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);// 5 设置最终输出kv类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);// 6 设置输入和输出路径FileInputFormat.setInputPaths(job,newPath(args[0]));FileOutputFormat.setOutputPath(job,newPath(args[1]));// 7 提交jobboolean result = job.waitForCompletion(true);System.exit(result ?0:1);}}
三、写在最后的话
⭐收藏 您的收场将是我最大的动力
👍点赞 您的赞将会让我无比的感动
🌹关注 给我一个关注还你一片温暖的春天。
版权归原作者 Philosophy7 所有, 如有侵权,请联系我们删除。