Hadoop-MapReduce
MapReduce设计理念
map
- 映射(key value)
reduce
- 归纳
mapreduce必须构建在hdfs之上一种大数据离线计算框架
- 在线:实时数据处理
- 离线:数据处理时效性没有在线那么强,但是相对也需要很快得到结果
mapreduce不会马上得到结果,他会有一定的延时
- 如果数据量小,使用mapreduce反而不合适
- 杀鸡用牛刀
原始数据–>map(Key,Value)–>Reduce
分布式计算
- 将大的数据切分成多个小数据,交给更多的节点参与运算
计算向数据靠拢
- 将计算传递给有数据的节点上进行工作
计算流程
Block
- hdfs上数据存储的一个单元同一个文件中块的大小都是相同的因为数据存储到HDFS上不可变,所以有可能块的数量和集群的计算能力不匹配需要一个动态调整本次参与计算节点数量
Split
- 逻辑单位为了更好的去控制参与计算的节点数目。一个Split对应一个Map一般情况下Split为Block的整数倍(防止拉取数据的时候从多个Block拉取)Split>Block参与计算的节点少了Split<Block参与计算的节点多了默认情况下,Split切片的大小等于Block的大小,默认128M
Map
- Map数据拆分计算默认每次读取一行数据(默认选择的行读取器)我们可以对这一行数据进行拆分操作整个集群会一起执行很多的Job,每个Job里面有很多的Task,Task又分为MapTask和ReduceTask所以每个Task必须合理分配计算机资源(计算能力内存)默认情况下一个MapTask对应的内存资源
Shuffle
-
KvBufferr
- 1.环形数据缓冲区:当Map读取数据后,会计算产生临时结果,为了效率肯定在内存中进行但是计算的临时结果超过内存的大小,我们不得不将内存的数据临时存放到硬盘如果每次等到内存消耗完毕在写出到硬盘,会有一个阻塞的时间因为在写出的时候是不能继续计算的
-
Partation
-
Sort
-
Spill
- 3.溢写:将内存中已经排序好的数据写出到硬盘
-
Merge
- 4.合并:合并溢写的文件方便拉取
-
Fetch
- 5.拉取:就是将Map阶段合并的数据块中的结果拉取到对应的Reduce
-
Merge
- 6.合并:将从多个Map端拉取的数据合并到一起,方便操作
Reduce
- 相同Key的数据都在同一个Reduce中数据都是有序的相同key的数据都是相邻的计算的时候把相邻的数据取出来即可计算最终的结果
Output
- 需要将最终结果写出到存储(HDFS-Mysql-Redis)
MapReduce架构
MapReduce 1.x
-
client
-
客户端发送mr任务到集群
-
客户端的种类有很多种
- hadoop jar wordcount.jar
-
-
JobTracker
-
接受客户端的mr任务
- 选择一个资源丰富的,执行对应的任务
- 并且给这个任务分配资源
-
与TaskTracker保持心跳,接受汇报信息
-
-
TaskTracker
-
保持心跳,汇报资源
- 当前机器内存,当前机器任务数
-
当分配资源之后,开始在本机分配对应的资源给Task
-
并且实时监控任务的执行,并汇报
-
-
Task(MapTask–ReduceTask)
- 开始按照MR的流程执行业务
- 当任务完成时,JobTracker告诉TaskTracker回收资源
-
缺点:
-
单点故障
-
内存扩展
-
业务瓶颈
-
只能执行MR的操作
- 如果其他框架需要运行在Hadoop上,需要独立开发自己的资源调度框架
-
MapReduce 2.x
-
2.x开始使用Yarn(Yet Another Resource Negotiator,另一种资源协调者)统一管理资源
-
以后其他的计算框架可以直接访问yarn获取当前集群的空闲节点
-
client
-
客户端发送mr任务到集群
-
客户端的种类有很多种
- hadoop jar wordcount.jar
-
-
ResourceManager
-
资源协调框架的管理者
-
分为主节点和备用节点(防止单点故障)
- 主备的切换基于Zookeeper进行管理
-
时刻与NodeManager保持心跳,接受NodeManager的汇报
- NodeManager汇报当前节点的资源情况
-
当有外部框架要使用资源的时候直接访问ResourceManager即可
-
如果有MR任务,先去ResourceManager申请资源,ResourceManager根据汇报相对灵活分
-
配资源
-
资源在NodeManager1,NodeManager1要负责开辟资源
-
-
NodeManager
- 资源协调框架的执行者
- 每一个DataNode上默认有一个NodeManager
- NodeManager汇报自己的信息到ResourceManager
-
Container
- 2.x资源的代名词
- Container动态分配的
-
ApplicationMaster
- 我们本次JOB任务的主导者
- 负责调度本次被分配的资源Container
- 当所有的节点任务全部完成,application告诉ResourceManager请求杀死当前
- ApplicationMaster线程
- 本次任务所有的资源都会被释放
-
Task(MapTask–ReduceTask)