`
tangjunliang
  • 浏览: 109080 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hadoop 优化总结(一)

阅读更多

1. 使用自定义Writable

自带的Text很好用,但是字符串转换开销较大,故根据实际需要自定义Writable,注意作为Key时要实现WritableCompareable接口

避免output.collect(new Text( ),new Text())

提倡key.set( ) value.set( ) output.collect(key,value)

前者会产生大量的Text对象,使用完后Java垃圾回收器会花费大量的时间去收集这些对象

 

2. 使用StringBuilder

不要使用Formatter StringBuffer(线程安全

StringBuffer尽量少使用多个append方法,适当使用+

 

3. 使用DistributedCache加载文件

比如配置文件,词典,共享文件,避免使用static变量

 

4. 充分使用Combiner Parttitioner Comparator。

Combiner : 对map任务进行本地聚合

Parttitioner : 合适的Parttitioner避免reduce端负载不均

Comparator : 二次排序

比如求每天的最大气温,map结果为日期:气温,若气温是降序的,直接取列表首元素即可

 

5. 使用自定义InputFormat和OutputFormat

 

6. MR应避免

  • 静态变量:不能用于计数,应使用Counter

  • 大对象:Map List

  • 递归:避免递归深度过大

  • 超长正则表达式:消耗性能,要在map或reduce函数外编译正则表达式

  • 不要创建本地文件:变向的把HDFS里面的数据转移到TaskTracker,占用网络带宽

  • 不要大量创建目录和文件

  • 不要大量使用System.out.println,而使用Logger

  • 不要自定义过多的Counter,最好不要超过100个

  • 不要配置过大内存,mapred.child.java.opts -Xmx2000m是用来设置mapreduce任务使用的最大heap量

7.关于map的数目

map数目过大[创建和初始化map的开销],一般是由大量小文件造成的,或者dfs.block.size设置的太小,对于小文件可以archive文件或者Hadoop fs -merge合并成一个大文件.

map数目过少,造成单个map任务执行时间过长,频繁推测执行,且容易内存溢出,并行性优势不能体现出来。dfs.block.size一般为256M-512M

压缩的Text 文件是不能被分割的,所以尽量使用SequenceFile,可以切分

 

8.关于reduce的数目

reduce数目过大,产生大量的小文件,消耗大量不必要的资源,reduce数目过低呢,造成数据倾斜问题,且通常不能通过修改参数改变。

可选方案:mapred.reduce.tasks设为-1变成AutoReduce。

Key的分布,也在某种程度上决定了Reduce数目,所以要根据Key的特点设计相对应的Parttitioner 避免数据倾斜

 

9.Map-side相关参数优化

io.sort.mb(100MB):通常k个map tasks会对应一个buffer,buffer主要用来缓存map部分计算结果,并做一些预排序提高map性能,若map输出结果较大,可以调高这个参数,减少map任务进行spill任务个数,降低 I/O的操作次数。若map任务的瓶颈在I/O的话,那么将会大大提高map性能。如何判断map任务的瓶颈?

io.sort.spill.percent(0.8):spill操作就是当内存buffer超过一定阈值(这里通常是百分比)的时候,会将buffer中得数据写到Disk中。而不是等buffer满后在spill,否则会造成map的计算任务等待buffer的释放。一般来说,调整 io.sort.mb而不是这个参数。

io.sort.factor(10):map任务会产生很多的spill文件,而map任务在正常退出之前会将这些spill文件合并成一个文件,即merger过程,缺省是一次合并10个参数,调大io.sort.factor,减少merge的次数,减少Disk I/O操作,提高map性能。

min.num.spill.for.combine:通常为了减少map和reduce数据传输量,我们会制定一个combiner,将map结果进行本地聚集。这里combiner可能在merger之前,也可能在其之后。那么什么时候在其之前呢?当spill个数至少为min.num.spill.for.combine指定的数目时同时程序指定了Combiner,Combiner会在其之前运行,减少写入到Disk的数据量,减少I/O次数。

 

10.压缩(时间换空间)

MR中的数据无论是中间数据还是输入输出结果都是巨大的,若不使用压缩不仅浪费磁盘空间且会消耗大量网络带宽。同样在spill,merge(reduce也对有一个merge)亦可以使用压缩。若想在cpu时间和压缩比之间寻找一个平衡,LzoCodec比较适合。通常MR任务的瓶颈不在CPU而在于I/O,所以大部分的MR任务都适合使用压缩。

 

11. reduce-side相关参数优化

reduce:copy->sort->reduce,也称shuffle

mapred.reduce.parellel.copies(5):任一个map任务可能包含一个或者多个reduce所需要数据,故一个map任务完成后,相应的reduce就会立即启动线程下载自己所需要的数据。调大这个参数比较适合map任务比较多且完成时间比较短的Job。

mapred.reduce.copy.backoff:reduce端从map端下载数据也有可能由于网络故障,map端机器故障而失败。那么reduce下载线程肯定不会无限等待,当等待时间超过mapred.reduce.copy.backoff时,便放弃,尝试从其他地方下载。需注意:在网络情况比较差的环境,我们需要调大这个参数,避免reduce下载线程被误判为失败。

io.sort.factor:recude将map结果下载到本地时,亦需要merge,如果reduce的瓶颈在于I/O,可尝试调高增加merge的并发吞吐,提高reduce性能、

mapred.job.shuffle.input.buffer.percent(0.7):reduce从map下载的数据不会立刻就写到Disk中,而是先缓存在内存中,mapred.job.shuffle.input.buffer.percent指定内存的多少比例用于缓存数据,内存大小可通过mapred.child.java.opts来设置。和map类似,buffer不是等到写满才往磁盘中写,也是到达阈值就写,阈值由mapred.job,shuffle.merge.percent来指定。若Reduce下载速度很快,容易内存溢出,适当增大这个参数对增加reduce性能有些帮助。

mapred.job.reduce.input.buffer.percent (0):当Reduce下载map数据完成之后,就会开始真正的reduce的计算,reduce的计算必然也是要消耗内存的,那么在读物reduce所需要的数据时,同样需要内存作为buffer,这个参数是决定多少的内存百分比作为buffer。默认为0,也就是说reduce全部从磁盘读数据。若redcue计算任务消耗内存很小,那么可以设置这个参数大于0,使一部分内存用来缓存数据。

 

分享到:
评论

相关推荐

    Hadoop学习总结和源码分析

    本文将基于“Hadoop学习总结和源码分析”这一主题,结合提供的文档资源,深入探讨Hadoop的核心组件HDFS(Hadoop Distributed File System)和MapReduce。 首先,我们从“Hadoop学习总结之一:HDFS简介.doc”开始,...

    hadoop的优化.docx

    本文将总结 Hadoop 的优化技术,涵盖 MapReduce、Hive、Linux 层面的优化技术。 一、Hardware 配置优化 在 Hadoop 集群中,硬件配置的选择对于性能的影响非常大。CPU 和内存是最重要的两方面。当前进程如果是做...

    hadoop学习总结1-5

    这份"hadopp学习总结1-5"的资料很可能是针对Hadoop基础到进阶的一系列教程或笔记,旨在帮助学习者掌握这个强大的工具。下面我们将深入探讨Hadoop的相关知识点。 1. **Hadoop简介**: Hadoop是Apache软件基金会的一...

    Hadoop学习总结

    理解Hadoop的运行痕迹对于调试和性能优化至关重要。这包括监控JobTracker(在Hadoop 2.x中变为YARN的ResourceManager)的任务调度、TaskTracker(在Hadoop 2.x中变为NodeManager)的工作状态以及数据传输效率等。...

    hadoop学习总结(面试必备)

    【Hadoop学习总结(面试必备)】 Hadoop作为大数据处理的核心框架,因其分布式存储和计算的能力,成为业界处理海量数据的首选工具。本总结将深入探讨Hadoop的主要组件、工作原理以及在面试中可能遇到的相关知识点。...

    hadoop技术总结

    5. **Hadoop优化**: - Reducer数量调整:过多或过少都会影响性能,需要根据任务需求和集群资源来设定。 - Combiner使用:在本地减少数据传输,提高效率。 - 数据本地化:尽量让数据处理发生在数据所在的节点,...

    IT面试-Hadoop总结-云计算

    IT面试-Hadoop总结-云计算 Hadoop是当前最流行的云计算技术之一,它是一种分布式的计算模型,包含了分布式文件系统HDFS和计算模型MapReduce。 一、Hadoop基础知识 1. MapReduce大致流程:MapReduce是Hadoop的核心...

    Hadoop集群搭建总结

    ### Hadoop集群搭建总结 #### 一、Hadoop概述与应用场景 Hadoop是一个由Apache基金会维护的开源分布式计算框架,其主要目标是处理大规模数据集的存储与计算问题。通过Hadoop,用户能够轻松地在分布式环境中开发和...

    Hadoop总结资料Hadoop1.0.3

    【Hadoop总结资料Hadoop1.0.3】 Hadoop是一个开源的分布式计算框架,主要由Apache基金会维护。Hadoop1.0.3是该框架的一个早期版本,它包括了Hadoop的核心组件如HDFS(Hadoop Distributed File System)和MapReduce...

    Hadoop集群高可用与性能优化

    总结,Hadoop集群的高可用性和性能优化是一个持续的过程,需要综合考虑硬件配置、软件参数调整、任务调度策略等多个方面。理解并熟练应用上述知识点,有助于构建出一个强大、可靠的Hadoop大数据处理平台。

    Hadoop学习总结.docx

    【Hadoop学习总结】 在当前的信息时代,数据量呈现爆炸性增长,来自各种源头的海量数据,如纽约证券交易所的交易数据、Facebook的照片、Ancestry.com的家谱信息、互联网档案馆的数据以及大型强子对撞机产生的科研...

    hadoop2.7.7对应的hadoop.dll,winutils.exe

    在Hadoop生态系统中,Hadoop 2.7.7是一个重要的版本,它为大数据处理提供了稳定性和性能优化。Hadoop通常被用作Linux环境下的分布式计算框架,但有时开发者或学习者在Windows环境下也需要进行Hadoop相关的开发和测试...

    hadoop2.8.0 eclipse jb51

    总结来说,"hadoop2.8.0 eclipse jb51"的主题涉及到使用Eclipse集成Hadoop 2.8.0版本进行开发,其中jb51可能是特定的插件或集成方法。这样的集成允许开发者在熟悉的IDE环境中处理大数据问题,提高开发效率,并利用...

    hadoop-2.4.1版本大数据

    总结,Hadoop 2.4.1在大数据处理领域扮演着关键角色,通过单机模拟分布式环境,开发者和学习者能够更好地理解和掌握其工作原理,从而利用Hadoop解决实际的大数据问题。随着技术的不断发展,Hadoop将持续优化,为...

    hadoop2.8.1+hadoop+winutils编译包

    Hadoop 2.8.1是Hadoop发展的一个重要里程碑,相比早期版本,它包含了许多性能优化和功能增强。例如,YARN(Yet Another Resource Negotiator)在2.8.1中作为资源管理系统,负责集群中的任务调度和资源分配,显著提高...

    \"Hadoop在ebay中的使用历程\"分享总结

    总结来说,《Hadoop在eBay中的使用历程》这篇文章揭示了Hadoop在实际业务场景中的强大功能,展示了大数据技术如何赋能大型企业解决复杂的数据挑战。对于关注大数据处理和应用的读者来说,这是一份宝贵的学习资料,有...

    hadoop,hive,hbase学习资料

    2. **Hadoop学习总结之一:HDFS简介.doc**、**Hadoop学习总结之四:Map-Reduce的过程解析.doc**、**Hadoop学习总结之五:Hadoop的运行痕迹.doc**、**Hadoop学习总结之二:HDFS读写过程解析.doc**:这些文档详细介绍...

Global site tag (gtag.js) - Google Analytics