JobTracker/ResourceManager:任务调度,管理多个TaskTracker.ResourceManager是Hadoop2.0后引入yarn管理机制
Tasktracker/NodeManager:任务执行者
任务流程
从HDFS中获取数据
MapReduce会将输入数据进行逻辑切片,每一个切片是一个InputSplit对象
每一个InputSplit对象会交给一个MapTask来执行
切片中每一行数据都会出发一次map方法
map方法的输入的键默认为数据偏移量,输入的值为这一行的数据;输出的键以及值的类型根据业务确定
在Barrier阶段,会将所有相同的键所对应的值放入一个ArrayList中,然后产生一个迭代器交给ReduceTask来执行<br>
在ReduceTask中,每一个键都会触发一次reduce方法
将结果写到HDFS中
Mapper
MapTask在接收到FileSplit之后按行读取
每一个切片对应一个MapTask,每一个MapTask对应一个缓冲区
每读取一次调用一次map方法
执行完毕输出到缓冲区
缓冲区默认100M,可以通过io.sort.mb来进行调节
缓冲区中,会对数据进行分区-partition,排序 -sort,合并 -combine操作
缓冲区利用率达到0.8是,会启动一个后台线程将缓冲区写到指定目录的溢写文件中,过程称之为spill
每次spill都会产生一个新的溢写文件
所有数据写完后对溢写文件进行合并(merge),如果文件个数>=3,合并完成之后再执行一次Combiner
Reducer
ReduceTask通过HTTP的方式来得到输出文件的分区,这个过程称之为fetch
每一个ReduceTask将获取的分区的数据再次进行merge,然后进行排序
将相同的key做聚合,将值放入迭代器中,这一步称之为grouping
调用reduce方法,将key和迭代器传入
fetch默认线程数是5
ReduceTask的阈值为5,%,即当5%的MapTask完成之后,ReduceTask就开始启动
Merge因子默认为10,即每10个文件合并成一个文件
shuffle调优
map阶段
调大缓冲区,一般调为250~350M
可以引入combine过程
merge之后的文件可以进行压缩,减少网络传输的消耗
Reduce阶段
增多fetch的线程数
降低ReduceTask的阈值
提高merge因子