Hadoop集群性能优化技术研究

转自:http://www.qikan120.com/qydtInfo.asp?ArticleID=78558

 

摘要:Hadoop技术已经在互联网领域得到广泛的应用,同时也得到了学术界的普遍关注。该文介绍了Hadoop作为基础数据处理平台仍然存在的问题,阐明了Hadoop性能优化技术研究的必然性,并介绍了当前Hadoop优化的三个主要思路:从应用程序角度进行优化、对Hadoop系统参数进行优化和对Hadoop作业调度算法进行优化。Hadoop集群优化对于提高系统性能和执行效率具有重大的意义。
  [如何发表论文][摘自:电脑知识与技术 2011年22期]关键词:Hadoop集群;性能优化;配置参数;作业调度
  中图分类号:TP14 文献标识码:A文章编号:1009-3044(2011)22-5484-03
  Research of Hadoop Performance Tuning Technology
  XIN Da-xin, LIU Fei
  (Xi'an Technological University, Xi'an 710032, China)
  Abstract: Hadoop technology had been wildly used and research around the internet and academics. The article introduce the reminded problems of Hadoop data processing platform and Illustra Configuration parameters imization the hadoop performace to increase the system performace and efficiency.
  Key words: Hadoop cluster; performance optimization; configuration parameters; job scheduler
  hadoop是隶属于Apache软件基金会(Apache Software Foundation)的开源JAVA项目,它是一个分布式的具有可靠性和可扩展性的存储与计算平台。历经多年发展,Hadoop社区不断扩大,而Hadoop本身也已经演变成为一个拥有众多子项目的项目集合,其中最核心的部分是用于分布式存储HDFS(Hadoop Distributed File System)文件系统和用于分布式计算的MapReduce计算架构,除此以外还有HBase、Hive、Pig和ZooKeeper等。
  1 Hadoop数据处理平台存在的问题
  随着企业要处理的数据量越来越大,MapReduce思想越来越受到重视。Hadoop是MapReduce的一个开源实现,由于其良好的扩展性和容错性,已得到越来越广泛的应用。Hadoop作为一个基础数据处理平台,虽然其应用价值已得到大家认可,但仍存在很多问题,主要表现在以下几个方面:
  1)Namenode/jobtracker单点故障。 Hadoop采用的是master/slaves架构,该架构管理起来比较简单,但存在致命的单点故障和空间容量不足等缺点,这已经严重影响了Hadoop的可扩展性。
  2)HDFS小文件问题。在HDFS中,任何block,文件或者目录在内存中均以对象的形式存储,每个对象约占150byte,如果有1000 0000个小文件,每个文件占用一个block,则namenode需要2G空间。如果存储1亿个文件,则namenode需要20G空间。这样namenode内存容量严重制约了集群的扩展。
  3)jobtracker同时进行监控和调度,负载过大。为了解决该问题,yahoo已经开始着手设计下一代Hadoop MapReduce。他们的主要思路是将监控和调度分离,独立出一个专门的组件进行监控,而jobtracker只负责总体调度,至于局部调度,交给作业所在的client。
  4)数据处理性能。很多实验表明,其处理性能有很大的提升空间。Hadoop类似于数据库,可能需要专门的优化工程师根据实际的应用需要对Hadoop进行调优,有人称之为“Hadoop Performance Optimization” (HPO)。
  由于Hadoop平台已经成为了大多数公司的分布式数据处理平台,随着数据规模的越来越大,对集群的压力也越来越大,集群的每个节点负担自然就会加重,而且集群内部的网络带宽有限,数据交换吞吐量也在面临考验,因此也引发了人们对大规模数据处理进行优化的思考。
  2 从应用程序角度进行优化
  由于mapreduce是迭代逐行解析数据文件的,怎样在迭代的情况下,编写高效率的应用程序,是一种优化思路。可以从以下7个方面来提高MapReduce的性能:避免不必要的reduce任务、外部文件引入、为Job添加一个Combiner、重用Writable类型、使用StringBuffer而不是String和调试程序跟踪程序的瓶颈。
  3 hadoop系统参数优化研究
  当前hadoop系统有190多个配置参数,怎样调整这些参数,使hadoop作业运行尽可能的快,也是一种优化思路。hadoop系统参数设置优化主要包括三个方面:Linux文件系统参数调整,Hadoop通用参数调整和Hadoop作业调优参数。
  3.1 Linux文件系统参数调整
  noatime和nodiratime属性,文件挂载时设置这两个属性可以明显提高性能,默认情况下,linux et2/et3文件系统在文件被访问,创建和修改时会记录下文件的时间戳。如果系统运行时要访问大量文件,关闭这些操作可提升文件系统的性能。Readahead buffer参数用以调整linux文件系统中预读缓冲区的大小,可以明显提高顺序读文件的性能。默认buffer为256sectors,可以增大为1024或2408sectors(注意不是越大越好)。避免在TaskTracker和DataNode节点上执行RADI和LVM的操作,这样会降低性能。
  3.2 hadoop通用参数调整
  dfs.namnode.handler.count或mapred.job.tracker.handler.count是namenode和jobtracker中用于处理RPC的线程数,默认是10,对于较大集群,可适当调大比如64。
  dfs.datanode.handler.count是datanode上用于处理RPC的线程数,默认是3,对于较大集群可适当调大比如8。TaskTracker.http.threads是HTTP server上的线程数,运行在每个TaskTracker上,用于处理map task输出,大集群可以设置为40~50。
  dfs.block.size,HDFS中的数据block大小,默认是64M,对于较大集群,可以设置为128或264M。mapred.local.dir和dfs.data.dir这两个参数配置的值应当是分布在各个磁盘上的目录,这样可以充分利用IO读写能力。
  3.3 hadoop作业调优参数
  3.3.1 map task相关配置
  io.sort.mb,当map task开始运算并产生中间数据时,其产生的中间结果并非直接写入磁盘,而是利用内存buffer来进行已经产生的部分结果的缓存。当buffer达到一定阈值,会启动一个后台线程对buffer的内容进行排序然后写入本地磁盘(一个spill文件)。默认是100M对于大集群可设置为200M。
  io.sort.spill.percent这个值就是上述buffer的阈值,默认是80%,当buffer中的数据达到这个阈值,后台线程会起来对buffer中已有的数据进行排序,然后写入磁盘。
  io.sort.factor当一map task执行完之后,本地磁盘上(mapred.local.dir)有若干个spill文件,map task最后做的一件事就是执行merge sort,把这些spill文件合成一个文件(partition)。执行merge sort的时候,每次同时打开多少个spill文件由该参数决定。打开的文件越多,不一定merge sort就越快,所以要根据数据情况适当的调整。
  mapred.compress.map.output,是否对中间结果和最终结果进行压缩,如果是,指定压缩方式 ,推荐使用LZO压缩。Inter内部测试表明,相比未压缩,使用LZO的作业运行时间减少60%。
  3.3.2 reduce task相关配置
  mapred.reduce.parallel.copies表示Reduce shuffle阶段copier线程数。reduce分为三个阶段,分别是copy->sort->reduce。copy即shuffle,当job已完成5%的map tasks数量之后开始启动reduce,从不同的已经完成的map上去下载属于自己这个reduce部分数据,由于map数量很多,对于一个reduce来说,可以并行的从多个map下载。默认值5,对于大集群可调整为16-25。
  mapred.job.shuffle.input.buffer.percent(default 0.7),在shuffle阶段下载来的map数据,并不是立刻写入磁盘,而是先缓存在内存中,这个百分比是shuffle在reduce内存中的数据最多使用量为:0.7 × maxHeap of reduce task。
  这种基于参数的调优比较“静态”,因为一套参数配置只对于一类作业是最优的。通过对这些参数的研究,可以寻找参数配置与不同作业特征之间的关联。
  4 hadoop作业调度算法优化研究
  基于集群硬件信息和节点数量的hadoop配置能够很好的提高hadoop集群性能已被大量实验所验证,但是这种方法只是静态地对集群性能做优化,在Job运行时无法动态地修改配置文件并使其加载生效,基于hadoop作业调度算法的优化能很好的解决这个问题。
  在hadoop系统中,作业调度组件非常重要,它的作用是将系统中空闲的资源按一定策略分配给作业。在Hadoop中,调度器是一个可插拔的模块,用户可以根据自己的实际应用要求设计调度器。
  1)默认的调度器FIFO
  最早的Hadoop Map/Reduce计算架构中,JobTracker在进行作业调度时使用的FIFO(First In First Out)算法,所有用户的作业都被提交到一个队列中,然后由JobTracker先按照作业的优先级高低,再按照作业提交时间的先后顺序选择将被执行的作业。其优点是调度算法简单明了,JobTracker工作负担轻。缺点是忽略了不同作业需求差异。例如如果类似对海量数据进行统计分析的作业长期占据计算资源,那么对提交的交互型作业有可能迟迟得不到处理,从而影响用户的体验。
  2)计算能力调度器(Capacity Scheduler)
  支持多个队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略,为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。调度时,首先按以下策略选择一个合适队列:计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,选择一个该比值最小的队列;然后按以下策略选择该队列中一个作业:按照作业优先级和提交时间顺序选择,同时考虑用户资源量限制和内存限制。
  Capacity Scheduler能有效的对hadoop集群的内存资源进行管理,以支持内存密集型应用。作业对内存资源需求高时,调度算法将把该作业的相关任务分配到内存资源充足的task tracker上。在作业选择过程中,Capacity Scheduler会检查空闲task tracker上的内存资源是否满足作业要求。Task tracker上的空闲资源数量值可以通过task tracker的内存资源总量减去当前已经使用的内存数量得到,而后者包含在task tracker向job tracker发送的周期性心跳信息中。目前,基于内存的调度只能在linux平台下起作用,关于内存调度的相关参数可以通过配置文件来设置。
  3)公平份额调度算法(Fair Scheduler)
  Fair Scheduler是由Facebook公司提出的,为了解决Facebook要处理生产型作业(数据分析、HIVE)、大型批处理作业(数据挖掘、机器学习)、小型交互型作业(HIVE查询)的问题。同时满足不同用户提交的作业在计算时间、存储空间、数据流量和响应时间上都有不同需求的情况下,使hadoop mapreduce框架能够应对多种类型作业并行执行,使得用户具有良好的体验,所以Facebook提出了该算法。
  Fair Scheduler的设计思想是,尽可能保证所有的作业都能够获得等量的资源份额。系统中只有一个作业执行时,它将独占集群所有资源。有其他作业被提交时就会有TaskTracker被释放并分配给新提交的作业,以保证所有的作业都能够获得大体相同的计算资源。
  这三种调度算法存在一定的缺陷,目前hadoop集群作业调度算法已近成为是研究的重点之一,例如适用于异构集群的调度器LATE和适用于实时作业的调度器DeadLine Scheduler和Constraint-based Scheduler都提出了新的处理机制。
  5 结论
  总体来说,对于Hadoop平台,现在主要有三种优化思路,分别为:从应用程序角度角度进行优化,从参数配置角度进行优化,从作业调度算法角度进行优化。对于第一种思路,需要根据具体应用需求而定,同时也需要在长期实践中积累和总结;对于第二种思路,大部分采用的方法是根据自己集群硬件和具体应用调整参数,找到一个最优的。对于第三种思路,难度较大,但效果往往非常明显。
  [www.qIkan120.com]参考文献:
  [1] Zaharia M,Borthakur D,Sarma J S,et,al.Job scheduling for multi-user mapreduce clusters[C].EECS Department,University of California,Berkeley,Tech.Rep,Apr 2009.
  [2] Tian C,Zhou H,He Y.A dynamic mapreduce scheduler for heterogeneous workloads[C]//Proceedings of the 2009 Eighth International Conference on Grid and Cooperative Computing,ser.GCC'09. Washington, DC, USA:IEEE Computer Society,2009:218-224.
  [3] http://developer.yahoo.com/blogs/hadoop/posts/2011/02/mapreduce-nextgen/.
  [4] Xuhui Liu,Jizhong Han.Implementing WebGIS on Hadoop:A case study of improving small file I/O performance on HDFS[Z].CLUSTER,2009:1-8.

你可能感兴趣的:(hadoop)