hadoop调优
MR优化
-
数据输入
- 合并小文件
- 除了CombinTextInputFormat还有什么方法合并?
- 使用CombinTextInputFormat合并小文件
- 合并小文件
-
Map阶段
- 减少溢写(spill)次数
- 减少合并(merge)次数
- 不影响业务需求下,使用combin处理
-
Reduce阶段
-
合理设置map和reduce个数:
,并不一定是128M
如果性能足够好,可以多划分map提高并行处理效率(虽然会有跨节点读数据,但是比单个maptask处理效率要高) -
设置map、reduce共存:
调整slowstart.completedmaps
参数,意思就是在map运行一段时间后,reduce开始从maptask输出的文件拷贝文件到reducetask
,减少reduce等待时间 -
规避使用reduce:因为reduce在拉取数据的时候会从多个节点拉取文件,产生大量的网络消耗。
-
合理使用reduce端的buffer缓存:因为reduce阶段默认是有一个
缓存区存从maptask拷贝的文件
,当文件大于缓冲区阈值
的时候就会往磁盘写
(默认是堆内存的百分比)mapreduce reduce input buffer percent
,默认为
0.0.当值大于0的时候,会保留指定比例的内存读Bufe中的数据直接拿给
Redicet使用。这样一来,设置Buir需要内存,读取数要内存, Reducen
也要内存,年的运行情兄进行整
-
-
IO传输
- 压缩
- 使用SequenceFile二进制文件
-
数据倾斜问题
- 数据频率倾斜
- 数据大小倾斜
抽样和范围分区
自定义分区
根据抽样合理设置每个分区的大小Map阶段combine
采用map join
尽量避免使用Reduce join
-
常用的调优参数
mapred-site.xml配置
mapreduce.map.memory.mb
和mapreduce.reduce.memory.mb
- 一个MapTask或ReduceTask可使用的资源上限
默认为1024
。如果MapTask实际使用的资源量超过该值,则会被强制杀死。
mapreduce.map.cpu.vcores
和mapreduce.reduce.cpu.vcores
- 每个MapTask和ReduceTask可用的cpu核心数
shuffer相关
mapreduce.reduce.shuffle.parallelcopies
和mapreduce.reduce.shuffle.merge.percent
- 每个Reduce去Map中取数据的并行数。默认值是5
- Reduce的缓冲区Buffer中的数据达到多少比例开始写入磁盘。默认值0.66
mapreduce.reduce.shuffle.input.buffer.percent
- Buffer大小占Reduce可用内存的比例。默认值0.7
mapreduce.reduce.input.buffer.percent
- 指定多少比例的内存用来存放Buffer中的数据,默认值是0.0
yarn-site.xml设置
yarn.scheduler.minimum-allocation-mb
- 给应用程序Container分配的最小内存,默认值:1024
yarn.scheduler.maximum-allocation-mb
- 给应用程序Container分配的最大内存,默认值:8192
yarn.scheduler.minimum-allocation-vcores
和yarn.scheduler.maximum-allocation-vcores
- 每个Container申请的最小CPU核数,默认值:1
- 每个Container申请的最大CPU核数,默认值:32
yarn.nodemanager.resource.memory-mb
- 给Containers分配的最大物理内存,默认值:8192
shuffle关键优化
mapreduce.task.io.sort.mb
和mapreduce.map.sort.spill.percent
- 环形缓冲区的容量大小
- 环形缓冲区的溢出比例,默认80%
容错相关
mapreduce.map.maxattempts
- MapTask运行的最大重试次数,大于任务运行失败,默认值:4
mapreduce.reduce.maxattempts
ReduceTask
最大重试次数,同上
mapreduce.task.timeout
- 避免程序卡死的设置
- 为了防止因为用户程序永远Block住不退出,则强制设置了一个该超时时间(单位毫秒),默认是
600000
。如果你的程序对每条输入数据的处理时间过长(比如会访问数据库,通过网络拉取数据等),建议将该参数调大