如何为与应用程序主机不同的纱线应用程序容器设置内存
How to set the memory for a yarn application's container different from application master
我有一个应用程序主机和一个基于代码 from the Hadoop documentation 的 yarn 客户端。目前 yarn 客户端使用与 application master 相同的内存配置,但我想提供允许用户指定 just 容器的内存需求的功能,应用程序最终是 运行上。
我一直在查看有关 YarnClient 和 ApplicationSubmissionContext 的 Java 文档,但我仍然对是否可以仅为应用程序的容器设置内存和 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);
Java文档声明 setResource
设置 ApplicationMaster 为此应用程序所需的资源。我认为这意味着我只能在创建 ApplicationSubmissionContext 时为 ApplicationMaster 配置容器。那是对的吗?
如何为将 运行 在 YarnClient 中应用的容器指定 vcores 和内存?
编辑:
我看到在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));
我运行 进行了一些测试,结果发现在问题中提到的两段代码中,以下将设置 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"));
我有一个应用程序主机和一个基于代码 from the Hadoop documentation 的 yarn 客户端。目前 yarn 客户端使用与 application master 相同的内存配置,但我想提供允许用户指定 just 容器的内存需求的功能,应用程序最终是 运行上。
我一直在查看有关 YarnClient 和 ApplicationSubmissionContext 的 Java 文档,但我仍然对是否可以仅为应用程序的容器设置内存和 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);
Java文档声明 setResource
设置 ApplicationMaster 为此应用程序所需的资源。我认为这意味着我只能在创建 ApplicationSubmissionContext 时为 ApplicationMaster 配置容器。那是对的吗?
如何为将 运行 在 YarnClient 中应用的容器指定 vcores 和内存?
编辑:
我看到在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));
我运行 进行了一些测试,结果发现在问题中提到的两段代码中,以下将设置 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"));