YARNでのcgroupの使用

cgroupは、タスクの集合とその将来の子タスクをすべて、階層的なグループに集約/分割し、特殊な動作を与えるためのメカニズムです。cgroupはLinuxカーネルの機能であり、カーネルバージョン2.6.24にマージされました。YARNの観点からは、これにより、コンテナのリソース使用量を制限できます。CPU使用量がその良い例です。cgroupがないと、コンテナのCPU使用量を制限することが難しくなります。

cgroupの設定

このセクションでは、cgroupを使用するための設定変数を説明します。

以下の設定は、cgroupの設定に関連しています。これらはyarn-site.xmlに設定する必要があります。

設定名 説明
yarn.nodemanager.container-executor.class これは「org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor」に設定する必要があります。cgroupはLinuxカーネルの機能であり、LinuxContainerExecutorを介して公開されます。
yarn.nodemanager.linux-container-executor.resources-handler.class これは「org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler」に設定する必要があります。LinuxContainerExecutorを使用しても、cgroupの使用が強制されるわけではありません。cgroupを使用する場合は、resource-handler-classをCGroupsLCEResourceHandlerに設定する必要があります。DefaultLCEResourcesHandlerは機能しません。
yarn.nodemanager.linux-container-executor.cgroups.hierarchy YARNプロセスを配置するcgroup階層(カンマを含めることはできません)。yarn.nodemanager.linux-container-executor.cgroups.mountがfalseの場合(つまり、cgroupが事前に設定されている場合)であり、YARNユーザーが親ディレクトリへの書き込みアクセス権を持っている場合、ディレクトリが作成されます。ディレクトリが既に存在する場合は、管理者がYARNに再帰的に書き込み権限を与える必要があります。
yarn.nodemanager.linux-container-executor.cgroups.mount LCEが見つからない場合にcgroupをマウントしようとするかどうか - trueまたはfalseにすることができます。
yarn.nodemanager.linux-container-executor.cgroups.mount-path オプション。cgroupの場所。yarn.nodemanager.linux-container-executor.cgroups.mountがtrueの場合、LCEはここにcgroupをマウントしようとします。yarn.nodemanager.linux-container-executor.cgroups.mountがfalseの場合、LCEはこの場所からcgroupを使用しようとします。指定した場合、このパスとそのサブディレクトリ(cgroup階層)は存在する必要があり、NodeManagerが起動される前に、YARNによって読み取りおよび書き込み可能である必要があります。詳細は以下のcgroupのマウントオプションを参照してください。
yarn.nodemanager.linux-container-executor.group NodeManagerのUnixグループ。これは「container-executor.cfg」の設定と一致する必要があります。この設定は、container-executorバイナリの安全なアクセスを検証するために必要です。

cgroupを有効にすると、YARNコンテナのリソース使用量を制限する以下の設定が機能します。

設定名 説明
yarn.nodemanager.resource.percentage-physical-cpu-limit この設定では、すべてのYARNコンテナのCPU使用量を制限できます。これは、コンテナの累積CPU使用量の上限をハードに設定します。たとえば、60に設定した場合、すべてのYARNコンテナの合計CPU使用量は60%を超えません。
yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage cgroupでは、CPU使用量の上限をハードまたはソフトに設定できます。この設定がtrueの場合、コンテナは、使用可能なCPUがあっても、割り当てられたCPUを超えて使用することはできません。これにより、コンテナは割り当てられたCPUのみを使用できるようになります。falseに設定されている場合、コンテナは使用可能なCPUがあれば使用できます。trueまたはfalseのいずれに設定されているかに関係なく、コンテナの合計CPU使用量は、いつでも「yarn.nodemanager.resource.percentage-physical-cpu-limit」で指定された値を超えることはできないことに注意してください。

cgroupのマウントオプション

YARNは、カーネルによってファイルシステムにマウントされたディレクトリ構造を介してcgroupを使用します。cgroupに接続するには、3つのオプションがあります。

オプション 説明
既にマウントされているcgroupの検出 これは、RHEL7やUbuntu16などの新しいシステム、または管理者がYARNの起動前にcgroupをマウントした場合に使用します。yarn.nodemanager.linux-container-executor.cgroups.mountをfalseに設定し、他の設定はデフォルトのままにします。YARNは/proc/mountsでマウントポイントを見つけます。一般的な場所は/sys/fs/cgroup/cgroupです。デフォルトの場所は、使用しているLinuxディストリビューションによって異なります。
YARNによってマウントされたcgroup 重要: このオプションは、container-executor.cfgオプションのfeature.mount-cgroup.enabled=0がデフォルトで有効になっているため、セキュリティ上の理由から非推奨になりました。YARNを起動する前にcgroupをマウントしてください。
既にマウントされているか、リンクされているが/proc/mountsにはないcgroup cgroupがlxcfsを介してアクセスできる場合、または別のファイルシステムによってシミュレートされている場合は、yarn.nodemanager.linux-container-executor.cgroups.mount-pathをcgroupのルートディレクトリに設定します。yarn.nodemanager.linux-container-executor.cgroups.mountをfalseに設定します。YARNは、cgroupのマウントポイントの検出の前に、まずこのパスを使用しようとします。このパスには、サポートされているcgroupサブシステム(例:<path>/cpu,cpuacct)によって名前付けられた、各cgroup階層のサブディレクトリが必要です。有効なサブシステム名はcpu, cpuacct, cpuset, memory, net_cls, blkio, freezer, devicesです。

cgroupとセキュリティ

cgroup自体には、セキュリティに関する要件はありません。ただし、LinuxContainerExecutorにはいくつかの要件があります。セキュアモードではない状態で実行する場合、デフォルトでは、LCEはすべてのジョブをユーザー「nobody」として実行します。「yarn.nodemanager.linux-container-executor.nonsecure-mode.local-user」を目的のユーザーに設定することで、このユーザーを変更できます。ただし、ジョブを送信したユーザーとしてジョブを実行するように設定することもできます。その場合、「yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users」をfalseに設定する必要があります。

yarn.nodemanager.linux-container-executor.nonsecure-mode.local-user yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users ジョブを実行するユーザー
(デフォルト) (デフォルト) nobody
yarn (デフォルト) yarn
yarn false (ジョブを送信したユーザー)