hadoop-logo
ようこそ Tech blogへ!
「これからHadoopを勉強しよう」という方はまず下記のページから

サイトの移行に伴って画像が表示されないなどの不具合が生じています

YARNで使うリソース情報はどこから取ってくるのか

YARNでは、pmem(物理メモリ)やvmem(仮想メモリ)、CPUコア数などのリソース設定を行うことができます。特に、リソースを超えた場合はタスクをkillすることもできます。
yarn.nodemanager.pmem-check-enabled
yarn.nodemanager.vmem-check-enabled
では、これらのチェックに使う情報はOSからどのように取ってくるのでしょうか?
ソースを読んでみたところ、hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/ 以下のコードで取得しています。 (hadoop 2.4.0)
Linuxは LinuxResourceCalculatorPlugin.java
Windowsは WindowsResourceCalculatorPlugin.java
(これ以外のOSに対応したリソースを取得するコードがないようなので、他のOSでは値を取得できないってことですよね?)
Linuxでは/proc以下の情報、Windowsではsysteminfoコマンドの結果を利用しているようです。しかし、OSの/proc以下から取得できる情報のフォーマットや、systeminfoコマンドの出力フォーマットが変わると厄介ですね。決めうちでとってきているので。
ソースの抜粋
LinuxResourceCalculatorPlugin.java
[code]
private static final String PROCFS_MEMFILE = "/proc/meminfo";
private static final Pattern PROCFS_MEMFILE_FORMAT =
Pattern.compile("^([a-zA-Z]*):[ \t]*([0-9]*)[ \t]kB");
// We need the values for the following keys in meminfo
private static final String MEMTOTAL_STRING = "MemTotal";
private static final String SWAPTOTAL_STRING = "SwapTotal";
private static final String MEMFREE_STRING = "MemFree";
private static final String SWAPFREE_STRING = "SwapFree";
private static final String INACTIVE_STRING = "Inactive";
/**
* Patterns for parsing /proc/cpuinfo
*/
private static final String PROCFS_CPUINFO = "/proc/cpuinfo";
private static final Pattern PROCESSOR_FORMAT =
Pattern.compile("^processor[ \t]:[ \t]*([0-9]*)");
private static final Pattern FREQUENCY_FORMAT =
Pattern.compile("^cpu MHz[ \t]*:[ \t]*([0-9.]*)");
/**
* Pattern for parsing /proc/stat
*/
private static final String PROCFS_STAT = "/proc/stat";
private static final Pattern CPU_TIME_FORMAT =
Pattern.compile("^cpu[ \t]*([0-9]*)" +
"[ \t]*([0-9]*)[ \t]*([0-9]*)[ \t].*");
private String procfsMemFile;
private String procfsCpuFile;
private String procfsStatFile;
long jiffyLengthInMillis;
[/code]
WindowsResourceCalculatorPlugin.java
[code]
String getSystemInfoInfoFromShell() {
ShellCommandExecutor shellExecutor = new ShellCommandExecutor(
new String[] { Shell.WINUTILS, "systeminfo" });
try {
shellExecutor.execute();
return shellExecutor.getOutput();
} catch (IOException e) {
LOG.error(StringUtils.stringifyException(e));
}
return null;
}
[/code]

コメント

  1. kernel023 kawasaki より:

    補足と訂正。Linuxの場合、/proc//stat から vmemとrssの値を取得しているようです。
    http://grepcode.com/file/repo1.maven.org/maven2/org.apache.hadoop/hadoop-yarn-common/2.4.1/org/apache/hadoop/yarn/util/ProcfsBasedProcessTree.java#488