2017-03-06 1 views

答えて

2

「バーチャルコア」は、実際のコアの抽象化に過ぎません。この抽象化または「うそ」は、YARN(および他の人)が可用性に基づいてスレッドを動的に回転させる(並列プロセス)ことを可能にします。たとえば、あなたの財布だけに制限された処理制限を持つ「弾力のある」クラスター上でmap reduceを実行してみてください...クラウドベイビー...。雲。

あなたはここでhere

+0

ありがとう@ archae0pteryx。 – Tom

0

詳細を読むことができ、ドキュメントの状態(強調鉱山)

は、ノードの容量が物理コアのその 数に等しい仮想コアで構成されなければならないものです。コンテナは、飽和することができるコアの数が であること、すなわち、 が同時に実行できるスレッドの平均数を要求する必要があります。

CPUコアは、ハイパーの場合にスレッドOSが実際には1つの物理コアの2つのコアを見て、二つのスレッドを実行することができます(一度に一つのスレッドを実行することができ、ハイパースレッドされていない限り - もちろんそれは少しです実際の物理的なコアを持つほど効率的ではない)基本的にエンドユーザーにとって、コアが単一のスレッドを実行できるということは、理論的にはJavaスレッドを使用して並列化したい場合、合理的に良い近似はコア数に等しいスレッド数です。したがって、コンテナプロセス(JVM) に2つのスレッドが必要な場合は、それを2つのvcoreにマップする方がいいです。つまり、最後の行が意味するものです。そして、ノードの総容量として、vcoreは物理的なコアの数と等しくなければならない。

覚えておくべき最も重要なことは、それが実際にそれを除いて、それに制御を持っていん自体で他のアプリケーションと YARNに起こるように異なるコアで実行されるスレッドをスケジュールしますOSだということはまだです各コンテナに割り当てられるスレッド数の最適な近似は何か。そのため、すべてのコアがYARNアプリケーションで常に利用できなくなるため、OS上で動作する他のアプリケーション、カーネルで使用されるCPUサイクルなどを考慮する必要があります。

EDIT:さらに研究

糸は、CPU上でハードリミットに影響を与えることはないが、コードを通って行く私はそれがCPUスケジューリングやCPUの速度に影響を与えるためにしようとどのように見ることができます。技術糸は、Java、Python、カスタムシェルコマンドなど、さまざまなコンテナプロセスを起動できます.Yarnのコンテナを起動する役割は、ノードマネージャのContainerExecutorコンポーネントに属しており、コンテナの起動などのコードと、いくつかのヒントプラットフォーム上)。たとえば、DefaultContainerExecutor(ContainerExecutorを拡張)の場合 - ウィンドウではCPUの制限に "-c"パラメータを使用し、Linuxではプロセスのnicenessを使用してそれに影響を与えます。 LinuxContainerExecutor(またはより良いまだCgroupsLCEResourcesHandlerはcgroupの使用を強制しません)では、Linux cgroupsを使用してそのノードのYarn CPUリソースを制限しようとします。詳細はhereです。

ContainerExecutor { 
....... 
....... 

protected String[] getRunCommand(String command, String groupId, 
     String userName, Path pidFile, Configuration conf, Resource resource) { 
    boolean containerSchedPriorityIsSet = false; 
    int containerSchedPriorityAdjustment = 
     YarnConfiguration.DEFAULT_NM_CONTAINER_EXECUTOR_SCHED_PRIORITY; 

    if (conf.get(YarnConfiguration.NM_CONTAINER_EXECUTOR_SCHED_PRIORITY) != 
     null) { 
     containerSchedPriorityIsSet = true; 
     containerSchedPriorityAdjustment = conf 
      .getInt(YarnConfiguration.NM_CONTAINER_EXECUTOR_SCHED_PRIORITY, 
      YarnConfiguration.DEFAULT_NM_CONTAINER_EXECUTOR_SCHED_PRIORITY); 
    } 

    if (Shell.WINDOWS) { 
     int cpuRate = -1; 
     int memory = -1; 
     if (resource != null) { 
     if (conf 
      .getBoolean(
       YarnConfiguration.NM_WINDOWS_CONTAINER_MEMORY_LIMIT_ENABLED, 
       YarnConfiguration.DEFAULT_NM_WINDOWS_CONTAINER_MEMORY_LIMIT_ENABLED)) { 
      memory = resource.getMemory(); 
     } 

     if (conf.getBoolean(
      YarnConfiguration.NM_WINDOWS_CONTAINER_CPU_LIMIT_ENABLED, 
      YarnConfiguration.DEFAULT_NM_WINDOWS_CONTAINER_CPU_LIMIT_ENABLED)) { 
      int containerVCores = resource.getVirtualCores(); 
      int nodeVCores = conf.getInt(YarnConfiguration.NM_VCORES, 
       YarnConfiguration.DEFAULT_NM_VCORES); 
      // cap overall usage to the number of cores allocated to YARN 
      int nodeCpuPercentage = Math 
       .min(
        conf.getInt(
         YarnConfiguration.NM_RESOURCE_PERCENTAGE_PHYSICAL_CPU_LIMIT, 
         YarnConfiguration.DEFAULT_NM_RESOURCE_PERCENTAGE_PHYSICAL_CPU_LIMIT), 
        100); 
      nodeCpuPercentage = Math.max(0, nodeCpuPercentage); 
      if (nodeCpuPercentage == 0) { 
      String message = "Illegal value for " 
       + YarnConfiguration.NM_RESOURCE_PERCENTAGE_PHYSICAL_CPU_LIMIT 
       + ". Value cannot be less than or equal to 0."; 
      throw new IllegalArgumentException(message); 
      } 
      float yarnVCores = (nodeCpuPercentage * nodeVCores)/100.0f; 
      // CPU should be set to a percentage * 100, e.g. 20% cpu rate limit 
      // should be set as 20 * 100. The following setting is equal to: 
      // 100 * (100 * (vcores/Total # of cores allocated to YARN)) 
      cpuRate = Math.min(10000, 
       (int) ((containerVCores * 10000)/yarnVCores)); 
     } 
     } 
     return new String[] { Shell.WINUTILS, "task", "create", "-m", 
      String.valueOf(memory), "-c", String.valueOf(cpuRate), groupId, 
      "cmd /c " + command }; 
    } else { 
     List<String> retCommand = new ArrayList<String>(); 
     if (containerSchedPriorityIsSet) { 
     retCommand.addAll(Arrays.asList("nice", "-n", 
      Integer.toString(containerSchedPriorityAdjustment))); 
     } 
     retCommand.addAll(Arrays.asList("bash", command)); 
     return retCommand.toArray(new String[retCommand.size()]); 
    } 

    } 
     } 

(winutilsを使用します。exe)、CPU速度を使用します Linuxでは、CPU優先度を制御するパラメータとしてnicenessを使用します。

関連する問題