hadoop JOB的性能优化实践
使用了几个月的hadoopMR,对遇到过的性能问题做点笔记,这里只涉及job的性能优化,没有接触到
hadoop集群,操作系统,任务调度策略这些方面的问题。
hadoop MR在做大数据量分析时候有限的计算资源情况下只能不断的优化程序。
优化可以从两个方面进行:
1.hadoop配置
2.程序代码
程序代码包括的方面很多:job设计,算法,数据结构,代码编写。
hadoop配置优化
hadoop配置可分为mapp配置,reducer配置和hdfs配置。关于hadoop mapper和reducer阶段
处理流程和参数意义可以看这个帖子,说的比较详细hadoop mr 参数意义。
这里再补充几个配置:

dfs.block.size
这个配置项定义了在HDFS上每个block的大小,它的值是以字节为单位。
可以在配置文件hadoop-site.xml(Hadoop 0.20 以前版本)定义,
也可以在JobConf里定义。hdfs中block size定义是以文件为粒度的。
hadoop的mapper数基本由输入文件的block数决定,如果输入的block
size不够大,导致mapper处理时间很短(不到一分钟),大量这样的mapper
会严重降低计算性能。但是如果输入文件都是小文件,就算blocksize再大,每个
文件也会占一个block,这时候要通过合并小文件来减少mapper数,设置blocksize
是没用的。命令行设置块大小可以加参数,0.20以后的用
hadoop fs -D dfs.block.size=134217728 -put local_name remote_location
之前的可以用fs.local.block.size 参数
除了blocksize hadoop的inputformat也提供了在block的基础上更细粒度控制mapper
输入块大小,比如当前输入块128M,设置了最大分割size为64,则原先一个块被切分
成两个spliter了,也就产生了两个mapper。用这种方法可以有效增加mapper数,但对减少
mapper数好像没用。
FileInputFormat.setMaxInputSplitSize(job, size)
FileInputFormat.setMinInputSplitSize(job, size)
mapred.min.split.size这个参数也可以起到同样效果
mapred.map.tasks.speculative.execution 和
mapred.reduce.tasks.speculative.execution
这两个选项是设置推测执行的任务,当所有task都开始运行之后,Job Tracker会统计所有任务的平均进度,
如果某个task所在的task node机器配置比较低或者CPU load很高(原因很多),导致任务执行比总体任务的平均执行要慢,
此时Job Tracker会启动一个新的任务(duplicate task),这个新任务就是推测任务,原有任务和新任务哪个先执行完就把另外一个kill掉,
这也是我们经常在Job Tracker页面看到任务执行成功,但是总有些任务被kill,就是这个原因。推测任务也是要占用计算资源,
因此计算资源紧张,任务执行本身很耗资源情况下可以考虑设置成false,禁止执行。
io.sort.mb
以MB为单位,默认100M,通常来看,这个值太小了,这个选项定义了map输出结果在内存占用buffer的大小,当buffer达到一定阈值,
会启动一个后台线程来对buffer的内容进行排序,然后写入本地磁盘(一个spill文件)。可以观察hadoop的日志,如果spill次数比较多说明
这个缓存大小设置太低,特别是那种mapper中处理数据会增多的逻辑尤其可以关注下。
根据map输出数据量的大小,可以适当的调整buffer的大小,注意是适当的调整,不是越大越好,假设内存无限大,io.sort.mb=1024(1G),
和io.sort.mb=300 (300M),前者未必比后者快,因为1G的数据排序一次和排序3次,每次300MB,一定是后者快(分而治之的思想)。
io.sort.spill.percent
这个值就是上述buffer的阈值,默认是0.8,既80%,当buffer中的数据达到这个阈值,后台线程会起来对buffer中已有的数据进行排序,
然后写入磁盘,此时map输出的数据继续往剩余的20% buffer写数据,如果buffer的剩余20%写满,排序还没结束,map task被block等待。
如果你确认map输出的数据基本有序(很少见),排序时间很短,可以将这个阈值适当调高,更理想的,如果你的map输出是有序的数据(基本不可能吧?),
那么可以把buffer设的更大,阈值设置为1.
Io.sort.factor
同时打开磁盘spill进行并行合并的文件数,默认是10。
当一个map task执行完之后,本地磁盘上(mapred.local.dir)有若干个spill文件,map task最后做的一件事就是执行merge sort,
把这些spill文件合成一个文件(partition),有时候我们会自定义partition函数,就是在这个时候被调用的。
执行merge sort的时候,每次同时打开多少个spill文件,就是由io.sort.factor决定的。打开的文件越多,不一定merge sort就越快,所以也要根据数据情况适当的调整。
补充:merge排序的结果是两个文件,一个是index,另一个是数据文件,index文件记录了每个不同的key在数据文件中的偏移量(这就是partition)

