Hadoop 如何设置纱线应用程序的内存';s容器与应用程序主控程序不同

Hadoop 如何设置纱线应用程序的内存';s容器与应用程序主控程序不同,hadoop,yarn,Hadoop,Yarn,我有一个应用程序主机和一个基于代码的客户机。目前,Thread客户端使用与应用程序主控相同的内存配置,但我希望提供允许用户为应用程序最终运行的容器指定内存需求的功能 我一直在查看YanClient和ApplicationSubmissionContext的Java文档,但我仍然不清楚是否可以只为应用程序的容器设置内存和vCore YanClient具有以下代码: // Set up the container launch context for the application master C

我有一个应用程序主机和一个基于代码的客户机。目前,Thread客户端使用与应用程序主控相同的内存配置,但我希望提供允许用户为应用程序最终运行的容器指定内存需求的功能

我一直在查看YanClient和ApplicationSubmissionContext的Java文档,但我仍然不清楚是否可以只为应用程序的容器设置内存和vCore

YanClient具有以下代码:

// Set up the container launch context for the application master
ContainerLaunchContext amContainer = ContainerLaunchContext.newInstance(
                    localResources, env, commands, null, null, null);

// Set up resource type requirements
// For now, both memory and vcores are supported, so we set memory and
// vcores requirements
Resource capability = Resource.newInstance(amMemory, amVCores);
appContext.setResource(capability);
JavaDocs声明
setResource
设置ApplicationMaster为此应用程序所需的资源。我认为这意味着我只能在创建ApplicationSubmissionContext时为ApplicationMaster配置容器。对吗

如何为将在YanClient中运行应用程序的容器指定vCore和内存

编辑

我看到YarnClient中也设置了以下内容。这就引出了更多的问题。资源是否设置了两次?或者代码的一部分为应用程序设置容器,另一部分为应用程序主控程序设置容器

// Set java executable command
LOG.info("Setting up app master command");
vargs.add(Environment.JAVA_HOME.$$() + "/bin/java");
// Set Xmx based on am memory size
vargs.add("-Xmx" + amMemory + "m");
// Set class name
vargs.add(appMasterMainClass);
// Set params for Application Master
vargs.add("--container_memory " + String.valueOf(containerMemory));
vargs.add("--container_vcores " + String.valueOf(containerVirtualCores));
vargs.add("--num_containers " + String.valueOf(numContainers));
vargs.add("--priority " + String.valueOf(shellCmdPriority));

我运行了一些测试,结果表明,在问题中提到的两段代码中,下面将设置应用程序主控程序从命令行提取的值,以便为应用程序构建纱线容器:

// Set java executable command
LOG.info("Setting up app master command");
vargs.add(Environment.JAVA_HOME.$$() + "/bin/java");
// Set Xmx based on am memory size
vargs.add("-Xmx" + amMemory + "m");
// Set class name
vargs.add(appMasterMainClass);
// Set params for Application Master
vargs.add("--container_memory " + String.valueOf(containerMemory));
vargs.add("--container_vcores " + String.valueOf(containerVirtualCores));
vargs.add("--num_containers " + String.valueOf(numContainers));
vargs.add("--priority " + String.valueOf(shellCmdPriority));
获取这些值的应用程序母版中的代码为:

    //getOptionValue(char opt, String defaultValue)
    containerMemory = Integer.parseInt(cliParser.getOptionValue(
        "container_memory", "1024"));
    containerVirtualCores = Integer.parseInt(cliParser.getOptionValue(
        "container_vcores", "1"));
    numTotalContainers = Integer.parseInt(cliParser.getOptionValue(
        "num_containers", "1"));
    if (numTotalContainers == 0) {
      throw new IllegalArgumentException(
          "Cannot run analytic with no containers");
    }
    requestPriority = Integer.parseInt(cliParser
        .getOptionValue("priority", "0"));