【Hadoop】Hadoop及Yarn调优

Hadoop及Yarn调优

  • HDFS参数调优(hdfs-site.xml)
  • YARN参数优化(yarn-site.xml)
  • MapReduce调优
    • mapreduce运行慢的主要原因可能有哪些?
    • mapreduce的优化方法
    • 常用的调优参数
      • 1. mapred-site.xml
      • 2. yarn-default.xml
      • 3. Shuffle性能优化的参数
      • 4. MapReduce性能优化参数
    • hdfs小文件解决办法
      • 1. 小文件的问题弊端
      • 2. 小文件的解决方案

HDFS参数调优(hdfs-site.xml)

  • 调整namenode处理客户端的线程数:dfs.namenode.handler.count=20 * log2(Cluster Size),比如集群规模为8台时,此参数设置为60
    官方说明为:The number of Namenode RPC server threads that listen to requests from clients. If dfs.namenode.servicerpc-address is not configured then Namenode RPC server threads listen to requests from all nodes.
    NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。对于大集群或者有大量客户端的集群来说,通常需要增大参数dfs.namenode.handler.count的默认值10。设置该值的一般原则是将其设置为集群大小的自然对数乘以20,即20logN,N为集群大小。
  • 编辑日志存储路径dfs.namenode.edits.dir设置与镜像文件存储路径dfs.namenode.name.dir尽量分开,达到最低写入延迟
  • 元数据信息fsimage多目录冗余存储配置

YARN参数优化(yarn-site.xml)

  • 根据实际调整每个节点和单个任务申请内存值
    • yarn.nodemanager.resource.memory-mb
      表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。
    • yarn.scheduler.maximum-allocation-mb
      单个任务可申请的最多物理内存量,默认是8192(MB)。
  • Hadoop宕机
    • 如果MR造成系统宕机。此时要控制Yarn同时运行的任务数,和每个任务申请的最大内存。调整参数:yarn.scheduler.maximum-allocation-mb(单个任务可申请的最多物理内存量,默认是8192MB)
    • 如果写入文件过量造成NameNode宕机。那么调高Kafka的存储大小,控制从Kafka到HDFS的写入速度。高峰期的时候用Kafka进行缓存,高峰期过去数据同步会自动跟上。

MapReduce调优

mapreduce运行慢的主要原因可能有哪些?

MapReduce程序效率的瓶颈在于两点:

  • 计算机性能
    CPU、内存、磁盘健康、网络
  • I/O操作优化
    • 数据倾斜
    • map和reduce数设置不合理
    • map运行时间太长,导致reduce等待过久
    • 小文件过多
    • 大量的不可分割的超大文件
    • spill次数过多
    • merge次数过多

mapreduce的优化方法

MapReduce优化方法主要从六个方面考虑:数据输入Map阶段Reduce阶段IO传输数据倾斜问题和常用的调优参数

  1. 数据输入阶段

    • 合并小文件:在执行mr任务前将小文件进行合并;因为大量的小文件会产生大量的map任务,任务都需要初始化,从而导致mr运行缓慢
    • 采用CombineTextInputFormat来作为输入,解决输入端大量小文件场景。
  2. Map Task任务运行阶段

    • 减少spill溢写次数:通过调整mapreduce.task.io.sort.mbmapreduce.map.sort.spill.percent参数的值,增大触发spill的内存上限,减少spill次数,从而减少磁盘io的次数
    • 减少merge合并次数:调整mapreduce.task.io.sort.factor参数,增大merge的文件数,减少merge的次数,从而缩短mr处理时间
    • 在map之后,不影响业务逻辑的情况下,先进行combine处理,减少I/O
  3. Reduce Task任务运行阶段

    • 设置合理的map、reduce个数:两个数值都不能太小,也不能太大;太少,导致task执行时长边长;太多,导致map、reduce任务间竞争资源,造成处理超时错误。
    • 设置map、reduce共存:调整mapreduce.job.reduce.slowstart.completedmaps参数(默认0.05),是map运行到一定程度后,reduce也开始运行,减少reduce的等待时间
    • 规避使用reduce:因为reduce在用于连接数据集的时候会产生大量的网络消耗
    • 合理设置reduce端的buffer:默认情况下,数据达到一定阈值的时候,Buffer中的数据会写入磁盘,然后reduce会从磁盘中获得所有的数据。即Buffer与reduce没有关联的,中间多次写磁盘、读磁盘的过程。那么可以通过调整参数,使得Buffer中的数据可以直接输送到reduce,从而减少I/O开销mapreduce.reduce.input.buffer.percent默认为0.0,当值大于0的时候,会保留指定比例的内存读Buffer中的数值直接拿给Reducer使用。这样一来,设置Buffer需要内存,读取数据需要内存,Reduce计算也需要内存,所以要根据作业的运行情况进行调整。
  4. IO传输阶段

    • 进行数据压缩:减少网络I/O的数据量,安装snappylzo压缩编码器
    • 使用SequenceFile二进制文件
  5. 数据倾斜的优化

    • 数据倾斜现象:
      • 数据频率倾斜:某一区域的数据量要远远大于其他区域
      • 数据大小倾斜:部分记录的大小远远大于平均值
    • 减少数据倾斜的方法:
      • 方法1:抽样和范围分区:对原始数据进行抽样,根据抽样数据集,预设分区边界值
      • 方法2:自定义分区:基于map输出key的背景知识,进行自定义分区。例如,如果map输出键的单词来源于一本书,且其中某些专业词汇出现的次数比较多,那么就可以自定义分区将这些专业词汇发送给固定的若干reduce任务。而将其他的都发送个剩余的reduce任务
      • 方法3:Combine:使用combine减少数据倾斜。在可能的情况下,Combine的目的是聚合并精简数据
      • 方法4:采用Map Join,尽量避免Reduce Join

