MapReduce的并行执行效率

来源:互联网 发布:unity3d 材质球shader 编辑:程序博客网 时间:2024/05/21 19:45

参考:http://blog.csdn.net/facingthesuncn/article/details/8915441

从搭好Hadoop集群之后,再上面跑了一些程序,由于数据量较小,得到实验结果的时间也还可以忍受,因此也就没有关注MapReduce并行执行效率这方面的问题。后来跑了几个大的数据集,都发现非常的慢,于是就不得不关系效率方面的问题了。

查看任务管理器的时候发现有很多处理器是没有利用的,只有一两个的利用率较高,与我们对MapReduce的直觉相差很大,于是问了一个一直在研究Hadoop的同学,发现我们的配置文件是有问题的。MapReduce是通过slot来配置map/reduce capacity的(下图中矩形框框出的,Occupied Map/Reduce Slots显示的是在运行时实际占用了Capacity中的多少)。Hadoop默认情况下,map/reduce capacity都为2,因此,CPU的利用率不高,整个集群的并行执行效率也不高。


因此,需要在$HADOOP_HOME/conf/mapred-site.xml文件中进行配置,具体配置如下:

[html] view plaincopy
  1. <property>  
  2.     <name>mapred.tasktracker.map.tasks.maximum</name>  
  3.     <value>12</value>  
  4.     <description>The maximum number of map tasks that will be run   
  5.         simultaneously by a task tracker.  
  6.     </description>  
  7. </property>  
  8.   
  9. <property>  
  10.     <name>mapred.tasktracker.reduce.tasks.maximum</name>  
  11.     <value>6</value>  
  12.     <description>The maximum number of reduce tasks that will be run   
  13.         simultaneously by a task tracker.  
  14.     </description>  
  15. </property>  

具体该将capacity设置为多少合适呢?这里可能要参考集群机器具体的硬件配置了。一般的,可以将Map Task Capacity设置为CPU的核心数,现在CPU每个核一般都会有多个线程(在任务管理器里会体现为多个核),设置中所参考的核心数是不包括这些线程虚拟出来的多核的。Reduce Task Capacity一般设置为Map Task Capacity的1/2或者1/4。

在我们的设置中,Map Task Capacity = CPU核心数,其实,Map Task Capacity + Reduce Task Capacity = CPU核心数 - 2比较好。因为我们的集群环境网速比较快,用户比较少,就没有给多个用户的并行放余量。设置时,需要考虑清楚这些情况

0 0