首页 文章

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

提问于
浏览
0

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

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

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和内存?

EDIT

我看到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

    我运行了一些测试,结果发现在问题中提到的两部分代码中,以下内容将设置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"));
    

相关问题