1.MapReduce概念
MapReduce是一个分布式计算框架,它被设计用于并行计算海量数据。第一个提出该技术框架的是Google公司,而Google的灵感则来自于函数式编程语言,如LISP,Scheme,ML等。
Map:过滤一些原始数据
Reduce:处理这些数据,得到我们想要的结果
当你向MapReduce框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map任务,然后分配到不同的节点上去执行,每个Map任务处理输入数据中的一部分,当Map任务完成后,它会生成 一些中间文件,这些中间文件将会作为Reduce任务的输入数据,Reduce任务的主要目标就是把前面若干个Map的输出汇总到一起并输出。
MapReduce执行步骤:
map任务处理:
1.读取输入文件内容,解析成键值对(key/value)。对输入文件的每一行,解析成键值对(key/value ),每一个键值对调用一次map函数。
2.写自己的逻辑,对输入的键值对(key/value)处理,转换成新的键值对(key/value)输出。
3.对输出的键值对(key/value)进行 分区(partition).
4.对不同分区的数据,按照key进行排序,分组,相同的key/value 放到一个集合中。(shuffle)
5.分组后的数据进行归约。(combiner,可选的)
reduce任务处理
1.对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
2.对多个map任务的输出进行合并,排序,写reduce函数自己的逻辑,对输入key/value 处理,转换成新的key/value 输出。
3.把 reduce的输出保存到文件中(写入到HDFS中)。
简单一句话解释MapReduce就是:“任务的分解与结果的汇总”。
2.编写MapReduce程序模板
Mapreduce八股文
分为 Mapper,Reducer,Driver 三块
Step1:Mapper Class
Step2:Reducer Class
Step3:Driver
3.依据WordCount案例总结MR程序运行过程
Mapper 任务的六个运行过程
- 把文件按照一定的标准分片(InputSplit),每个输入片的大小是固定的。
- 对输入片中的记录按照一定的规则解析成键值对。
- 调用Mapper类中的map方法。
- 按照一定的规则对第三阶段输出的键值对进行分区。
- 对每个分区的键值对进行排序。
- 对数据进行归约处理,也就是reduce操作。键相等的键值对会调用一次reduce方法。经过这一阶段,数据量会减少,归约后的数据输出到本地的Linux文件中。
Reduce 任务的三个执行过程
- List itemReducer任务会主动从Mapper任务复制其输出的键值对。Mapper任务可能会有很多,因此,Reduce 会复制多个Mapper的输出。
- 把复制到Reducer 本地数据,全部进行合并,即把分散的数据合并成一个大的数据。再对合并后的数据排序。
- 对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对,最后把这些输出的键值对写入到HDFS文件中。
注意事项:
【第一点】
默认情况下,map输入<key,balue>对格式
Key:偏移量,Value:文件中的每一行值。
【第二点】
map-> partition 分区 sort 排序 group 分组 -> reduce
【例】对单词进行词频统计,a-z开头的单词,A-Z开头的单词
Partition: map输出 key / value 对后,partition根据分区规则将单词分到不同的reduce中。
Group: 将相同key的 value 组合在一起。
partition 分区 sort 排序 group 分组 三块都是可以指定的。
【第三点】
reduce 输出的结果,一般情况下,key 和value 作为一行数据进行输出
key 和 value 之间的分隔符为制表符 \t
总结
MapReduce 运行的时候,会通过 Mapper 运行的任务读取HDFS 中的数据文件,然后调用自己的方法,处理数据,最后输出。Reducer 任务会接收Mapper 任务输出的数据,作为自己的输入数据,调用自己的方法,最后输出到HDFS的文件中。
如有任何问题,可在评论区留言,相互探讨!