• hdfs调优


    本文章来自 hackershell.cn,转载请标注出处

    描述

    这篇文章主要从一些配置设置相关方面去调优Hadoop集群的笔记,内容来自网上或一些实践经验

    1.HDFS审计日志

    HDFS审计日志是一个和进程分离的日志文件,默认是没有开启的,开启之后,用户的每个请求都会记录到审计日志当中,通过审计日志可以发现哪些ip,哪些用户对哪些目录做了哪些操作,比如:那些数据在哪些在什么时候删除,和分析哪些Job在密集的对NameNode进行访问,我们自己的版本中对访问记录了job的Id,在新版的HDFS中,新增加了callcontext的功能,也做了类似操作:HDFS-9184 Logging HDFS operation’s caller context into audit logs.

    如何开启,修改Hadoop-env.sh

    -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender}

    改为

    -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,RFAAUDIT}

    对应的log4j.properties可以新增保存个数

    #
    # hdfs audit logging
    #
    hdfs.audit.logger=INFO,NullAppender
    hdfs.audit.log.maxfilesize=2560MB
    hdfs.audit.log.maxbackupindex=30
    log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=${hdfs.audit.logger}
    log4j.additivity.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=false
    log4j.appender.RFAAUDIT=org.apache.log4j.RollingFileAppender
    log4j.appender.RFAAUDIT.File=/data1/hadoop-audit-logs/hdfs-audit.log
    log4j.appender.RFAAUDIT.layout=org.apache.log4j.PatternLayout
    log4j.appender.RFAAUDIT.layout.ConversionPattern=[%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}] [%p] %c{3}.%M(%F %L) [%t] : %m%n
    log4j.appender.RFAAUDIT.MaxFileSize=${hdfs.audit.log.maxfilesize}
    log4j.appender.RFAAUDIT.MaxBackupIndex=${hdfs.audit.log.maxbackupindex}

    开启异步的审计日志

    使用异步的log4j appender可以提升NameNode的性能,尤其是请求量在10000 requests/second,可以设置hdfs-site.xml

    <property>
        <name>dfs.namenode.audit.log.async</name>
        <value>true</value>
      </property>

    2.开启Service RPC端口

    在默认情况下,service RPC端口是没有使用的,client和DataNode汇报,zkfc的健康检查都会公用RPC Server,当client的请求量比较大或者DataNode的汇报量很大,会导致他们之间相互影响,导致访问非常缓慢,开启之后,DN的汇报和健康检查请求都会走Service RPC端口,避免了因为client的大量访问影响,影响服务之间的请求,在HA集群中,可以在hdfs-site.xml中设置

    <property>
        <name>dfs.namenode.servicerpc-address.mycluster.nn1</name>
        <value>mynamenode1.example.com:8021</value>
      </property>
    
      <property>
        <name>dfs.namenode.servicerpc-address.mycluster.nn2</name>
        <value>mynamenode2.example.com:8021</value>
      </property>

    开启之后,需要重置zkfc

    hdfs zkfc formatZK

    注意:

    修改这个端口需要重启集群,请自行评估带来的影响

    3.关闭多余的日志

    有时候,NameNode上日志打印会严重影响NN的性能,出问题时也会造成没必要的干扰,所以可以修改log4j的文件,对没必要的日志进行日志级别的调整,例如

    log4j.logger.BlockStateChange=WARN
    log4j.logger.org.apache.hadoop.ipc.Server=WARN

    社区上也有很多日志的优化方案

    • HDFS-9434
    • HADOOP-12903
    • HDFS-9941
    • HDFS-9906

    4.RPC FairCallQueue

    这个是基于上面第二点开启Service RPC继续说的,这是较新版本的Hadoop的新特性,RPC FairCallQueue替换了之前的单一的RPC queue的模式,RPC Server会维护并按照请求的用户进行分组,Handler会按照队列的优先级去消费queue里面的RPC Call,这个功能它可以防止因为某个用户的cleint的大量请求导致NN无法响应,整个集群瘫痪的状态,开启了之后,请求多的用户请求会被降级,这样不会造成多租户下,影响他用户的访问,后续会有文章介绍,相关的JIRA HDFS-10282

    如果开启,需要修改core-site.xml

      <property>
        <name>ipc.8020.callqueue.impl</name>
        <value>org.apache.hadoop.ipc.FairCallQueue</value>
      </property>
    <property>
      <name>ipc.8020.faircallqueue.decay-scheduler.period-ms</name>
      <value>60000</value>
    </property>

    注意

    不能对DataNode和NN通信的端口进行开启

    5.磁盘吞吐量

    对于NameNode来说,HDFS NameNode性能也依赖于flush edit logs到磁盘的速度,任何延迟将会导致将会影响RPC的处理线程,并对Hadoop集群造成连锁的性能影响。

    你应该使用专用的硬盘时存储edit logs,如果hdfs-site.xml中没有配置,将等于dfs.name.name.dir的值

     <property>
        <name>dfs.namenode.name.dir</name>
        <value>/mnt/disk1,/mnt/disk2</value>
      </property>

    对于DN来说,默认的Du,会产生大量的du -sk的操作,会造成集群严重的IO Wait增加,从而导致任务会变得缓慢

    负载图

    产生大量的DU操作

    解决方案是

    将同时产生的du操作,加个随机数,随机到集群的不同时间段,并且每天只du一次,这样虽然可能会造成hdfs上显示的使用率会有延时,但基本可以满足要求HADOOP-9884

    打patch之后,修改hdfs-site.xml

    <property>
      <name>fs.getspaceused.jitterMillis</name>
      <value>3600000</value>
    </property>
    <property>
      <name>fs.du.interval</name>
      <value>86400000</value>
    </property>
    <property>
      <name>dfs.datanode.cached-dfsused.check.interval.ms</name>
      <value>14400000</value>
    </property>

    6.避免读取stale DataNodes

    修改hdfs-site.xml

    dfs.namenode.avoid.read.stale.datanode=true
    dfs.namenode.avoid.write.stale.datanode=true

    7.开启short circuit reads

    开启短路读之后,当client读取数据时,如果在改节点,会直接通过文件描述符去读取文件,而不用通过tcp socket的方式

    修改hdfs-site.xml

    dfs.client.read.shortcircuit=true
    dfs.domain.socket.path=/var/lib/hadoop-hdfs/dn_socket

    8.关闭操作系统的Transparent Huge Pages (THP)

    操作系统默认开启THP,会导致整个Hadoop集群cpu sys态变高,详细步骤可以参考

    9.设置系统的vm.swappiness

    避免使用交换区

    添加vm.swappiness=0到/etc/sysctl.conf重启生效,或者sysctl -w vm.swappiness=0

    10.设置系统CPU为performance

    设置cpu的scaling governors为performance模式,你可以运行cpufreq-set -r -g performance或者修改/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor文件,并设置为performance

    参考文章

    https://support.huawei.com/enterprise/en/doc/EDOC1100043056/ddc366b3/optimizing-hdfs-namenode-rpc-qos

    Scaling the HDFS NameNode

    OS Configurations for Better Hadoop Performance

    hadoop DiskSetup

  • 相关阅读:
    MySQL 可重复读,差点就让我背上了一个 P0 事故
    Thread.sleep(0) 有什么用
    你不会还在用这8个错误的SQL写法吧?
    Spring事务失效的 8 大原因
    我说 SELECT COUNT(*) 会造成全表扫描,面试官让我回去等通知
    这么写参数校验(Validator)就不会被劝退了
    HyperLedger Fabric 1.4 基础环境搭建(7)
    HyperLedger Fabric 1.4 简介(6.1)
    HyperLedger Fabric 1.4 关键技术(6.4)
    HyperLedger Fabric 1.4 交易流程(6.3)
  • 原文地址:https://www.cnblogs.com/cwind/p/10569019.html
Copyright © 2020-2023  润新知