基于Hadoop配置文件的MapReduce数据流优化

2019-03-28 13:55|来源: 网络

Hadoop配置文件设定了Hadoop平台运行时各方面属性。大量实验证明,合理的配置会大大提高Hadoop的性能。在Hadoop-0.19.2版本中,Hadoop配置文件在conf目录下,包括文件hadoop-default.xml和hadoop-site.xml,前者做了默认配置,不允许修改,用户需要配置时可以在后者中设置。Hadoop平台启动时首先加载hadoop-site.xml文件来配置系统属性,然后加载hadoop-default.xml文件来配置其它默认属性。

更多Hadoop相关信息见 http://www.linuxidc.com/search.aspx?Where=Nkey&Keyword=Hadoop

属性的结构以及解释如下所示。

<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属性这两个类的部分属性,并指明其优化方向。

1   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字节)是较普遍的选择。

2   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输出不被溢写到磁盘,能够提高系统性能。

(4) mapred.job.shuffle.merge.percent属性,float类型,Reduce端使用

该属性设置Map输出缓存中使用比例的阈值,用于启动合并输出和磁盘溢写的过程,默认是0.66。如果允许,适当增大其比例能够减少磁盘溢写次数,提高系统性能。

(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来提升性能。

(7) tasktracker.http.threads属性,int类型,Map端使用

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

相关问答

更多
  • 小说站,我一个小小的1W本书的站.用了我400G的硬盘...
  • 在hadoop1中核心组成部分是HDFS、MapReduce,到了Hadoop2,核心变为HDFS、Yarn,而且新的HDFS中可以有多个NameNode,每个都有相同的职能。 以下内容是从http://www.superwu.cn/2014/02/12/1094/阅读后自己总结了一下: 配置文件无非就这几个文件: 1、hadoop-env.sh: 只需设置jdk的安装路径,如:export JAVA_HOME=/usr/local/jdk 2、core-site.xml: (1)fs.defaultFS: ...
  • hadoop-2.x在$HADOOP_HOME/etc/hadoop目录下 hadoop-1.x在$HADOOP_HOME/conf目录下
  • 你试试 sudo update-alternatives --config java 能看看你的jdk到底是什么版本 比如我的是/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 那么我的JAVA_HOME就是”/usr/lib/jvm/java-7-openjdk-amd64". 你的也可能是java-7-openjdk-i386也说不定 所以我怀疑你直接写java-6-oepnjdk会有问题
  • 1. 如果第三方配置文件不是特别大(几百M以上),则可以使用DistributeCache。 2. 如果第三方配置文件比较大,则需要在MapReduce中实现join来做。 关于 DistributeCache的用法,请搜索“mapreduce DistributeCache”。 关于在MapReduce中实现两个文件的join,请搜索"mapreduce实现join"。 我只能说到这了。
  • 经过很多挫折之后,这里的答案是有效的: 请注意,在这种情况下,我已经为导入所有产品 (ID:3)配置了默认的Magento数据流配置文件,以便从预定义的文件中读取XML导入格式。 这是我在运行导入操作之前根据需要创建的文件。 (请参阅上面问题中的屏幕截图) 一旦你创建了你的个人资料,你需要2个文件: importer.php batch_importer_processor.php 您可以将文件放在/ magento / root / shell /目录中,或者如果您包含在单独的位置中,则根据需要调整路径。 ...
  • 根据您的产品设置的大小(因此定义可能的产品对的数量),您可以查看地图侧“本地”聚合。 在映射器中将产品对映射到频率计数,而不是将每个产品对和值1写入上下文,然后将其累积在地图中。 当地图达到预定义的大小时,将地图刷新到输出上下文。 您甚至可以使用LRU映射将最常见的对映射保留在映射中,并在这些映射被强制排除时写出这些“过期”条目。 有关适用于Word Count示例的示例,请参阅http://www.wikidoop.com/wiki/Hadoop/MapReduce/Mapper#Map_Aggregat ...
  • 我刚从Praveen Sripati收到了一封关于hadoop引用的电子邮件,我将它粘贴在这里: 在复制阶段,数据是否同时存在于map和reduce任务中? 地图输出何时清除? 以下内容来自Hadoop - The Definitive Guide 一旦第一个reducer检索到它们,主机就不会从磁盘中删除映射输出,因为reducer可能随后失败。 相反,他们会等到他们被告知由作业跟踪器(或应用程序主人)删除它们,这是在作业完成之后。 这非常重要,地图输出仍然在磁盘上! 在我的情况下有点不幸。 5) 然后减 ...
  • 这是因为Magento推出了1.9版本的新安全功能。 显示错误消息时,您需要将块adminhtml/system_convert_profile_grid列入白名单。 为此,您可以转到System > Permissions > Blocks并输入上面的块。 This is due to a new security feature Magento introduced with its version 1.9. As the error message showd you need to whitelis ...
  • 您可以通过将第一个文件放在分布式缓存中并在映射阶段遍历第二个文件来执行连接来执行映射端连接。 如何从分布式缓存中读取: @Override protected void setup(Context context) throws IOException,InterruptedException { Path[] filelist=DistributedCache.getLocalCacheFiles(context.getConfiguration() ...