【前言】
通常后端服务都会设计自身的健康检测逻辑。
所谓的健康检测,就是定期检测节点运行所必须的环境是否满足需求,如果不满足则拒绝提供服务。
HDFS和YARN中涉及的各个服务也不例外,基本上也都设置了相应的检测逻辑。
当检测不满足指定条件时拒绝提供服务,直到所需的条件满足要求。
下面就来总结下hdfs与yarn涉及的组件的健康检测逻辑及相关配置。
【NameNode】
Namenode存储了整个HDFS的元数据信息,而这些元数据信息会持久化到磁盘上,如果磁盘满了,元数据信息无法写入的话,可能会导致数据的丢失。
因此,Namenode在启动后,会定期对fsimage和editlog存储的目录进行检测,当目录所在的磁盘空间小于设置的阈值时,namenode会进入安全模式,直到磁盘空间大于设置的阈值时,才离开安全模式。
涉及的配置项有:
dfs.namenode.resource.check.interval
namenode进行检测的时间间隔,默认值为5000ms
dfs.namenode.resource.du.reserved
数据存储目录所需的最小剩余空间大小,剩余空间小于该值时,进入安全模式。默认值为 104857600字节,即100MB
dfs.namenode.resource.checked.volums
额外指定需要检测的目录列表。
默认仅检测指定的目录,如果还有其他目录需要一并检测,可以通过该配置项进行设置。
【NodeManager】
Nodemanager所在的节点主要是运行各个application中的container,而container运行过程中产生的中间数据以及日志信息都会写到磁盘上。
因此,nodemanager也会定期对指定目录进行检测,如果目录所在的磁盘剩余空间小于指定的阈值,nodemanager自身进入非健康状态,并将此状态上报给resourcemanager,resourcemanager将不会再给该节点分配任务。
涉及的配置项有:
yarn.nodemanager.local-dirs
存放container执行过程中中间数据的根目录列表,多个目录以逗号分隔。
yarn.nodemanager.log-dirs
存放application本地执行日志的根目录列表,多个目录以逗号分隔。
yarn.nodemanager.disk-health-checker.enable
是否启用对磁盘的健康检测。
默认值为 true,即启用健康检测。
yarn.nodemanager.disk-health-checker.interval-ms
进行健康检测的时间间隔。
默认值为 120000ms 即2分钟。
yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage
目录对应磁盘空间已使用空间的最大值,即当目录对应磁盘空间已使用空间超过该值时,NM会标记该磁盘为坏盘。
可选值范围为 0.0-100.0 默认值为 90.0。
(假如NM所在节点只有一块磁盘,并且该磁盘的已使用的空间超过阈值,那么NM将变为非健康状态)
yarn.nodemanager.disk-health-checker.disk-utilization-watermark-low-per-disk-percentage
坏盘重新被标记为好盘的最小值,也就是磁盘已使用空间小于该值时,才重新被标记为好盘。
yarn.nodemanager.disk-health-checker.min-healthy-disks
被标记为健康状态时,好(磁)盘占总磁盘个数的最小百分比。
由于local可以配置为一个目录列表,当这些目录所在磁盘被标记为好盘的个数占总数的百分比超过该值时,NM服务才算是健康状态。
默认值为 0.25
注:local和log目录是分别进行计算的
也就是只有local和log目录对应的好盘比例都超过该值时,才为健康状态
除了上面默认的检测机制外,还可以通过编写脚本的方式,自定义健康检测机制,涉及的配置项如下所示(这里不展开讲解,读者可以自行查看官方文档)
yarn.nodemanager.health-checker.interval-ms
yarn.nodemanager.health-checker.script.timeout-ms
yarn.nodemanager.health-checker.script.path
yarn.nodemanager.health-checker.script.opts
【Datanode】
Datanode上存放block数据块,因此,也会对磁盘空间进行检测。
datanode与nodemanger的机制类似,通过将自身状态上报给namenode,namenode感知datanode的状态,并决定是否要将block块存放到该datanode上。
涉及的配置项有:
dfs.datanode.du.reserved.calculator
磁盘空间的计算方式。
默认值为
org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.ReservedSpaceCalculator\ReservedSpaceCalculatorAbsolute
其他可选的值有
org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.ReservedSpaceCalculator\ReservedSpaceCalculatorPercentage
dfs.datanode.du.reserved
磁盘预留(剩余)空间的字节数大小,默认值为0
仅当dfs.datanode.du.reserved.calculator配置为
org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.ReservedSpaceCalculator\ReservedSpaceCalculatorAbsolute
时有效
dfs.datanode.du.reserved.pct
磁盘预留(剩余)空间大小的百分比
仅当dfs.datanode.du.reserved.calculator配置为
org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.ReservedSpaceCalculator\ReservedSpaceCalculatorPercentage
时有效
【总结】
本文主要总结了hadoop中各个节点的健康检测策略,以及对应的配置项。
像namenode作为管理节点,本身一旦检测到达不到健康的条件,则主动进入安全模式拒绝提供写服务(仍旧可读),而像datanode和nodemanager作为自节点则是进行自身状态的上报,由namenode和resourcemanager来决定是否继续作为工作节点提供服务。