MAPREDUCE是什么
一个分布式运算程序的编程框架
能将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上
为什么要MAPREDUCE
因为它能解决海量数据的分析
整体结构
- MRAppMaster(mapreduce application master):负责整个程序的过程调度及状态协调
- MapTask:负责map阶段的整个数据处理流程
- ReduceTask:负责reduce阶段的整个数据处理流程
MR程序运行流程
过程
1、一个mr程序启动的时候,最先启动的是MRAppMaster,MRAppMaster启动后根据本次job的描述信息,计算出需要的maptask实例数量,然后向集群申请机器启动相应数量的maptask进程
2、maptask进程启动之后,根据给定的数据切片范围进行数据处理,主体流程为:
- a) 利用客户指定的inputformat来获取RecordReader读取数据,形成输入KV对
- b) 将输入KV对传递给客户定义的map()方法,做逻辑运算,并将map()方法输出的KV对收集到缓存
- c) 将缓存中的KV对按照K分区排序后不断写到磁盘文件(缓存文件)
3、 MRAppMaster监控到所有maptask进程任务完成之后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据范围(数据分区)
4、Reducetask进程启动之后,根据MRAppMaster告知的待处理数据所在位置,从若干台maptask运行所在机器上获取到若干个maptask输出结果文件,并在本地进行重新归并排序,然后按照相同key的KV为一个组,调用客户定义的reduce()方法进行逻辑运算,并收集运算输出的结果KV,然后调用客户指定的outputformat将结果数据输出到外部存储。
mapreduce和yarn的工作机制
MapTask并行度决定机制
maptask的并行度决定map阶段的任务处理并发度(说到底就是是否高效问题)
一个job的map阶段并行度由客户端在提交job时决定。
客户端对map阶段并行度的规划的基本逻辑
将待处理数据执行逻辑切片(按照一个特定大小,将待处理数据划分成逻辑上的多个split),然后每一个split分配一个mapTask并行实例处理。
形成切片规划描述文件过程图:
FileInputFormat切片机制
1、切片定义在InputFormat类中的getSplit()方法
2、FileInputFormat中默认的切片机制:
- a) 简单地按照文件的内容长度进行切片
- b) 切片大小默认等于block大小(128M)
- c) 切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
案例
待处理数据有两个文件
file1.txt 320M
file2.txt 10M
经过FileInputFormat的切片机制运算后,形成的切片信息如下:
file1.txt.split1-- 0~128
file1.txt.split2-- 128~256
file1.txt.split3-- 256~320
file2.txt.split1-- 0~10M
FileInputFormat中切片的大小的参数配置
参数 | 默认值 | 配置参数 |
minsize | 1 | mapreduce.input.fileinputformat.split.minsize |
maxsize | Long.MAXValue | mapreduce.input.fileinputformat.split.maxsize |
切片大小=Math.max(minSize, Math.min(maxSize, blockSize));
ReduceTask并行度的决定
reducetask的并行度同样影响整个job的执行并发度和执行效率
reducetask数量可以直接手动设置
- //默认值是1,手动设置为4
- job.setNumReduceTasks(4)
如果数据分布不均匀,就有可能在reduce阶段产生数据倾斜。
注意: reducetask数量并不是任意设置,还要考虑业务逻辑需求,有些情况下,需要计算全局汇总结果,就只能有1个reducetask。
尽量不要运行太多的reduce task。对大多数job来说,最好rduce的个数最多和集群中的reduce持平,或者比集群的 reduce slots小。这个对于小集群而言,尤其重要。
MAPREDUCE程序运行模式
本地运行模式
- (1)mapreduce程序是被提交给LocalJobRunner在本地以单进程的形式运行
- (2)而处理的数据及输出结果可以在本地文件系统,也可以在hdfs上
- (3)怎样实现本地运行?写一个程序,不要带集群的配置文件(本质是你的mr程序的conf中是否有mapreduce.framework.name=local以及yarn.resourcemanager.hostname参数)
- (4)本地模式非常便于进行业务逻辑的debug,只要在eclipse中打断点即可
如果在windows下想运行本地模式来测试程序逻辑,需要在windows中配置环境变量
%HADOOP_HOME% = d:/hadoop-2.6.1
%PATH% = %HADOOP_HOME%\bin
并且要将d:/hadoop-2.6.1的lib和bin目录替换成windows平台编译的版本
集群运行模式
(1)将mapreduce程序提交给yarn集群resourcemanager,分发到很多的节点上并发执行
(2)处理的数据和输出结果应该位于hdfs文件系统
(3)提交集群的实现步骤:
- A、将程序打成JAR包,然后在集群的任意一个节点上用hadoop命令启动
- $ hadoop jar wordcount.jar cn.itcast.bigdata.mrsimple.WordCountDriver inputpath outputpath
- B、直接在linux的eclipse中运行main方法
- (项目中要带参数:mapreduce.framework.name=yarn以及yarn的两个基本配置)
- C、如果要在windows的eclipse中提交job给集群,则要修改YarnRunner类
mapreduce程序在集群中运行时的大体流程