对于大规模CDP集群,namenode性能直接影响集群的整体性能,文中通过数项参数的优化来提升HDFS的namenode性能。


0. ENV
CDP7.1.6;
CM7.4.4。


1. 问题现象

HDFS Log4j StateChange 配置(log4j.logger.org.apache.hadoop.hdfs.StateChange)设置的日志级别高于ERROR。Cloudera 建议将此值更改为 ERROR 以匹配 log4j.logger.BlockStateChange属性。因为,除非出现错误,否则不需要详细记录 StateChange 操作,这可能会导致明显的性能下降。


2. 优化过程
默认情况下,以下属性设置为空白,因此没有限制 Namenode 操作进入审计日志。
诸如getfileinfo 之类的操作 会导致获取与文件关联的元数据,并且在大型/读取密集型集群中,它可能会生成过多的审计日志。因此,建议仅在启用审计日志调试时才审计日志 getfileinfo 。
在hdfs-site.xml调整:
<property><name>dfs.namenode.audit.log.debug.cmdlist<\name><value>getfileinfo<\value><description>A comma separated list of NameNode commands that are written to the HDFSnamenode audit log only if the audit log level is debug.<\description><\property>
在 Cloudera Manager 中,您可以在“ NameNode Advanced Configuration Snippet (Safety Valve) for hdfs-site.xml ”下添加属性。
CM > 配置 > Configuration Search,搜索“hdfs-site.xml”,找到“hdfs-site.xml 的 NameNode 高级配置代码段(安全阀)”,添加配置:
名称:dfs.namenode.audit.log.debug.cmdlist值:getfileinfo点击“保存更改”。

2.2 降低日志记录频率
此外,BlockStateChange 和 StateChange 相关的日志记录只有在这些操作失败时才有用,即这些类的日志条目是 ERROR。在默认的 INFO 级别,这两个类会在 Namenode 日志中生成大量日志条目。您可以通过在 Hadoop 配置中的log4j.properties文件中添加以下行来降低日志记录频率。在 Cloudera Manager 下,可以在“ NameNode Logging Advanced Configuration Snippet (Safety Valve)”下添加这些属性。
log4j.logger.BlockStateChange=ERRORlog4j.logger.org.apache.hadoop.hdfs.StateChange=ERROR
CM > 配置 > Configuration Search,搜索“namenode log”,找到“NameNode 日志记录高级配置代码段(安全阀)”,添加上面两行配置,点击“保存更改”。

2.3 避免为getContentSummary递归调用外部授权方
getContentSummary通常是一个昂贵的操作。在安全性由 Apache Ranger 等外部组件管理的安全环境中,它变得更加昂贵,因为权限检查是通过递归调用执行的,以检查路径中的所有后代。HDFS-14112引入了一项改进,只需使用subaccess进行一次调用,因为通常他们不必评估路径的每个组件。
hdfs-site.xml中的更改:
<property><name>dfs.permissions.ContentSummary.subAccess</name><value>false</value><description>If "true", the ContentSummary permission checking will use subAccess.If "false", the ContentSummary permission checking will NOT use subAccess.subAccess means using recursion to check the access of all descendants.</description></property>
再次在 Cloudera Manager 中将属性放在“NameNode Advanced Configuration Snippet (Safety Valve) for hdfs-site.xml ”下
建议将此属性设置为 true 以便使用subAccess。
CM > 配置 > Configuration Search,搜索“hdfs-site.xml”,找到“hdfs-site.xml 的 NameNode 高级配置代码段(安全阀)”,添加配置:
名称:dfs.permissions.ContentSummary.subAccess值:true
点击“保存更改”。

注意:此改进仅在 CDP 版本中可用,较旧的 CDH/HDP 版本没有此改进,因此不建议在 CDH/HDP 版本上添加此配置。
2.4 优化块报告
在繁忙的大型集群(例如 200 个 Datanodes)中,重要的是不要让 NameNode 过于频繁地从 datanode 报告完整块。如果 NameNode 已经降级,则块报告会进一步增加 NameNode 的压力。NameNode 处理块报告的速度可能很慢,以至于您最终会在 NameNode 日志中看到诸如“块报告队列已满”之类的消息。
有趣的是,要注意的是,虽然默认块报告队列大小设置为1024,我们可以看到这款“阻止报告队列满,即使在我们称之为块报告一遇的洪水,也当你的NameNode的RPC一个NameNode会启动”消息处理时间太长,无法表明 NameNode 严重降级,从而导致报告积压,最终导致队列溢出。
虽然块报告队列大小是可配置的,并且您基本上可以增加队列大小,但更好的方法是优化数据节点发送块报告的方式。
我们建议使用三管齐下的方法来更改hdfs-site.xml 中的以下内容:
1) 按体积拆分块报告(默认值 1000000)
<property><name>dfs.blockreport.split.threshold</name><value>0</value><description>If the number of blocks on the DataNode is below this threshold then it will send block reports for all Storage Directories in a single message. If the number of blocks exceeds this threshold then the DataNode will send block reports for each Storage Directory in separate messages. Set to zero to always split.</description></property>

2) 将完整区块报告频率从默认的6小时减少到12小时
<property><name>dfs.blockreport.intervalMsec</name><value>43200000</value><description>Determines block reporting interval in milliseconds.</description></property>
3) 批处理增量报告(默认值0禁用批处理)
<property><name>dfs.blockreport.incremental.intervalMsec</name><value> 100 </value><description>If set to a positive integer, the value in ms to wait between sending incremental block reports from the Datanode to the Namenode.</description></property>
所有 3 个都属于Cloudera Manager 中的“ NameNode Advanced Configuration Snippet (Safety Valve) for hdfs-site.xml ”。
同样在“hdfs-site.xml 的 NameNode 高级配置代码段(安全阀)”,添加上述3处配置:


点击“重启过时服务”

如果不允许停止业务,默认使用“滚动重启”。在业务允许停止时,建议去掉“滚动重启”对勾,点击立即重启。

重启正常,点击继续。

重启后,确保各项服务正常。



3. 小结
对hdfs的namenode中hdfs-site.xml和log4j.properties部分参数进行了优化,调试日志审核、日志记录频率、getContentSummary递归调用、优化块报告数项优化,来提升大规模集群的namenode性能。


4. Ref
https://community.cloudera.com/t5/Community-Articles/Scaling-the-HDFS-NameNode-part-5/ta-p/327450
旨在交流,不足之处,还望抛砖。
作者:王坤,微信公众号:rundba,欢迎转载,转载请注明出处。
如需公众号转发,请联系wx: landnow。





