1.核心思想:“分而治之”(Map—映射,Reduce—归约)。就是“任务的分解和结果的汇总”
2.MapReduce执行的角色(进程):
一个是JobTracker;另一个是TaskTracker。JobTracker用于调度(安排)工作的,TaskTracker用于执行工作发、的。一个Hadoop集群中只有一台JobTracker,有若干个TaskTracker。
把处理过程高度抽象为两个函数:map和reduce
map负责把任务分解成多个任务
reduce负责把分解后多任务处理的结果汇总起来
3.适用场景
待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理。
4.MapReduce处理过程
在Hadoop中,每个MapReduce任务都被初始化为一个Job,Job将数据划分为多个数据块,每个数据块对应一个计算任务(Task),并自动调用计算节点来处理相应的数据块。每个Job又可以分为两种阶段:map阶段和reduce阶段。
这两个阶段分别用两个函数表示,即map方法和reduce方法。map方法接收一个<key, value>形式的输入,然后同样产生一个<key, value>形式的中间输出,reduce方法接收一个如<key, (list of values)>形式的输入,然后对这个value集合进行处理,每个reduce产生0或1个输出,reduce的输出也是<key, value>形式的
将map的输入传给reduce的过程就是shuffle。而shuffle是mapReduce的核心,主要工作是从Map结束阶段到Reduce阶段,可以分为Map端的Shuffle和Reduce端的Shuffle。
5.hadoop内置数据类型介绍
BooleanWritable:标准布尔型数值
ByteWritable:单字节数值
DoubleWritable:双字节数
FloatWritable:浮点数
IntWritable:整型数
LongWritable:长整型数
Text:使用UTF8格式存储的文本
NullWritable:当<key, value>中的key或value为空时使用
6.编写MapReduce程序的步骤
(1.建立三个Java类 mapper reducer job)
(1)Mapper类(重写mapper类)
Mapper类有两个包:
org.apache.hadoop.mapreduce、org.apache.hadoop.mapred
org.apache.hadoop.mapred是hadoop 1.x版本的,负责资源的调度和计算
org.apache.hadoop.mapreduce是hadoop 2.x和3.x版本的,负责数据的计算
<>:泛型,数据匹配类型
输入键值对(固定值):
key----整数(偏移量)----LongWritable
value----字符串(每一行的文本内容)----Text
输出键值对
key----字符串----Text
value----整数----IntWritable
public class WcMapper extends Mapper<LongWritable, Text,Text, IntWritable>{
@Override
protected void map(LongWritable key,Text value,Mapper<LongWritable, Text,Text,IntWritable>.Context context) throws IOException,InterruptedException
}
(2)Reducer类(重写reduce类):对相同键的键值对的多个值进行计算(求和、求平均值、求最大值、求最小值)
输入键值对---map的输出(与map输出类型相同)
键------Text
值-------Interwritable
输出键值对---
<hello,5>
<hadooop,1>
键-------Text
值-------IntWritable
经过reduce方法后,输出的键值对中的 键---不变,仍然为单词本身 key 值---对输入键值对中的值中的元素惊醒求和
(3)Job类
1.创建配置对象-------Configuration
Configuration conf = new Configuration();
2.创建Job对象
Job job = Job.getInstance(conf);
3.指名哪个类为Job类
job.setJarByClass();
4.指定哪个类为Mapper类
job.setMapperClass(ScoreMapper.class);
5.指定打个雷为reduce类
job.setReducerClass(ScoreReducer.class);
6.指定map的过程的输出键值对的数据类型(如果map和reduce数据类型完全一致,可以不用指定map过程的输出键值对数据类型)
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
7.指定reduce过程的输出键值对的数据类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
8.指定输入的数据文件的路径----Path
Path input = new Path("D:\\Hadoop\\hdfs\\score.csv");
9.指定输出的数据文件的路径
Path output = new Path("D:\\Hadoop\\hdfs\\output3");
10.指定输入何和输出文件的路径
FileInputFormat.setInputPaths(job,input);
FileOutputFormat.setOutputPath(job,output);
或者
7.指定reduce过程的输出键值对的数据类型
8.指定输入的数据文件的路径----Path
9.指定输出的数据文件的路径
10.指定输入何和输出文件的路径
匿名对象,给创建的对象不起名
FileInputFormat.setInputPaths(job,new Path("D:\\Hadoop\\hdfs\\score2.txt"));
FileOutputFormat.setOutputPath(job,new Path("D:\\Hadoop\\hdfs\\output4"));
11.提交job任务,等待执行完成,并输出执行过程明细
job.waitForCompletion(true);
925

被折叠的 条评论
为什么被折叠?



