本文章來自 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一次,這樣雖然可能會造成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