代码优化
有空再写
各种配置
Mapper端配置
1.Map逻辑处理后数据被展开,写磁盘次数剧增,可以观察日志中的spill次数,调整各个参数
2.中间结果能不展开就不展开,尽量缩小Mapper和reducer之间的数据传递
3.distribute cache中加载的数据能不用hashmap就尽量不要用,hashmap会使得内存占用量是原数据的5-10倍,其中
引用占了大量空间
4.distribute cache中加载的数据要尽可能简单,如果有复杂的处理逻辑可以单独开辟Mapper Reducer进行一轮处理,
避免每次mapper都要处理一遍,尽可能减少distribute cache的数据量
5.观察GC的情况,有时候是因为内存占用量高,频繁GC,严重影响处理速度
6.当逻辑本身很简单,但是处理速度很慢时候首先要怀疑Mapper和Reducer之间传输数据量过大,其次是GC情况
7.适当控制mapper的数量,特别是有distribute cache的场景
hadoop JOB的性能优化实践的更多相关文章
- Hadoop YARN:调度性能优化实践(转)
https://tech.meituan.com/2019/08/01/hadoop-yarn-scheduling-performance-optimization-practice.html 文章 ...
- 直播推流端弱网优化策略 | 直播 SDK 性能优化实践
弱网优化的场景 网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法.最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播.后来随着手机性能的提升和直播技 ...
- 手游录屏直播技术详解 | 直播 SDK 性能优化实践
在上期<直播推流端弱网优化策略 >中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...
- 转:携程App的网络性能优化实践
http://kb.cnblogs.com/page/519824/ 携程App的网络性能优化实践 受益匪浅的一篇文章,让我知道网络交互并不是简单的传输和接受数据.真正的难点在于后面的性能优化 下面对 ...
- Lazy<T>在Entity Framework中的性能优化实践
Lazy<T>在Entity Framework中的性能优化实践(附源码) 2013-10-27 18:12 by JustRun, 328 阅读, 4 评论, 收藏, 编辑 在使用EF的 ...
- Redis各种数据结构性能数据对比和性能优化实践
很对不起大家,又是一篇乱序的文章,但是满满的干货,来源于实践,相信大家会有所收获.里面穿插一些感悟和生活故事,可以忽略不看.不过听大家普遍的反馈说这是其中最喜欢看的部分,好吧,就当学习之后轻松一下. ...
- Hadoop生态圈-HBase性能优化
Hadoop生态圈-HBase性能优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Tree-Shaking性能优化实践 - 原理篇
Tree-Shaking性能优化实践 - 原理篇 一. 什么是Tree-shaking 先来看一下Tree-shaking原始的本意 上图形象的解释了Tree-shaking 的本意,本文所说的前 ...
- 让Elasticsearch飞起来!——性能优化实践干货
原文:让Elasticsearch飞起来!--性能优化实践干货 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog ...
随机推荐
- GENA
GENA这是事件消息采用格式,是所谓“普通事件通知体系Generic Event Notification Architecture”的缩写
- Relu的理解
ReLU上的花样 CNN出现以来,感觉在各个地方,即便是非常小的地方都有点可以挖掘.比如ReLU. ReLU的有效性体现在两个方面: 克服梯度消失的问题 加快训练速度 而这两个方面是相辅相成的,因为克 ...
- 转载:推荐给每个“数据分析师”看的PPT——关于开会的那点事
推荐给每个“数据分析师”看的PPT——关于开会的那点事 经常对开会“深恶痛绝”,大概的原因有两个,其一,开会之前的准备,各种指标.各种分析.各种PPT,其二,开会中的板凳.废话,尤其是走形式的会议,战 ...
- e802. 创建一个位置大小的JProgressBar组件
A progress bar with an unknown maximum typically displays an animation until the task is complete. N ...
- 图形界面至少要有一个顶级Swing容器
图形界面至少要有一个顶级Swing容器 顶级Swing容器为其它Swing组件在屏幕上的绘制和处理事件提供支持 常用的顶级容器: JFrame(框架):表示主程序窗口 JDialog(对话框):每个J ...
- Mysql 8.0.11版本,安装成功,使用Navicat连接失败。
Note:本文只针对mac!! 问题 安装mysql成功之后,想自己弄个数据库试试,但是报错.并不是错误代号,而是一段代码: Authentication plugin 'caching_sha2_p ...
- 多媒体开发之h264中的sps---sps信息提取之帧率
------------------------------author:pkf -----------------------------------------time:2015-8-20 --- ...
- FunGuild 数据库简介
FUNGulid = Fungi + Functional + Guild , 是一个真菌的功能注释的数据库,目前数据库中涵盖了超过12000个真菌的功能注释信息: 网址如下: http://www. ...
- Quorumpeps 群体感应数据库简介
群体感应的定义: 细菌能自发产生.释放一些特定的信号分子,并能感知其浓度变化,调节微生物的群体行为, 这一调控系统称为群体感应.细菌群体感应参与包括人类.动植物病原菌致病力在内的多种生物学功能的调节. ...
- java注解自定义使用
Java提供了4种注解,专门负责新注解的创建: @Target: 表示该注解可以用于什么地方,可能的ElementType参数有:CONSTRUCTOR:构造器的声明FIELD:域声明(包括enum实 ...