Agendacdh架构技巧和优化hbase性能优化CDH5.3.3安装实战和使用Linux系统优化(1)noatime和nodiratime属性文件挂载时设置这两个属性可以明显提高性能。。默认情况下,Linuxext2/ext3文件系统在文件被访问、创建、修改时会记录下文件的时间戳,比如:文件创建时间、最近一次修改时间和最近一次访问时间。如果系统运行时要访问大量文件,关闭这些操作,可提升文件系统的性能。Linux提供了noatime这个参数来禁止记录最近一次访问时间戳。(2)readaheadbuffer调整linux文件系统中预读缓冲区地大小,可以明显提高顺序读文件的性能。默认buffer大小为256sectors,可以增大为1024或者2408sectors(注意,并不是越大越好)。可使用blockdev命令进行调整。(3)避免RAID和LVM操作避免在TaskTracker和DataNode的机器上执行RAID和LVM操作,这通常会降低性能。(4)linux下修改进程打开文件数限制linux默认的进程打开文件上限是1024个,可以通过ulimit-n查看。很多系统上限可以通过修改/etc/security/limits.conf文件改变,这个文件有详细的注释,对如何修改做了说明。如果希望把所有用户的进程打开文件上限改为65536,可以加入下面两行*softnofile8192*hardnofile8192haoop中mapreduce报错java.io.IOException:Alldatanodesarebad.Aborting…atorg.apache.hadoop.dfs.DFSClient$DFSOutputStream.processDatanodeError(DFSClient.java:2158)atorg.apache.hadoop.dfs.DFSClient$DFSOutputStream.access$1400(DFSClient.java:1735)(5)关闭Swap分区Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。(6)Ntp服务,时间同步Hadoop通用参数调整(1)dfs.namenode.handler.count或mapred.job.tracker.handler.countnamenode或者jobtracker中用于处理RPC的线程数,默认是10,较大集群,可调大些,比如64。(2)dfs.datanode.handler.countdatanode上用于处理RPC的线程数。默认为3,较大集群,可适当调大些,比如8。需要注意的是,每添加一个线程,需要的内存增加。(3)tasktracker.http.threadsHTTPserver上的线程数。运行在每个TaskTracker上,用于处理maptask输出。大集群,可以将其设为40~50。HDFS相关配置(1)dfs.replication文件副本数,通常设为3,不推荐修改。(2)dfs.block.sizeHDFS中数据block大小,默认为64M,对于较大集群,可设为128MB或者256MB。(也可以通过参数mapred.min.split.size配置)(3)mapred.local.dir和dfs.data.dir这两个参数mapred.local.dir和dfs.data.dir配置的值应当是分布在各个磁盘上目录,这样可以充分利用节点的IO读写能力。运行Linuxsysstat包下的iostat-dx5命令可以让每个磁盘都显示它的利用率。map/reduce相关配置(1){map/reduce}.tasks.maximum同时运行在TaskTracker上的最大map/reducetask数,一般设为(core_per_node)/2~2*(cores_per_node)。(2)io.sort.factor当一个maptask执行完之后,本地磁盘上(mapred.local.dir)有若干个spill文件,maptask最后做的一件事就是执行mergesort,把这些spill文件合成一个文件(partition)。执行mergesort的时候,每次同时打开多少个spill文件由该参数决定。打开的文件越多,不一定mergesort就越快,所以要根据数据情况适当的调整。(3)mapred.child.java.opts设置JVM堆的最大可用内存,需从应用程序角度进行配置。(4)io.sort.mbMaptask的输出结果和元数据在内存中所占的buffer总大小。默认为100M,对于大集群,可设为200M。当buffer达到一定阈值,会启动一个后台线程来对buffer的内容进行排序,然后写入本地磁盘(一个spill文件)。(5)io.sort.spill.percent这个值就是上述buffer的阈值,默认是0.8,即80%,当buffer中的数据达到这个阈值,后台线程会起来对buffer中已有的数据进行排序,然后写入磁盘。(6)io.sort.recordIo.sort.mb中分配给元数据的内存百分比,默认是0.05。这个需要根据应用程序进行调整。(7)mapred.compress.map.output/Mapred.output.compress中间结果和最终结果是否要进行压缩,如果是,指定压缩方式(Mapred.compress.map.output.codec/Mapred.output.compress.codec)。推荐使用LZO压缩。Intel内部测试表明,相比未压缩,使用LZO压缩的TeraSort作业运行时间减少60%,且明显快于Zlib压缩。3.2.6reducetask相关配置(8)Mapred.reduce.parallelReduceshuffle阶段copier线程数。默认是5,对于较大集群,可调整为16~25。设置好内存至关重要Hadoop集群安装完毕后,第一件事就是修改bin/hadoop-evn.sh文件设置内存。主流节点内存配置为32GB,典型场景内存设置如下:NN:15-25GBJT:2-4GBDN:1-4GBTT:1-2GB,ChildVM1-2GB集群的使用场景不同相关设置也有不同,如果集群有大量小文件,则要求NN内存至少要20GB,DN内存至少2GB。Hadoop1.0的局限-MapReduce•扩展性–集群最大节点数–4000–最大并发任务数–40000•可用性–JobTracker负载较重–存在单点故障,一旦故障,所有执行的任务的全部失败•批处理模式,时效性低–仅仅使用MapReduce一种计算方式•低效的资源管理–把资源强制划分为maptaskslot和reducetaskslot,当系统中只有maptask或者只有reducetask的时候,会造成资源的浪费当map-reducejob非常多的时候,会造成很大的内存开销,潜在来说,也增加了JobTrackerfail的风险,这也是业界普遍总结出老Hadoop的Map-Reduce只能支持4000节点主机的上限。Hadoop2.0新特性:YARN-架构及组件•ResourceManager–处理客户端请求–启动/监控ApplicationMaster–监控NodeManager–资源分配与调度•ApplicationMaster–数据切分–为应用程序申请资源,并分配给内部任务–任务监控与容错•NodeManager–单个节点上的资源管理–处理来自ResourceManager的命令–处理来自ApplicationMaster的命令YARN是Hadoop2.0中的资源管理系统,它是一个通用的资源管理模块,可为各类应用程序进行资源管理和调度。Hadoop2.0新特性:YARN-1.0资源调度•Hadoop1.0采用了静态资源设置策略,即每个节点实现配置好可用的slot总数,这些slot数目一旦启动后无法再动态修改•Hadoop1.0将slot分为Mapslot和Reduceslot两种,不允许共享,同时其它应用也无法共享资源•没引入有效的资源隔离机制,采用了基于jvm的资源隔离机制,过于粗糙,很多资源,比如CPU,无法进行隔离核心概念:Slot,只能实现资源的静态管理和分配Hadoop2.0新特性:YARN的资源调度模型核心概念:Container,实现资源动态管理和分配Hadoop2.0新特性:YARN的资源调度特点•支持CPU和内存两种资源调度方式,允许配置每个节点、每个任务可用的CPU和内存资源总量•可以根据实际需要和CPU性能将每个物理CPU划分成若干个虚拟CPU。管理员可为每个节点单独配置可用的虚拟CPU个数,用户程序也可指定每个任务需要的虚拟CPU个数•可为每个节点单独配置可用内存,采用线程监控的方案控制内存使用,发现任务超过约定的资源量会将其杀死•Mesos等资源管理软件YARN的资源调度控制•内存资源控制—YARN并没有显式地对内存资源进行强制隔离—可以使用JVM提供的内存隔离机制—对于YARN而言,目前所做的工作是监控每个任务的进程树。—发送TERM和KILL两个信号将整个进程树杀死—一些特殊的任务,使用Cgroups对内存进行严格的隔离•CPU资源控制—CPU资源按照百分比进行使用和隔离(Cgroup的cpu.shares,hadoop2.2.0以后支持)—YARN采用了CGroups对CPU资源进行隔离,需要注意的是,CGroups采用的是CPU资源下限控制法,该方法是一种公平共享的方法,—未来:限制每个container的CPU资源使用上限(Cgroup的cpu.cfs_quota_us和cpu.cfs_period_us)—未来:限制yarn使用的CPU上限•IO资源控制—IO资源分为磁盘IO和网络IO两种—YARN仿照“虚拟cpu”的概念,引入了“虚拟磁盘”(vdisk)Yarn资源分配案例ResourceManager将资源分配给应用程序的ApplicationMaster,比如将资源node1,1CPU,2GB分配给appMaster1,而appMaster1则会进一步与node1上的NodeManager通信,启动一个占用1CPU和2GB内存的任务,YARN中内存资源的调度和隔离基于以上考虑,YARN允许用户配置每个节点上可用的物理内存资源,注意,这里是“可用的”,因为一个节点上的内存会被若干个服务共享,比如一部分给YARN,一部分给HDFS,一部分给HBase等,YARN配置的只是自己可以使用的,配置参数如下:(1)yarn.nodemanager.resource.memory-mb表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。(2)yarn.nodemanager.vmem-pmem-ratio任务每使用1MB物理内存,最多可使用虚拟内存量,默认是2.1。(3)yarn.nodemanager.pmem-check-enabled是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true。(4)yarn.nodemanager.vmem-check-enabled是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。(5)yarn.scheduler.minimum-allocation-mb单个任务可申请的最少物理内存量,默认是1024(MB),如果一个任务申请的物理内存量少于