Mapreduce定义:
Mapreduce是一个分布式计算的编程框架
如果没有mapreduce编程框架如何实现分布式计算:
- 实现服务器之间的相互通信(解决任务的执行顺序问题)
- 多线程并发执行任务
一个完整的mapreduce程=用户业务逻辑代码+默认的组件
用户业务逻辑代码:解决实际的计算问题的代码
默认组件:将底层多线程,通信等交互信息封装成编程框架
mapreduce的优点与缺点
优点:
- 易编程,用户只需要写业务逻辑代码,剩下的由框架去实现
- 良好的扩展性,可以动态的增加服务,提高服务器的性能
- 高容错,当一个服务器挂掉,会重新分配任务到其他服务器上
4.海里数据的计算,上千台服务器同时计算,可计算Tb级别的数据
缺点:
- 不适合实时计算 (计算数据长)
- 不擅长流计算 (流:来一个数据就立马处理。批:先存一批数据在进行计算)
- 不擅长DAG计算(迭代计算,上一个计算结果输出做为下一个计算的输入)
Mapreduce的实例进程:
Mrappmaster:负责mapreduce程序的调度和协调(只有一个)
Maptask:负责map阶段处理
Reducetask:负责reduce阶段的处理
在mapreduce编程中只能有一个map阶段和一个reduce阶段,或许直接map阶段结束任务
在mapreduce编程中不能有多个map阶段
在复杂的业务逻辑中只能mapreduce程序串行运行
- 在Mapreduce程序中是以<k,v>的形式进行传输的
- 以k进行排序与分组等操作
BooleanWriable:标准布尔型数
ByteWriable:单字节数
DoubleWriable:双字节数值
FloatWriable:浮点数
IntWriable:整型数
LongWriable:长整型数
Text:文本
Mapreduce的执行过程
- 对输入数据进行逻辑切片(以块的大小 默认:128m)
- 将切片分发给maptask处理(有几个切片就有几个task)
- 以<k,v>的形式读取切片 读取方式默认为按行读取 k为行的偏移量(每以行的起始位置) v为行的文本内容
- 调用mapper类中的用户编写map方法对输入数据处理,以k,v的形式输出
- 按照一定规则对map输出进行分区,默认不分区,分区的数量等与reduce的数量
- 将map输出写入内存缓存区(。避免直接写入,减少对磁盘的冲击力,提高效率),当缓冲区满时溢出成为一个个临时文件,在溢出的同时对其进行排序
- 对溢出的文件进行merge合并,保证一个task只有一个最终文件
- reduce主动向map复制提取需要的数据
- 对提取过来的数据进行合并,将分散的数据合并成为一个大文件,在对合并数据进行排序 按k的进行字典排序
为什么要合并:在复制过来的文件中文件与文件直接可能有相同的数据,合并将相同的数据以k键放入一组以wordcount为例 最终输入到reduce方法中的k,v形式为[k,(1,1,1,1)
- 对排序后的键值对调用reduce方法进行处理,将结果以k,v的形式写入hdfs中
Shuffle机制:
Shuffle是洗牌的意思,将数据进行排序
Shufell是mapreduce阶段从map的输出开始到输入reduce阶段的过程
Shuffle的弊端
shuffle机制存在的导致mapreduce程序运行慢
原因在于shuffle阶段反复涉及内存与磁盘的往复
Map阶段
缓存区之前是在内存中 内存
合并后数据写入磁盘 磁盘
Reduce阶段
复制提出是从磁盘中读取 磁盘
读取到内存中处理 内存
处理完之后写入磁盘 磁盘