`
zhangxiong0301
  • 浏览: 359648 次
社区版块
存档分类
最新评论

mapreduce数据流配置

阅读更多

Hadoop配置文件设定了Hadoop平台运行时各方面属性。大量实验证明,合理的配置会大大提高Hadoop的性能。在Hadoop-0.19.2版本中,Hadoop配置文件在conf目录下,包括文件hadoop-default.xml和hadoop-site.xml,前者做了默认配置,不允许修改,用户需要配置时可以在后者中设置。Hadoop平台启动时首先加载hadoop-site.xml文件来配置系统属性,然后加载hadoop- default.xml文件来配置其它默认属性。属性的结构以及解释如下所示。
<property>
  <name>XXX</name> //XXX代表某属性的名称
  <value>YYY</value> //YYY代表某属性值,修改属性值以达到优化目的
  <description>ZZZ</description> //ZZZ代表某属性的说明
</property>
    Hadoop配置文件分为以下几个大类:包括全局(global)属性、日志(logging)属性、输入/输出(i/o)属性、文件系统(file system)属性、MapReduce(map/reduce)属性、进程通信(ipc)属性,以及作业通知(Job Notification)配置、网页界面(web interface)配置、代理(proxy)配置、机架(Rack)配置。
    在本节主要关注与MapReduce数据流相关的属性,具体包括I/O属性和MapReduce属性这两类。在开始具体介绍配置属性的优化之前,有几个问题需要首先说明:
(1) 部分属性除了配置文件之外还可以在MapReduce作业中动态修改,将其放在下一节介绍。
(2) 在MapReduce执行过程中,特别是Shuffle阶段,尽量使用内存缓冲区存储数据,减少磁盘溢写次数;同时在作业执行过程中增加并行度,都能够显著提高系统性能,这也是配置优化的一个重要依据。
(3) 由于每个Hadoop集群的机器和硬件之间都存在一定差别,所以Hadoop框架应根据其集群特性做配置优化,可能需要经历大量的实验。在此仅提出部分比较重要的可优化属性,以及其优化的依据。
    下面分别介绍I/O属性和MapReduce属性这两个类的部分属性,并指明其优化方向。
  I/O属性类的优化
I/O属性类主要包括在Shuffle阶段中相关的I/O过程的属性,在分析了每个具体属性后从以下几个属性入手进行优化。
(1) io.sort.factor属性,int类型,Map端和Reduce端使用
该属性设置在Map端和Reduce端都使用到的对文件Sort时一次合并的最大流,其默认值是10,即一次合并10个流。在集群中,将其适当增大能够提高并行度以缩短合并所需时间。将此默认值增加到100是比较常见的。
(2) io.sort.mb属性,int类型,Map端使用
该属性设置对Map输出进行排序时使用的环形内存缓冲区的大小,以M字节为单位,默认是100M。如果允许,应该增加它的值来减少磁盘溢写的次数以提高性能。
(3) io.sort.record.percent属性,float类型,Map端使用
该属性设置保留的io.sort.mb的比例用来存储Map输出的记录边界,剩余的空间用来存储Map输出记录本身,默认是0.05。
(4) io.sort.spill.percent属性,float类型,Map端使用
该属性设置Map输出内存缓冲和边界记录索引两者使用比例的阈值,达到此值后开始溢写磁盘的过程,默认是0.80。
(5) io.file.buffer.size属性,int类型,MapReduce作业使用
该属性设置MapReduce作业的I/O操作中所提供的缓冲区的大小,以字节为单位,默认是4096字节。这是一个比较保守的设置,通过增大它的大小能够减少I/O次数以提高性能。如果系统允许,64KB(65536字节)至128KB(131072字节)是较普遍的选择。
  MapReduce属性类的优化
    MapReduce属性类主要包括在MapReduce执行过程中相关配置属性,重点从以下的部分属性去分析性能优化。
(1) mapred.reduce.parallel.copies属性,int类型,Reduce端使用
该属性设置将Map输出复制到Reduce的线程的数量,默认为5。根据需要可以将其增大到20-50,增加了Reduce端复制过程的并行数,提高了系统性能。
(2) mapred.child.java.opts属性,String类型,Map和Reduce任务虚拟机使用
该属性设置Map和Reduce任务运行时Java虚拟机指定的内存的大小,默认-Xmx200m,分配给每个任务200MB内存。只要条件允许,应该让任务节点上的内存大小尽量大,可以将其增大到-Xmx512m,即512MB,以提高MapReduce作业的性能。
(3) mapred.job.shuffle.input.buffer.percent属性,float类型,Reduce端使用
该属性设置整个堆空间的百分比,用于Shuffle的复制阶段分配给Map输出缓存,默认是0.70,适当增大比例可以使Map输出不被溢写到磁盘,能够提高系统性能。另外一个解释:Reduce在shuffle阶段对下载来的map数据,并不是立刻就写入磁盘的,而是会先缓存在内存中,然后当使用内存达到一定量的时候才刷入磁盘。这个内存大小的控制就不像map一样可以通过io.sort.mb来设定了,而是通过另外一个参数来设置:mapred.job.shuffle.input.buffer.percent(default 0.7),

这个参数其实是一个百分比,意思是说,shuffile在reduce内存中的数据最多使用内存量为:0.7 × maxHeap of reduce task。也就是说,如果该reduce task的最大heap使用量(通常通过mapred.child.java.opts来设置,比如设置为-Xmx1024m)的一定比例用来缓存数据。默认情况下,reduce会使用其heapsize的70%来在内存中缓存数据。如果reduce的heap由于业务原因调整的比较大,相应的缓存大小也会变大,这也是为什么reduce用来做缓存的参数是一个百分比,而不是一个固定的值了。

 

(4) mapred.job.shuffle.merge.percent属性,float类型,Reduce端使用
该属性设置Map输出缓存中使用比例的阈值,用于启动合并输出和磁盘溢写的过程,默认是0.66。如果允许,适当增大其比例能够减少磁盘溢写次数,提高系统性能。详细解释:假设mapred.job.shuffle.input.buffer.percent为0.7,reduce task的max heapsize为1G,

那么用来做下载数据缓存的内存就为大概700MB左右,这700M的内存,跟map端一样,

也不是要等到全部写满才会往磁盘刷的,而是当这700M中被使用到了一定的限度(通常是一个百分比),就会开始往磁盘刷。

(5) mapred.inmem.merge.threshold属性,int类型,Reduce端使用
该属性设置启动合并输出和磁盘溢写过程的最大Map输出数量,默认为1000。由于Reduce端复制的中间值能够全部存在内存中可以获得最佳性能。如果Reduce函数内存需求很少,可以将该属性设置为0,即没有阈值限制,由mapred.job.shuffle.merge.percent属性单独控制溢写过程。


(6) mapred.job.reduce.input.buffer.percent属性,float类型,Reduce端使用
该属性设置在Reduce过程中用来在内存中保存Map输出的空间占整个堆空间的比例。Reduce阶段开始时,内存中的Map输出大小不能大于这个值。默认为0.0,说明在Reduce开始前所有的Map输出都合并到硬盘中以便为Reduce提供尽可能多的内存。然而如果Reduce函数内存需求较小,可以将该值设置为1.0来提升性能。另一个解释:当reduce将所有的map上对应自己partition的数据下载完成后,就会开始真正的reduce计算阶段(中间有个sort阶段通常时间非常短,几秒钟就完成了,因为整个下载阶段就已经是边下载边sort,然后边merge的)。当reduce task真正进入reduce函数的计算阶段的时候,有一个参数也是可以调整reduce的计算行为。也就是:mapred.job.reduce.input.buffer.percent(default 0.0)。

由于reduce计算时肯定也是需要消耗内存的,而在读取reduce需要的数据时,同样是需要内存作为buffer,

这个参数是控制,需要多少的内存百分比来作为reduce读已经sort好的数据的buffer百分比。

默认情况下为0,也就是说,默认情况下,reduce是全部从磁盘开始读处理数据。

如果这个参数大于0,那么就会有一定量的数据被缓存在内存并输送给reduce,

当reduce计算逻辑消耗内存很小时,可以分一部分内存用来缓存数据,反正reduce的内存闲着也是闲着。

 


(7) tasktracker.http.threads属性,int类型,Map端使用
该属性设置集群中每个tasktracker用于将map输出传给reducer的工作线程的数量,默认是40。可以将其提高至40-50之间,能够增加并线线程数,提高集群性能。

分享到:
评论

相关推荐

    MapReduce详解包括配置文件

    2. **不擅长流式计算**:MapReduce的设计假设输入数据集是静态不变的,对于动态更新的数据流处理不够灵活。 3. **不擅长DAG(有向无环图)计算**:在涉及多个任务间复杂的依赖关系时,每个任务的输出都需要写入磁盘...

    20、MapReduce 工作流介绍

    总结来说,MapReduce工作流是Hadoop中处理多阶段数据处理任务的重要工具,通过`JobControl` 和`ControlledJob` ,可以管理和协调一系列相互依赖的MapReduce作业,确保它们按照正确的顺序和条件执行。这对于实现复杂...

    mapreduce_eclipse开发需要的所有包

    5. **MapReduce示例**:初学者通常会从Hadoop官方提供的MapReduce示例开始学习,例如WordCount程序,这是一个简单的例子,演示了如何使用MapReduce处理文本数据,统计单词出现次数。 6. **JUnit测试**:对于...

    Flume日志收集与MapReduce模式.pdf

    它通过构建数据流管道来实现数据的流动,这些管道由源(Sources)、通道(Channels)和接收器(Sinks)组成。源负责从不同数据源如Web服务器日志、应用日志等收集数据,通道作为临时存储,保证数据在处理过程中的...

    MapReduce暑假大作业——基于紫荆的种子推荐.zip

    MapReduce是Google提出的一种分布式计算模型,主要用于处理和生成大规模数据集。在这个“MapReduce暑假大作业——基于紫荆的种子推荐”项目中,我们将会深入理解并实践如何利用MapReduce来解决实际问题,特别是针对...

    使用hadoop-streaming运行Python编写的MapReduce程序.rar

    Python作为解释型语言,非常适合编写这类任务,因为可以轻松地处理文本数据流。 以下是使用Hadoop Streaming运行Python MapReduce程序的基本步骤: 1. **设置环境**:首先确保你已经安装了Hadoop,并配置好了...

    使用Eclipse编译运行MapReduce程序.doc

    MapReduce是Google提出的一种编程模型,用于大规模数据集的并行计算。在Hadoop生态系统中,MapReduce被广泛应用于处理和生成大数据。Eclipse作为流行的Java集成开发环境,配合Hadoop-Eclipse Plugin,使得在Eclipse...

    Idea运行MapperReduce本地环境配置(win10).rar

    标题中的"Idea运行MapperReduce本地环境配置(win10)"指的是使用IntelliJ IDEA这款流行的Java开发集成环境,在Windows 10操作系统下配置MapReduce程序的本地运行环境。MapReduce是Hadoop生态系统中的一个核心组件,它...

    MapReduce原理.docx

    - **非实时性**:MapReduce主要用于批处理作业而非实时数据流处理,因此不适合处理实时或近实时的数据需求。 - **数据静态性**:MapReduce处理的数据是静态的,即在处理过程中不会发生变化。 #### 二、操作案例 ##...

    支持大规模流数据处理的弹性在线MapReduce模型及拓扑协议.pdf

    本文提出了一种弹性在线MapReduce模型及其动态拓扑结构协议,旨在支持大规模流数据处理,并在吉林大学学报(工学版)中发表。 关键词计算机系统结构、流数据处理、内存计算、MapReduce、拓扑结构、操作共享,代表了...

    MapReduce在Windows环境下所需要的hadoop(bin目录),内含winutils

    MapReduce是一种分布式计算模型,由Google开发,用于处理和生成大规模数据集。它将复杂的并行计算任务分解为两个主要阶段:Map(映射)和Reduce(化简)。Hadoop是实现MapReduce的一个开源框架,它允许在廉价硬件上...

    第四章Mapreduce.pdf

    2. 不支持流式计算:输入数据集是静态的,不适用于数据流持续更新的场景。 3. DAG计算效率低:对于有依赖关系的多步计算,频繁的磁盘I/O会导致性能下降。 4. 编程模型限制:MapReduce模型仅包含一个Map阶段和一个...

    Hadoop MapReduce v2 Cookbook, 2nd Edition-Packt Publishing(2015) 高清完整版PDF下载

    **Hadoop MapReduce V2** 是Hadoop生态系统中的一个关键组件,用于处理大规模数据集。相较于V1版本,V2版本在架构上进行了重大改进,引入了**YARN(Yet Another Resource Negotiator)**来分离资源管理和任务调度/...

    hadoop mapreduce

    Hadoop MapReduce是一种分布式计算框架,由Apache Hadoop项目提供,用于处理和分析大量数据。它借鉴了Google的MapReduce编程模型,将大型数据集分解为小块,然后在集群中的多台机器上并行处理这些小块。MapReduce...

    IBM09年推出的一款基于eclipse的mapreduce小插件

    这样的文档通常会涵盖如何配置开发环境、创建MapReduce作业、理解工作流程、以及解决常见问题等内容。 标签中的“mapreduce”、“eclipse”和“hadoop”进一步强调了这个插件与这三个关键领域的关联。Hadoop是实现...

    云计算背景下多路数据流分层模块化建模与设计.pdf

    在结束语中, 研究指出通过Hadoop云计算平台可以有效地管理和处理大规模数据, 通过映射分配和代码生成工具, 能够创建适用于多路数据流处理的MapReduce型代码, 实现复杂计算任务的高效处理。 关键词中的"模块化计算型...

    完整版大数据云计算课程 Hadoop数据分析平台系列课程 Hadoop 04 MapReduce 共31页.pptx

    4. **Pig和Hbase**:Pig是一种高级数据流语言,用于处理和分析大规模数据集。学习者需能独立安装Pig并使用它进行数据分析。Hbase是基于Hadoop的分布式列式数据库,学习者需了解其基本原理,完成安装和配置,并能进行...

Global site tag (gtag.js) - Google Analytics