首页
登录 | 注册

Hadoop性能调优总结

目的


随着企业要处理的数据量越来越大,Hadoop运行在越来越多的集群上,同时MapReduce由于具有高可扩展性和容错性,已经逐步广泛使用开来。因此也产生很多问题,尤其是性能方面的问题。这里从管理员角度和用户角度分别介绍Hadoop性能优化的一些体会。

本文是基于Hadoop 0.20.x(包括1x),cdh 3及以上版本做介绍。(Hadoop的版本比较杂乱,具体可以看参考部分链接介绍)。


Linux下的打开文件最大数量,文档中无此参数,当出现DataXceiver报错的时候,需要调大。默认256

dfs.datanode.handler.count

datanode节点上为处理datanode节点的远程调用开启的服务线程数量,默认为3。当有很多HDFS客户端时可以设置更大。

 

Java.opts相配 默认:-Xmx200m。不能超过mapred.child.java.opt设置,否则会OOM。

io.sort.factor

 

处理流merge时的文件数, 默认:10

,建议调大到100.

算法:默认调度算法FIFO、公平调度算法默认调度算法FairScheduler和计算能力调度算法CapacityScheduler。

 

view plaincopy

  1. public synchronized List<Task> assignTasks(TaskTracker taskTracker)  
  2.     throws IOException  
  3.   {}  

当JobQueueTaskScheduler调用assignTasks来分配任务的时候,如果发现当前的TaskTracker有空闲的槽,就会为其寻找合适的任务,当分配好一个任务后,JobQueueTaskScheduler就会调用exceededPadding函数去判断一下,是否超过保留一定槽的限制,如果是,则只分配一个这一类型的任务就跳出。

以上这段逻辑在exceededPadding方法里面实现。绿色文字注释部分是简单的步骤。

[java] view plaincopy
  1. private boolean exceededPadding(boolean isMapTask, ClusterStatus clusterStatus, int maxTask-TrackerSlots)  
  2.   {  
  3. //1.获取集群的taskTracker的数目  
  4. int numTaskTrackers = clusterStatus.getTaskTrackers();  
  5. //2. 得到集群的map或者reduce任务数  
  6.     int totalTasks = isMapTask ? clusterStatus.getMapTasks() : clusterStatus.getReduceTasks();  
  7. //3. 得到集群最大的map或reduce资源槽数  
  8.     int totalTaskCapacity = isMapTask ? clusterStatus.getMaxMapTasks() : cluster-Status.getMaxReduceTasks();  
  9.     Collection jobQueue = this.jobQueueJobInProgressListener.getJobQueue();  
  10.     boolean exceededPadding = false;  
  11.     int totalNeededTasks;  
  12.     synchronized (jobQueue) {  
  13.       totalNeededTasks = 0;  
  14.       for (JobInProgress job : jobQueue) {  
  15.         if ((job.getStatus().getRunState() != 1) || (job.numReduceTasks == 0))  
  16.         {  
  17.           continue;  
  18.         }  
  19. // 4.计算所有job所需要的map或reduce任务数  
  20.         totalNeededTasks += (isMapTask ? job.desiredMaps() : job.desiredReduces());  
  21.         int padding = 0;  
  22.         if (numTaskTrackers > 3) {  
  23. // 5.如果是map任务,那maxTaskTrackerSlots就是tracker上最大的map槽数,reduce的话同理。  
  24.           padding = Math.min(maxTaskTrackerSlots, (int)(totalNeededTasks * this.padFraction));  
  25.         }  
  26. // 6.如果集群已占用的某种任务槽数加上当前TaskTracker应当保留的槽数大于集群某种任务的最大槽数  
  27.         if (totalTasks + padding >= totalTaskCapacity) {  
  28.           exceededPadding = true;  
  29.           break;  
  30.         }  
  31.       }  
  32.     }  
  33.   
  34.     return exceededPadding;  
  35.   }  

通过以上的介绍,对于JobQueueTaskScheduler的任务调度实现原则可以按照下面的方式来调优性能。

A. 先调度优先级高的作业,统一优先级的作业则先进先出

B. 尽量使集群中每一个TaskTracker达到负载均衡(这个均衡是task数量上的而不是实际的工作强度)

C. 尽量分配作业的本地任务给TaskTracker,但不是尽快分配作业的本地任务给TaskTracker,最多分配一个非本地任务给TaskTracker(一是保证任务的并发性,二是避免有些TaskTracker的本地任务被偷走),最多分配一个reduce任务

D. 为优先级或者紧急的Task预留一定的slot;


Todd Lipcon(@tlipcon)做的关于如何从map/reduce程序编写方面调优Hadoop的性能。


http://blog.csdn.net/xhh198781/article/details/7047354

3.        http://dongxicheng.org/mapreduce-nextgen/how-to-select-hadoop-versions/

4.        http://blog.csdn.net/xiejava/article/details/6432095



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.009 s.
京ICP备10005923号