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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM