yarn local dirs的管理实现

在yarn中对yarn.nodemanager.local-dirs的状态更新操作,定义在LocalDirsHandlerService(org.apache.hadoop.yarn.server.nodemanager.LocalDirsHandlerService)相关类中,在nm启动时,会启动一个LocalDirsHandlerService服务,循环检测yarn.nodemanager.local-dirs和yarn.nodemanager.log-dirs目录的可用性,本质上其实是用java.util.Timer和java.util.TimerTask实现的一个服务线程。

LocalDirsHandlerService的内部类MonitoringTimerTask扩展了TimerTask类

通过MonitoringTimerTas的构造函数对进行初始化,比如获取设置的yarn.nodemanager.log-dirs和yarn.nodemanager.local-dirs 设置有效的local路径

这个线程常用的参数:

YarnConfiguration.NM_DISK_HEALTH_CHECK_INTERVAL_MS//yarn.nodemanager.disk-health-checker.interval-ms默认是2分钟YarnConfiguration.NM_DISK_HEALTH_CHECK_ENABLE//yarn.nodemanager.disk-health-checker.enable默认是开启YarnConfiguration.NM_MIN_HEALTHY_DISKS_FRACTION//yarn.nodemanager.disk-health-checker.min-healthy-disks默认是0.25,即最少应该是1/4的设置路径是正常的

在cdh4.6.0中,MonitoringTimerTask的构造函数如下:

publicMonitoringTimerTask(Configurationconf)throwsYarnException{localDirs=newDirectoryCollection(validatePaths(conf.getTrimmedStrings(YarnConfiguration.NM_LOCAL_DIRS)));logDirs=newDirectoryCollection(validatePaths(conf.getTrimmedStrings(YarnConfiguration.NM_LOG_DIRS)));localDirsAllocator=newLocalDirAllocator(YarnConfiguration.NM_LOCAL_DIRS);logDirsAllocator=newLocalDirAllocator(YarnConfiguration.NM_LOG_DIRS);}

而在cdh5.2.0中,构造函数多了两个配置项

YarnConfiguration.NM_MAX_PER_DISK_UTILIZATION_PERCENTAGE//percentageofdiskthatcanbeusedbeforethediristakenoutofthegooddirslist//yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage默认是100(这个值需要改成小于100,比如80,否则容易出现磁盘满地问题)YarnConfiguration.NM_MIN_PER_DISK_FREE_SPACE_MB//minimumspace,inMB,thatmustbeavailableonthediskforthedirtobemarkedasgood//yarn.nodemanager.disk-health-checker.min-free-space-per-disk-mb默认是0MB

在检查localdirs的初始可用性会考虑到这两个设置(validatePaths方法)

publicMonitoringTimerTask(Configurationconf)throwsYarnRuntimeException{floatmaxUsableSpacePercentagePerDisk=conf.getFloat(YarnConfiguration.NM_MAX_PER_DISK_UTILIZATION_PERCENTAGE,YarnConfiguration.DEFAULT_NM_MAX_PER_DISK_UTILIZATION_PERCENTAGE);longminFreeSpacePerDiskMB=conf.getLong(YarnConfiguration.NM_MIN_PER_DISK_FREE_SPACE_MB,YarnConfiguration.DEFAULT_NM_MIN_PER_DISK_FREE_SPACE_MB);localDirs=newDirectoryCollection(validatePaths(conf.getTrimmedStrings(YarnConfiguration.NM_LOCAL_DIRS)),maxUsableSpacePercentagePerDisk,minFreeSpacePerDiskMB);logDirs=newDirectoryCollection(validatePaths(conf.getTrimmedStrings(YarnConfiguration.NM_LOG_DIRS)),maxUsableSpacePercentagePerDisk,minFreeSpacePerDiskMB);localDirsAllocator=newLocalDirAllocator(YarnConfiguration.NM_LOCAL_DIRS);logDirsAllocator=newLocalDirAllocator(YarnConfiguration.NM_LOG_DIRS);}

local dirs的判断线程会每隔一段时间对目录的可用性进行测试,调用的方法是

checkDirs—->updateDirsAfterFailure—>areDisksHealthy

可用判断主要是判断错误的目录占配置目录的比例,当yarn.nodemanager.local-dirs或者yarn.nodemanager.log-dirs异常目录占了一定百分比后,磁盘检测就会失败,,nm就会抛出异常:

便是不再存在着任何我曾经对你有过的希望。

yarn local dirs的管理实现

相关文章:

你感兴趣的文章:

标签云: