MapReduce基础入门

来源:互联网 发布:鲜知知命理博客 编辑:程序博客网 时间:2024/06/10 00:03

MapReduce的核心架构思想:

第一个阶段:任务的切分和并发运行


第二个阶段:结果的收集和最终汇总





1、MapReduce入门

1.1、什么是MapReduce

Hadoop的四大组件:
HDFS:分布式存储系统
MapReduce:分布式计算系统
YARN:hadoop的资源调度系统
Common:以上三大组件的底层支撑,主要提供基础工具包和RPC框架等

MapReduce是一个分布式运算程序的编程框架。
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。


1.2、MapReduce作用

MRAppMaster:MapReduce Application Master,分配任务,协调任务的运行。
MapTask:阶段并发任务,负责mapper阶段的任务处理 YARNChild

ReduceTask:阶段汇总任务,负责reducer阶段的任务处理 YARNChild


2、MapReduce程序的核心运行机制

2.1、概述

一个完整的MapReduce程序在分布式运行时有两种实例进程:
MRAppMaster:负责整个程序的过程调度及状态的协调
Yarnchild:负责map阶段的整个数据处理流程
Yarnchild:负责reduce阶段的整个数据处理流程
以上两个阶段MapTask和ReduceTask的进程都是YarnChild,并不是说这MapTask和ReduceTask就跑在同一个YarnChild进行里

2.2、MapReduce程序的运行流程

一个mr程序启动的时候,最先启动的是MRAppMaster,MRAppMaster启动后根据本次job的描述信息,计算出需要的maptask实例数量,然后向集群申请机器启动相应数量的maptask进程

maptask进程启动后,根据给定的数据切片(哪个文件的哪个偏移量范围)范围进行数据处理,主体流程为:
利用客户指定的inputformat来获取recordreader读取数据,形成输入kv对
将输入kv对传递给客户定义的map()方法做逻辑运算,并将map()方法输出的kv对收集到缓存
将缓存中的kv对,按照对k分区排序后不断写到磁盘文件

MRAppMaster监控到所有MapTask进程任务完成之后(真实情况是,某些MapTask进程处理完成后,就会开始启动reducetask去已完成的MapTask处fetch拿取数据),会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据范围(数据分区)。

reducetask进程启动后,根据MRAppMaster告知的待处理数据所在位置,从若干台MapTask运行所在机器上获取到若干个MapTask输出结果文件,并在本地进行重新合并排序,然后按照相同的key的kv为一个组,调用客户定义的reduce()方法进行逻辑运算,并收集运算输出的kv,然后调用客户指定的OutputFormat将结果数据输出到外部存储。

2.3、MapTask并行度决定机制

一个job的map阶段并行度由客户端在提交job时决定,客户端对map阶段并行度的规划基本逻辑为:
将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分成逻辑上的多个split),然后每个split分配一个MapTask并行实例处理
这段逻辑及形成的切片规划描述文件,是由FileInputFormat实现类的getSplits()方法完成的。该方法返回值是List<InputSplit>,InputSplit封装了每一个逻辑切片信息,包括长度和位置信息,而getSplits()方法返回一组InputSplit

2.4、切片机制

FileInputFormat中默认的切片机制
简单的按照文件的内容长度进行切片
切片大小,默认等于block大小
切片是不考虑数据集整体,而是逐个针对每个文件单独切片

FileInputFormat中切片的大小参数配置
通过分析源码:在FileInputFormat中,计算切片大小逻辑:
long splitSize = conputeSplitSize(blockSize,minSize,maxSize)
翻译一下就是求这三个值中间值。
blockSize:默认是128M,可通过dfs.blocksize修改
minSize:默认是1,可通过mapreduce.input.fileinputformat.split.minsize修改
maxSize:默认是Long.MaxValue,可通过mapreduce.input.fileinputformat.split.maxsize修改
但是无论怎么调参数,都不能让多个小文件'划入'一个split


2.5、MapTask并行度经验之谈

如果一个集群有50个节点,要计算的数据块200个,同一个节点启动的MapTask的个数:
maptask1 : 启动jvm --- 执行计算 --- 关闭jvm
maptask2 : 启动jvm --- 执行计算 --- 关闭jvm
maptask3 : 启动jvm --- 执行计算 --- 关闭jvm
maptask4 : 启动jvm --- 执行计算 --- 关闭jvm
解决方案:
启动一个jvm进程-- 执行计算 -- 执行计算 -- 执行计算 -- 执行计算 -- 关闭jvm
要去衡量jvm重用的次数所节省的时间和之前执行多个并行计算的时间
如果启动jvm的时间远远超过执行计算的时间的话。那么jvm重用将变得非常的有用。
配置task的JVM重用:
mapred.job.reuse.jvm.num.tasks,默认1

2.6、ReduceTask并行度决定机制

reduce的并行度同样影响着这个job的执行并发度和执行效率,但与MapTask的并发数由切片数量决定不同,Reducetask数量的决定也可以手动设置:
job.setNumReduceTasks(4);
默认值是1,手动设置为4,表示运行4个reduceTask,设置为0 ,表示不运行reduceTask任务,也就是没有reduce阶段,mapper的输出直接作为结果。