Hadoop集群调优

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_43215250/article/details/90714934
  1. 系统层面调优

    1. 避免使用 swap 分区:

      swap 分区指的系统的物理内存不够用的时候,把物理内存中的一部分空间释放出来,以供当前运行的程序使用。
      通过 vm.swappiness 参数控制,值阈为0 ~ 100,值越高说明操作系统内核更积极的将应用程序的数据交换到磁盘。
      将 Hadoop 守护进程的数据交换到磁盘是很危险的,有可能导致操作超时,所以一般将改值设为0

    2. 内存分配策略

      vm.overcommit_memory 的值决定分配策略,值通常为 0, 1 和 2
      0 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
      1 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
      2 表示内核允许分配超过所有物理内存和交换空间总和的内存,并且通过 vm.overcommit_ratio 的值设置超过的比例, 50 表示超过物理内存 50% 。
      建议 vm.overcommit_memory 设置为 2 ,并调整 vm.overcommit_ratio 。

      修改 vm.overcommit_memory 的三种方式

      1. 编辑/etc/sysctl.conf ,增加一行 vm.overcommit_memory = 2 ,然后 sysctl -p 使配置文件生效
      2. sysctl vm.overcommit_memory = 2
      3. echo 2 > /proc/sys/vm/overcommit_memory
    3. 修改 net.core.somaxconn 参数

      net.core.somaxconn 是 Linux 中的一个内核(kernel) 参数,表示 socket 监听的 backlog 上限。
      backlog 是 socket 的监听队列,当一个请求尚未被处理或建立时,会进入backlog。
      而 socket server 可以一次性处理 backlog 中的所有请求,处理后的请求不再位于监听队列中。
      当 server 处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。

      修改 net.core.somaxconn 的三种方式:

      1. 编辑/etc/sysctl.conf, 增加一行 net.core.somaxconn = 32768 ,然后 sysctl -p 使配置文件生效
      2. sysctl -w net.core.somaxconn = 32768
      3. echo 32768 >/proc/sys/net/core/somaxconn

      注意

      在core-default.xml中参数 ipc.server.listen.queue.size 控制 socket server 的监听队列长度,即 backlog 长度,默认为 128 。 而 Linux 的参数 net.core.somaxconn 默认也为 128 ,当服务端(NameNode 或 ResourceManager)繁忙时, 128 是远远不够的,这样需要调大 backlog,建议为大于等于 32768, 并修改 Hadoop 的 ipc.server.listen.queue.size 的参数。

    4. 增大同时打开文件描述符的上限

    5. 禁用文件的访问时间

    6. 关闭 THP

      THP (Transparent Huge Pages)是管理 Huge Pages 自动化的抽象层, 而 Huge Pages 是大小为 2MB ~ 1GB 的内存页。
      在运行 Hadoop 作业时, THP 会引起 CPU 占用率偏高,故需要将其关闭。

    虚拟 CPU 个数计算方法

    CPU 个数 * 单个 CPU 核数 * 单个 CPU 核的超线程数
    
     为了避免资源浪费, 虚拟 CPU 与内存需满足线性比例: 1 : 4 G ~ 8 
    

    硬盘大小

    需考虑临时数据的存储: 20% ~ 30%

     (存储的数据量 * 副本数 ) / DataNode数 * (1 + 0.2 ~ 0.3)
    
  2. HDFS 参数调优

    1. hdfs-site.xml 参数

      <property>
      	<name>dfs.block.size</name>
      	<value>134217728</value>
      </property>
      

      解释: Hadoop 的文件块大小,通常设为 128MB 或 256MB

      <property>
          <name>dfs.namenode.handler.count</name>
          <value>40</value>
      </property>
      

      解释: NameNode 同时 和 DataNode 通信的线程数,默认为 10。
      设置大小计算方法:

      python -c 'import math ; print int(math.log(6) * 20)'    # N 为 DataNode 个数
      
      <property>
          <name>dfs.datanode.max.xcievers</name>
          <value>65536</value>
      </property>
      

      解释: dfs.datanode.max.xcievers 对于 DataNode 如同 Linux 上文件句柄限制。
      当 DataNode 上面的连接数超过配置中的设置时, DataNode 就会拒绝连接,修改设置为 65536 。

      <property>
      	<name>dfs.datanode.balance.bandwidthPerse</name>
      	<value>10485760</value>
      </property>
      

      解释: 执行 start-balancer.sh 的带宽,默认为 1048576 (1MB/s),将其调大为 20MB/s

      <property>
      	<name>dfs.replication</name>
      	<value>3</value>
      </property>
      

      解释: HDFS 文件副本数,默认为 3, 当许多任务同时读取一个文件时,读取可能会造成瓶颈。
      增大副本数可以有效缓解这种情况,但是也会造成大量的磁盘占用空间。
      这时可以只修改 Hadoop 客户端的配置,那么从 Hadoop 客户端上传的文件副本数将以 Hadoop 客户端为准。

      <property>
      	<name>dfs.datanode.max.transfer.threads</name>
      	<value>4096</value>
      </property>
      

      解释: 设置 DataNode 在文件传输时最大线程数,通常设置为 8192。
      如果集群中某台 DataNode 主机上的这个值比其他主机的大, 那么会导致这台主机上的存储数据比别的主机相对要多,
      从而会导致数据分布不均匀的问题,即使 balance 任然会不均匀。

    2. core-site.xml 参数

      <property>
          <name>io.file.buffer.size</name>
          <value>131072</value>
      </property>
      

      解释: Hadoop 缓冲区大小用于 HDFS 的文件的读写和 map 过程的中间结果输出,默认为 4KB,增加到 128KB。

      <property>
          <name>fs.trash.interval</name>
          <value>0</value>
      </property>
      

      解释: 开启 HDFS 文件删除自动转移到垃圾箱的选项,值为垃圾箱文件清除时间。
      一般开启这个会比较好,以防错误删除重要文件。默认值为 0,单位是分钟。

    3. yarn-site.xml 参数

      <property>
          <name>yarn.nodemanager.resource.memory-mb</name>
          <value>8192</value>
      </property>
      

      解释: yarn.nodemanager.resource.memory-mb 表示物理节点有多少内存加入资源池。
      设置该值时,注意为操作系统和其他服务预留资源。

      <property>
          <name>yarn.nodemanager.resource.cpu-vcores</name>
          <value>8</value>
      </property>  
      

      解释: yarn.nodemanager.resource.cpu-vcores 表示物理节点有多少虚拟 CPU 加入资源池。
      设置该值时,注意为操作系统和其他服务预留资源。

      <property>
          <name>yarn.scheduler.increment-allocation-mb</name>
          <value>1024</value>
      </property>  
      

      解释: yarn.scheduler.increment-allocation-mb 表示内存申请的归整化单位,即内存增量。
      如果申请的内存为 1.5GB,将被计算为 2GB。

      <property>
          <name>yarn.scheduler.increment-allocation-vcores</name>
          <value>1</value>
      </property>  
      

      解释: yarn.scheduler.increment-allocation-vcores 表示虚拟 CPU 申请的归整化单位,即 CPU 增量, 默认为 1 个。

      <property>
          <name>yarn.scheduler.maximum-allocation-mb</name>
          <value>8192</value>
      </property>  
      

      解释: 单个任务(容器)能够申请到的最大内存资源,根据容器内存总量进行设置,默认为 8GB。
      如果设定为和参数 yarn.nodemanager.resource.memory-mb 一样,那么表示单个任务使用的内存资源不受限制。

      <property>
          <name>yarn.scheduler.minimum-allocation-mb</name>
          <value>8192</value>
      </property>  
      

      解释: 单个任务(容器)能够申请到的最小内存资源,默认为 1GB。

      <property>
          <name>yarn.scheduler.maximum-allocation-vcores</name>
          <value>4</value>
      </property>  
      

      解释: 单个任务(容器)能够申请到的最大虚拟 CPU 数,根据容器虚拟 CPU 总数进行设置,默认为 4。
      如果设定为和参数 yarn.nodemanager.resource.cpu-vcores 一样,那么表示单个任务使用的 CPU 资源不受限制。

      <property>
          <name>yarn.scheduler.minimum-allocation-vcores</name>
          <value>1</value>
      </property>  
      

      解释: 单个任务(容器)能够申请到的最小虚拟 CPU 资源,默认为 1。

    4. mapred-site.xml 参数

      <property>
          <name>mapreduce.map.output.compress</name>
          <value>true</value>
      </property>   
      

      解释: 表示 Map 任务的中间结果是否压缩。
      当设为 true 时,会对中间结果进行压缩,这样会减少数据传输时需要的带宽。
      设为 true 后,还可以设置 >mapreduce.map.output.compress.codec 进行压缩算法的选择。
      CDH5 已经内置 snappy 算法,还可以选择 LZO 等压缩算法,其中有些需要额外安装。

      <property>
          <name>mapreduce.job.jvm.numtasks</name>
          <value>-1</value>
      </property>  
      

      解释: 表示 JVM 重用设置,默认为 1,表示 1 个 JVM 只能启动一个任务。
      设为 -1 ,表示 1 个 JVM 可以启动的任务不受限制。

      <property>
          <name>mapreduce.map.speculative</name>
          <value>true</value>
      </property>   
      
      <property>
          <name>mapreduce.reduce.speculative</name>
          <value>true</value>
      </property>   
      

      解释: 开启 Map任务/ Reduce任务的推测机制。
      推测机制可以有效的防止因为瓶颈而导致拖累整个作业,但也要注意,推测执行会抢占抢占系统资源,默认设置为 true。

      <property>
          <name>mapreduce.cluster.local.dir</name>
          <value>/data0/mapred,/data1/mapred,/data2/mapred,/data3/mapred</value>
      </property>  
      

      解释: 表示 MapReduce 的中间结果的本地存储路径,该值设定为多磁盘目录有助于提高 I/O 效率。

      <property>
          <name>mapred.child.java.opts</name>
          <value></value>
      </property>         
      

      解释: 表示执行 Map 任务和 Reduce 任务的 JVM 参数,该配置还可以配置 GC 等常见的 Java 选项。
      参考值: -XX:-UseGCOverheadLimit -Xms512m -Xmx2048m -verbose:gc 。
      该参数粒度过粗, Map 任务和 Reduce 任务的内存需求和堆大小一般不同,所以这些参数一般单数设定。

      <property>
          <name>mapreduce.map.java.opts</name>
          <value>-Djava.net.preferIPv4Stack=true</value>
      </property>  
      

      解释: 该参数表示执行 Map 任务时的 JVM 参数,弥补 mapred.child.java.opts 参数粒度过粗的不足。

      <property>
          <name>mapreduce.reduce.java.opts</name>
          <value>-Djava.net.preferIPv4Stack=true</value>
      </property> 
      

      解释: 该参数表示执行 Reduce 任务时的 JVM 参数,弥补 mapred.child.java.opts 参数粒度过粗的不足。

      <property>
          <name>mapreduce.map.memory.mb</name>
          <value>-1</value>
      </property>  
      

      解释: 该参数表示执行 Map 任务需要的内存大小,它可以从 mapreduce.map.java.opts 参数设定的值继承,如果没有设定,该值根据容器内存设置。

      <property>
          <name>mapreduce.map.cpu.vcores</name>
          <value>1</value>
      </property>  
      

      解释: 该参数表示执行 Map 任务需要的虚拟 CPU 数,默认值为 1。
      根据容器虚拟 CPU 数设定,可以适当加大,并且该值与参数 mapreduce.map.memory.mb 成线性比例才不至于浪费资源。

      <property>
          <name>mmapreduce.reduce.memory.mb </name>
          <value>-1</value>
      </property> 
      

      解释: 该参数表示执行 Reduce 任务需要的内存大小。
      它可以从 mapreduce.map.java.opts 参数设定的值继承,如果没有设定,该值根据容器内存设置。
      一般要大于 mapreduce.map.memory.mb 。

      <property>
          <name>mapreduce.reduce.cpu.vcores</name>
          <value>1</value>
      </property>  
      

      解释: 该参数表示执行 Reduce 任务需要的虚拟 CPU 数,默认值为 1。
      根据容器虚拟 CPU 数设定,可以适当加大,并且该值与参数 mapreduce.reduce.memory.mb 成线性比例才不至于浪费资源。
      一般要大于 mapreduce.map.cpu.vcores 。

      <property>
          <name>yarn.app.mapreduce.am.resource.cpu-vcores</name>
          <value>1</value>
      </property>  
      

      解释: 该参数表示执 MapReduce 作业的 ApplicationMaster(二级调度器) 向 ResourceManager(一级调度器) 申请的虚拟 CPU 个数,默认值为 1,可以适当调大。

      <property>
          <name>yarn.app.mapreduce.am.resource.mb</name>
          <value>1536</value>
      </property>  
      

      解释: 该参数表示执 MapReduce 作业的 ApplicationMaster(二级调度器) 向 ResourceManager(一级调度器) 申请的内存大小,默认值为 1536 MB,可以适当调大。

      <property>
          <name>mapreduce.task.io.sort.mb</name>
          <value>100</value>
      </property>  
      

      解释: 该参数表示 Map 任务的输出的环形缓冲区大小,默认为 100MB,可以适当调大。

      <property>
          <name>mapreduce.task.io.sort.factor</name>
          <value>10</value>
      </property>  
      

      解释: 该参数为控制 Map 端和 Reduce 端的合并策略,表现为一次合并的文件数目,默认值为 10。
      该值如果过大会使合并时内存消耗过大,如果过小会增加合并次数。

      <property>
          <name>mapreduce.map.sort.spill.percent</name>
          <value>0.80</value>
      </property>  
      

      解释: 该参数表示 Map 任务的输出的环形缓冲区的阈值,一旦缓存区的内容占缓冲区的比例超过该值,则将缓冲区的内容刷写到
      mapreduce.cluster.local.dir 所配置的目录,默认为 0.8,建议不低于 0.5。

      <property>
          <name>mapreduce.reduce.shuffle.parallelcopies</name>
          <value>25</value>
      </property>       
      

      解释: 该参数表示 Reduce 任务从 Map 任务复制输出的工作线程数,默认为 5, 可以适当调高。
      如果设置过高,会导致大量数据在网络同时传输,引起 I/O 压力过大,比较科学的设定方式为 4 * lgN ,其中 N 为集群容量大小。
      mapreduce.cluster.local.dir 所配置的目录,默认为 0.8,建议不低于 0.5。

      <property>
          <name>mapreduce.reduce.shuffle.input.buffer.percent</name>
          <value>0.7</value>
      </property>  
      

      解释: 该参数表示 shuffle 中的复制阶段耗费 Reduce 任务堆比例,默认为 0.7。
      Reduce 任务的堆由前面的配置计算得出,可以根据具体情况进行增减。

      <property>
          <name>mapreduce.reduce.shuffle.merge.parallelcopies</name>
          <value>0.66</value>
      </property>  
      

      解释: 表示当内存使用率超过该参数时,将会触发一次合并操作,已将内存中的数据刷写到磁盘上,默认值为 0.66,可以根据具体情况适当调整。

      <property>
          <name>mapreduce.job.reduce.slowstart.completedmaps</name>
          <value>0.05</value>
      </property>
      

      解释: 该参数控制 Reduce 任务的启动时机,默认值为 0.05。
      表示当 Map 任务完成数目达到 5% 时,启动 Reduce 任务,这是为较缓慢的网络传输设计的,可以适当调高。
      不过 Reduce 任务启动时间过早或者过晚都会增加作业的完成时间。
      如果不加设定, MapReduce 作业的 Reduce 个数默认为 1,可以根据需要在作业中进行设定。

    除了以上配置,还可以配置任务调度器,设置跳过坏记录来提高执行效率。

Hadoop 的参数调优主要遵循以下3条原则:

  1. 增大作业并行度,如增大 Map 任务的数量;
  2. 保证任务执行时有足够的资源;
  3. 满足上两条原则的前提下,尽可能的为 Shuffle 阶段提供资源。

这3点不仅只对 Hadoop 适用,对其他很多分布式计算框架同样适用,如 Apache Spark 。

猜你喜欢

转载自blog.csdn.net/weixin_43215250/article/details/90714934
今日推荐