常用的调优参数

1. mapred-site.xml

以下参数在用户自己的MR应用程序中配置后就可以生效(mapred-default.xml

配置参数 参数说明
mapreduce.map.memory.mb 一个MapTask可使用的资源上限(单位:MB),默认为1024。如果MapTask实际使用的资源量超过该值,则会被强制杀死。
mapreduce.reduce.memory.mb 一个ReduceTask可使用的资源上限(单位:MB),默认为1024。如果ReduceTask实际使用的资源量超过该值,则会被强制杀死。
mapreduce.map.cpu.vcores 每个MapTask可使用的最多cpu core数目,默认值: 1
mapreduce.reduce.cpu.vcores 每个ReduceTask可使用的最多cpu core数目,默认值: 1
mapreduce.reduce.shuffle.parallelcopies 每个Reduce去Map中取数据的并行数。默认值是5
mapreduce.reduce.shuffle.merge.percent Buffer中的数据达到多少比例开始写入磁盘。默认值0.66
mapreduce.reduce.shuffle.input.buffer.percent Buffer大小占Reduce可用内存的比例。默认值0.7
mapreduce.reduce.input.buffer.percent 指定多少比例的内存用来存放Buffer中的数据,默认值是0.0

2. yarn-default.xml

应该在YARN启动之前就配置在服务器的配置文件中才能生效(yarn-default.xml

配置参数 参数说明
yarn.scheduler.minimum-allocation-mb 给应用程序Container分配的最小内存,默认值:1024
yarn.scheduler.maximum-allocation-mb 给应用程序Container分配的最大内存,默认值:8192
yarn.scheduler.minimum-allocation-vcores 每个Container申请的最小CPU核数,默认值:1
yarn.scheduler.maximum-allocation-vcores 每个Container申请的最大CPU核数,默认值:32
yarn.nodemanager.resource.memory-mb 给Containers分配的最大物理内存,默认值:8192

3. Shuffle性能优化的参数

Shuffle性能优化的关键参数,应在YARN启动之前就配置好(mapred-default.xml

配置参数 参数说明
mapreduce.task.io.sort.mb Shuffle的环形缓冲区大小,默认100m
mapreduce.map.sort.spill.percent 环形缓冲区溢出的阈值,默认80%

4. MapReduce性能优化参数

配置参数 参数说明
mapreduce.map.maxattempts 每个Map Task最大重试次数,一旦重试参数超过该值,则认为Map Task运行失败,默认值:4。
mapreduce.reduce.maxattempts 每个Reduce Task最大重试次数,一旦重试参数超过该值,则认为Map Task运行失败,默认值:4。
mapreduce.task.timeout Task超时时间,经常需要设置的一个参数,该参数表达的意思为:如果一个Task在一定时间内没有任何进入,即不会读取新的数据,也没有输出数据,则认为该Task处于Block状态,可能是卡住了,也许永远会卡住,为了防止因为用户程序永远Block住不退出,则强制设置了一个该超时时间(单位毫秒),默认是600000。如果程序对每条输入数据的处理时间过长(比如会访问数据库,通过网络拉取数据等),建议将该参数调大,该参数过小常出现的错误提示是“AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster.”。

hdfs小文件解决办法

1. 小文件的问题弊端

  • HDFS上每个文件都要在NameNode上建立一个索引,这个索引的大小约为150byte,这样当小文件比较多的时候,就会产生很多的索引文件
  • 一方面会大量占用NameNode的内存空间,另一方面就是索引文件过大使得索引速度变慢。

2. 小文件的解决方案

  • 小文件的优化有以下几种方式:
    1)在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS。
    2)在业务处理之前,在HDFS上使用MapReduce程序对小文件进行合并
    3)在MapReduce处理时,可采用CombineTextInputFormat提高效率。
  1. hadoop archive
    高效的将小文件进行归档的工具,能将多个小文件打包成一个HAR文件,这样就减少了NameNode的内存使用
  2. sequence file
    Sequence File由一系列的二进制的key/value组成,如果key为文件名,value为文件内容,则可以将大量小文件合并到一个SequenceFile文件中
  3. CombineFileInputFormat
    CombineFileInputFormat用于将多个文件合并成一个单独的split,并且会考虑数据的存储位置。
  4. 开启jvm重用
    对于处理大量小文件的job,可以开启jvm重用,约减少40%的运行时间
    jvm重用原理:一个map运行在一个jvm上,开启重用的话,该map在jvm上运行完毕后,此jvm中会继续运行此job的其他map任务。具体设置:mapreduce.job.jvm.numtasks值在10到20之间

你可能感兴趣的:(Hadoop,MapReduce,Hadoop,Yarn,性能调优,jvm重用)