如何设置纱线应用程序容器的内存与应用程序主机

时间:2017-03-02 15:18:09

标签: hadoop yarn

我有一个基于代码from the Hadoop documentation的应用程序主服务器和一个yarn客户端。目前,yarn客户端使用与应用程序主机相同的内存配置,但我想提供允许用户指定应用程序最终运行的容器的内存要求的功能。

我一直在查看YarnClient和ApplicationSubmissionContext的Java Docs,但我仍然感到困惑的是,是否可以为应用程序的容器设置内存和vcores。

YarnClient的代码为:

// 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配置容器。那是对的吗?

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

修改

我看到YarnClient中也设置了以下内容。这导致了更多问题。资源是否设置了两次?或者代码的一部分是为应用程序设置容器而另一部分是Application Master的容器吗?

// 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));

1 个答案:

答案 0 :(得分:0)

我运行了一些测试,结果发现在问题中提到的两部分代码中,以下内容将设置Application Master从命令行中提取的值,以便为应用程序构建YARN容器:

// 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));

Application Master中获取这些值的代码是:

    //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"));