`
囧囧有神
  • 浏览: 206620 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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的场景

0
1
分享到:
评论
1 楼 lvwenwen 2012-12-26  
   

相关推荐

    Hive性能优化总结

    #### 四、性能优化实践 ##### 配置角度优化 - **Map阶段优化**:通过调整`mapred.max.split.size`参数来控制map任务的数量。较小的值可以增加map任务的数量,而较大的值则会减少map任务数量。例如,如果数据集大小...

    基于hive的性能优化方法的研究与实践

    【基于Hive的性能优化方法的研究与实践】 随着网络信息处理市场的快速发展和数据量的急剧增长,大数据处理技术,特别是基于Hadoop的分布式计算处理技术,已成为工程研究的重点。Hadoop以其可扩展性和高容错性,被...

    hadoop config 配置文件

    配置优化是提升Hadoop性能的关键。例如,合理设置`io.sort.mb`和`io.sort.record.percent`可以提高Map阶段的性能;`mapreduce.reduce.shuffle.parallelcopies`则关乎Reduce阶段的数据拉取效率。 8. **配置的最佳...

    Hadoop应用开发与案例实战(慕课版)-课件PPT.rar

    高级主题可能涉及Hadoop的优化、性能调优、YARN的资源管理策略,以及Hadoop与其他大数据技术(如Spark)的集成。 8. 实践项目: 学习者可能会被引导完成一个完整的Hadoop项目,从数据获取、数据处理到结果分析,...

    hadoop api 操作代码

    9. **Hadoop的版本更新**:随着技术的发展,Hadoop经历了多个版本的迭代,如Hadoop 2.x引入了YARN,Hadoop 3.x进一步增强了性能和稳定性。不同版本的API可能会有所变化,开发者需要关注官方文档以获取最新信息。 ...

    基于Hadoop的分布式索引构建

    它涉及到索引种类的选择、分布式计算框架的理解、系统配置和Job优化的实践经验,以及容错策略的设计。通过采用Hadoop平台进行分布式索引构建,可以大幅提升数据检索的性能和系统的可靠性,进而满足大数据时代对数据...

    hadoop-3.1.3-src.tar.gz

    - **Hadoop优化**:包括配置优化、数据本地化、网络优化等,提升Hadoop集群的性能。 - **YARN应用管理器**:如YARN的ApplicationMaster,负责应用程序的生命周期管理和资源调度。 6. **安全与认证** - **...

    hadoop经典实战教程

    通过以上对Hadoop经典实战教程的学习,我们不仅了解了Hadoop的基本概念和核心组件,还深入了解了HDFS和MapReduce的工作原理,掌握了Hadoop的高级特性和性能优化方法。更重要的是,通过具体案例的分析,读者可以更好...

    hadoop-api中文说明文档

    10. **最佳实践**:文档还会包含开发和运行Hadoop作业的最佳实践,如优化数据处理的并行度、减少shuffle阶段的数据传输,以及使用压缩和缓存来提升性能。 通过深入阅读和理解Hadoop API中文说明文档,开发者可以更...

    Hadoop命令

    实际工作中,还需要结合具体业务需求,学习如何编写MapReduce程序,优化性能,以及处理各种异常情况。希望这些信息对你的Hadoop学习之路有所帮助,不断探索和实践,你将在大数据领域变得更加熟练。

    大数据云计算技术 Hadoop运维笔记(共21页).pptx

    这些知识点展示了Hadoop在大规模生产环境中的实际应用和维护经验,对于理解Hadoop集群的运维管理和性能优化具有很高的参考价值。通过学习这些内容,我们可以更好地掌握如何在复杂环境中部署、管理和优化Hadoop系统。

    尚硅谷大数据技术之Hadoop

    4. MapReduce优化:提供优化MapReduce作业性能的技巧,如减少shuffle阶段的数据传输、调整数据块大小等。 通过这门课程的学习,学员不仅能够了解Hadoop的基本原理,还能掌握实际操作和优化Hadoop集群的技能,为从事...

    hadoop中文版API.zip

    Hadoop中文版API是针对Apache Hadoop开源框架的中文文档,它为...通过深入学习和实践Hadoop中文版API,开发者能够更有效地开发和优化大数据处理程序,充分利用Hadoop平台的潜力,处理海量数据并实现高效的数据分析。

    hadoop集群

    总的来说,搭建Hadoop集群涉及多个步骤,包括硬件准备、环境配置、软件安装、服务启动以及性能优化。这个过程可能会遇到各种问题,但只要理解了Hadoop的基本原理和架构,就可以逐步解决。对于初学者来说,这是一个...

    hadoop-2.7.2-bin-x64

    Hadoop 2.7.2是其一个重要的版本,提供了许多性能优化和新特性。在Windows平台上,尽管Hadoop最初设计为在Linux环境下运行,但通过特定的配置,我们也可以在Windows上搭建开发环境。本文将详细介绍如何在Windows 64...

    Hadoop集群搭建详细简明教程

    Hadoop集群的维护和优化是一个持续的过程,包括监控性能、调整参数、故障排查等。随着业务的发展,你可能还需要考虑添加更多节点,实现HA(High Availability)以提高服务可用性,或者引入更先进的数据处理框架如...

    Hadoop-2.7.1分布式安装手册

    9. 测试与优化:安装完成后,通过运行WordCount等示例程序验证Hadoop集群工作正常。根据集群性能调整参数,如`mapreduce.map.memory.mb`和`mapreduce.reduce.memory.mb`。 10. 故障排查与维护:了解常见问题及解决...

    Hadoop技术文档

    实际使用中,Hadoop集群的性能优化是关键,这可能涉及数据块大小调整、副本数量设定、YARN调度策略优化、网络拓扑优化等。此外,随着业务发展,集群可能需要扩展,这就需要考虑如何平滑地添加新节点,同时保持服务...

Global site tag (gtag.js) - Google Analytics