Hadoop性能调优詹坤林2010年4月目录Hadoop性能调优方法Hadoop配置文件HadoopJob介绍Hadoop作业调度Hadoop性能调优方法背景◦Map/Reduce工作模型可扩展性高,具有很好的容错能力。◦Hadoop运行在越来越多的集群上,性能优化逐渐成为一个重要的话题。两种方法◦从Hadoop配置文件入手,经历大量的实验,以求通过改变一些配置参数以提高Hadoop集群的性能。◦从Hadoop作业调度入手,优化集群作业调度算法。Hadoop配置文件配置文件简介Core-site.xmlHdfs-site.xmlMapred-site.xml基于配置文件的性能调优总结Hadoop配置文件简介作用◦大量实验证明,合理的配置会大大提高Hadoop集群的性能。◦Hadoop有一个默认的配置(如0.19版),可是这并不适合所有集群。各个集群之间在机器和硬件上都存在或多或少的差别。每个Hadoop框架应该根据其独有的集群做配置优化。配置文件的演变◦早期版本中,配置文件是hadoop-default.xml和hadoop-site.xml。前者做了默认配置,用户需要配置时可以在后者中设置,hadoop启动时先加载后者。◦随着hadoop代码量越来越庞大,Hadoop项目拆解成了三个部分进行独立开发,配置文件也分离开来。0.20版本后,Hadoop将配置文件更改为core-site.xml、hdfs-site.xml和mapred-site.xml,但是相关参数未做改变。这些文件默认情况下未设定任何参数。◦Hadoop配置文件在conf目录下Core-site.xml介绍◦HadoopCoreisrenamedHadoopCommon.◦MapReduceandtheHadoopDistributedFileSystem(HDFS)arenowseparatesubprojects.◦该文件中是集群的一些基本参数,与Hadoop部署密切相关,但对于性能优化,作用不大。相关参数◦fs.default.name主节点地址。◦hadoop.tmp.dir集群的临时文件存放目录,应设置为本地目录。◦io.file.buffer.size系统I/O的属性,读写缓冲区的大小。◦io.seqfile.compress.blocksize块压缩时块的最小大小。◦io.seqfile.lazydecompress压缩块解压的相关参数。Hdfs-site.xml介绍◦这个文件与HDFS子项目密切相关,其参数对集群性能调整具有很大影响。相关参数◦dfs.secondary.http.address-secondarynamenode节点web网址。◦dfs.replication-数据块副本数量,默认为3,当数据块创建时将按此值创建副本数量。◦dfs.block.size-数据块大小,默认是64M,对于大型文件可以设置更大(如128M)。◦dfs.namenode.handler.count-namenode节点上为处理datanode节点来的远程调用开启的服务线程数量,它与mapred.job.tracker.handler.count值是相同的(默认是10),大型集群时可以设置更大,例如64。◦dfs.datanode.handler.count-datanode节点上为处理datanode节点的远程调用开启的服务线程数量,默认为3。当有很多HDFS客户端时可以设置更大,例如8.Mapred-site.xml介绍◦这个文件与map/reduce计算框架密切相关,其参数对集群性能调整具有很大影响。相关参数◦mapred.job.tracker-Jobtracker地址◦mapred.job.tracker.handler.count-jobtracker上开启的处理tasktrackers传过来的RPC的服务线程的数量,一般粗糙的设置为tasktracker节点数量的4%。◦mapred.map.tasks-每个job的map任务数量,经常设置成与集群中存在的主机数量很接近的一个数值。◦mapred.reduce.tasks-每个job的reduce任务数量,经常设置成与集群中存在的主机数量很接近的一个数值。◦mapred.tasktracker.map.tasks.maximum一个tasktracker上可以同时运行的map任务的最大数量。◦mapred.tasktracker.reduce.tasks.maximum一个tasktracker上可以同时运行的reduce任务的最大数量。基于配置文件的性能调优总结基于集群硬件信息和节点数量的hadoop配置能够很好地提高hadoop集群性能已被大量实验所证实。然而,这种方法只是静态地对集群性能做优化,在job运行时无法动态修改配置文件并使其加载生效。动态的性能调优可以在作业调度上做文章。HadoopJob介绍一道MapRedcue作业是通过JobClient向master节点的JobTracker提交的,JobTracker接到JobClient的请求后把其加入作业队列中。JobTracker一直在等待JobClient通过RPC提交作业.TaskTracker一直通过RPC向JobTracker发送heartbeat询问有没有任务可做,如果有,让其派发任务给它执行。如果JobTracker的作业队列不为空,则TaskTracker发送的心跳将会获得JobTracker给它派发的任务。slave节点的TaskTracker接到任务后在其本地发起Task,执行任务。HadoopJob介绍Hadoop作业调度默认调度算法FIFO公平份额调度算法FairScheduler计算能力调度算法CapacityScheduler作业调度总结默认调度算法FIFO简介◦最早的HadoopMap/Reduce计算架构中,JobTracker在进行作业调度时使用的是FIFO(FirstInFirstOut)算法。所有用户的作业都被提交到一个队列中,然后由JobTracker先按照作业的优先级高低,再按照作业提交时间的先后顺序选择将被执行的作业。优点◦调度算法简单明了,JobTracker工作负担轻。缺点◦忽略了不同作业的需求差异。例如如果类似对海量数据进行统计分析的作业长期占据计算资源,那么在其后提交的交互型作业有可能迟迟得不到处理,从而影响到用户的体验。新的调度算法◦当前,新的调度器已经作为插件的形式集成在Hadoop当中。公平份额调度算法FairSchedulerFairScheduler提出背景FairScheduler基础知识FairScheduler两个关键问题FairScheduler的配置FairScheduler提出背景提出背景Facebook要处理生产型作业(数据统计分析,hive)、大型批处理作业(数据挖掘、机器学习)、小型交互型作业(hive查询)。不同用户提交的作业在计算时间、存储空间、数据流量和响应时间上都有不同需求。为使hadoopmapreduce框架能够应对多种类型作业并行执行,使得用户具有良好的体验,Facebook公司提出该算法。FairScheduler基础知识设计思想尽可能保证所有的作业都能够获得等量的资源份额。系统中只有一个作业执行时,它将独占集群所有资源。有其他作业被提交时就会有TaskTracker被释放并分配给新提交的作业,以保证所有的作业都能够获得大体相同的计算资源。作业池用户提交的作业将会放进一个能够公平共享资源的pool(池)中。每个作业池设定了一个最低资源保障(aguaranteedminimumshare),当一个池中包含job时,它至少可以获得minimumshare的资源——最低保障资源份额机制。池中的作业获得一定份额的资源。可以通过配置文件限制每个池中的作业数量。缺省情况下,每个作业池中选择将要执行的作业的策略是FIFO策略,先按照优先级高低排序,然后再按照提交时间排序。FairScheduler基础知识作业和作业池的权值weight缺省情况下,FairScheduler会为每一个用户建立一个单独的pool。所有用户能够获得等量的资源份额而无论他提交了多少作业,而每个pool中,各个作业将平分分配给所在池的资源。实际应用中,无论是作业池还是作业,都被赋予一定的权值,并以此为依据获得相应比例的资源。这种情况下,作业池和作业在资源分配时不是严格的平均分配,但这有利于根据作业的重要程度及实际需求合理分配资源。FairScheduler两个关键问题如何选择合适的作业执行默认是FIFO策略,此外还有一种基于赤字的策略。FairScheduler为每个作业定义了一个deficit(赤字)指标。Deficit是一个作业在理想情况下的获得的计算资源和实际中获得的计算资源之间的差距。FairScheduler会每隔几百毫秒观察每个作业中有多少任务已经在这个时间间隔内执行,并将结果与它应得的资源份额比较,以更新该作业的deficit值。一旦有空闲的tasktracker出现,首先分配给当前具有最高deficit值的作业。例外——如果系统中存在着尚未获得最低资源保障的作业池,那么该池中的作业将会优先调度,而选择池中的作业需要根据它们的deficit来决定。这样做是为了尽可能满足作业池最低保障资源份额的机制。FairScheduler两个关键问题如何确定每个作业的资源份额缺省情况是平分资源,此外提供一种基于权值的资源分配方法。作业资源份额的计算是根据作业的权值将集群的资源总量划分给各个可以运行的作业。默认情况下,权值基于作业优先级,每个优先级对应的权值是低一个优先级的2倍(优先级共有VERY_HIGH,HIGH,NORMAL,LOW,VERY_LOW五个等级,则VERY_HIGH具有4倍NORMAL的权值)。作业和作业池的权值可以在池配置文件中进行设定,例如可以基于作业的大小和提交时间来设定。作业池的最低资源保障也是按照权值比例分配给其中的作业。FairScheduler的配置安装◦FairScheduler包在contrib\fairscheduler路径下,如hadoop-0.20.1-fairscheduler.jar,将该jar文件复制到lib目录下。然后更改mapred-site.xml配置文件使hadoop使用此调度器。◦重启hadoop,可以在下查看相应的web页面jobscheduleradministration。FairScheduler的配置池配置文件◦在mapred-site.xml文件中可以通过mapred.fairscheduler.allocation.file参数设定FairScheduler的池配置文件的路径◦FairScheduler中池和作业的相关参数可以在配置文件pools.xml中设定。◦调度器会每隔10-15秒检查一次pool.xml,如果发现有更新将重新加载它使之生效。◦在作业运行时我们可以修改pools.xml中的相关参数,从而实现动态调度。FairScheduler在Hadoop中的配置计算能力调度CapacitySchedulerCapcityScheduler基础知识CapcityScheduler一个关键问题CapcityScheduler内存管理CapcityScheduler的配置CapcitySchedule基础知识基础知识◦CapacityScheduler是由雅虎提出的作业调度算法,它提供了类似于FairScheduler算法的功能。◦CapacityScheduler中可以定义多个作业队列(multiplequeues),作业提交时将直接放入到一个队列中。◦每个队列都可以通过配置获得一