1. 申请Container
1) 连接ResourceManager
Configuration conf = new Configuration();
YarnRPC rpc = YarnRPC.create(conf);
YarnConfiguration yarnConf = new YarnConfiguration(conf);
// 获取ResourceManager的地址
InetSocketAddress rmAddress = NetUtils.createSocketAddr(yarnConf.get(
YarnConfiguration.RM_SCHEDULER_ADDRESS,
YarnConfiguration.DEFAULT_RM_SCHEDULER_ADDRESS));
AMRMProtocol resourceManager = ((AMRMProtocol) rpc.getProxy(AMRMProtocol.class, rmAddress, conf));
2) 向ResourceManager注册为ApplicationMaster
RegisterApplicationMasterRequest appMasterRequest = Records.newRecord(RegisterApplicationMasterRequest.class);
// 设定该Application的相关信息
appMasterRequest.setApplicationAttemptId(appAttemptID);
appMasterRequest.setHost(appMasterHostname);
appMasterRequest.setRpcPort(appMasterRpcPort);
appMasterRequest.setTrackingUrl(appMasterTrackingUrl);
RegisterApplicationMasterResponse response = resourceManager.registerApplicationMaster(appMasterRequest);
3) 向ResourceManager申请Container
// 初始化申请Container的request (包含运行Container的host、优先级、占用内存)
ResourceRequest request = Records.newRecord(ResourceRequest.class);
request.setHostName("*");
request.setNumContainers(numContainers);
Priority pri = Records.newRecord(Priority.class);
pri.setPriority(requestPriority);
request.setPriority(pri);
Resource capability = Records.newRecord(Resource.class);
capability.setMemory(containerMemory);
request.setCapability(capability);
List<ResourceRequest> resourceReq = new ArrayList<ResourceRequest>();
resourceReq.add(request);
// 向ResourceManager发送报告 (包含第几次申请、需要申请Container的request、保存需要释放Container的List、已分配Container与总共Container的比例)
AllocateRequest req = Records.newRecord(AllocateRequest.class);
CopyOnWriteArrayList<ContainerId> releasedContainers = new CopyOnWriteArrayList<ContainerId
AtomicInteger rmRequestID = new AtomicInteger();
req.setResponseId(rmRequestID.incrementAndGet());
req.setApplicationAttemptId(appAttemptID);
req.addAllAsks(resourceReq);
req.addAllReleases(releasedContainers);
req.setProgress((float)numCompletedContainers.get()/numTotalContainers);
AllocateResponse resp = resourceManager.allocate(req);
AMResponse amResp = resp.getAMResponse();
2. 为申请到的Container分配任务
1) 获取上面申请到的Container
List<Container> allocatedContainers = amResp.getAllocatedContainers();
for (Container allocatedContainer : allocatedContainers) {
}
2) 初始化运行Container的上下文 (
ContainerId
User:运行该Container的用户,即运行当前Application的用户
Resource:ResourceManager分配给该Container的资源
ContainerToken:Security模式下的SecurityTokens
LocalResources:该Container所运行的程序所需的资源,比如程序所在的jar包
ServiceData:
Environment:该Container所运行的程序所需的环境变量,KeyValue格式
Commands:该Container所运行程序的命令,比如运行的为java程序,即$JAVA_HOME/bin/java org.yourclass
ApplicationACLs:该Container所属的Application的访问控制列表
)
ContainerLaunchContext ctx = Records.newRecord(ContainerLaunchContext.class);
ctx.setContainerId(container.getId());
ctx.setResource(container.getResource());
ctx.setUser(UserGroupInformation.getCurrentUser().getShortUserName());
Map<String, String> childEnv = new HashMap<String, String>();
ctx.setEnvironment(childEnv);
// 设定LocalResource
// 将jar包上传到HDFS上
FileSystem fs = FileSystem.get(conf);
Path src = new Path(存放Container程序的本地路径);
String pathSuffix = appName + "/" + appId.getId() + "/ChildProgram.jar";
Path dst = new Path(fs.getHomeDirectory(), pathSuffix);
fs.copyFromLocalFile(false, true, src, dst);
FileStatus destStatus = fs.getFileStatus(dst);
Map<String, LocalResource> localResources = new HashMap<String, LocalResource>();
LocalResource childRsrc = Records.newRecord(LocalResource.class);
childRsrc.setType(LocalResourceType.FILE);
childRsrc.setVisibility(LocalResourceVisibility.APPLICATION);
childRsrc.setTimestamp(destStatus.getModificationTime());
childRsrc.setSize(destStatus.getLen());
childRsrc.setResource(ConverterUtils.getYarnUrlFromURI(new URI(dst)));
localResources.put("Child.jar", amJarRsrc);
ctx.setLocalResources(localResources);
// 设定Command
Vector<CharSequence> vargs = new Vector<CharSequence>(5);
vargs.add(JavaCommand);
vargs.add(JavaArgs);
vargs.add("1>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + "/stdout");
vargs.add("2>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + "/stderr");
StringBuilder command = new StringBuilder();
for (CharSequence str : vargs) {
command.append(str).append(" ");
}
List<String> commands = new ArrayList<String>();
commands.add(command.toString());
ctx.setCommands(commands);
StartContainerRequest startReq = Records.newRecord(StartContainerRequest.class);
startReq.setContainerLaunchContext(ctx);
3) 连接该Container属于的ContainerManager
String cmIpPortStr = container.getNodeId().getHost() + ":"
+ container.getNodeId().getPort();
InetSocketAddress cmAddress = NetUtils.createSocketAddr(cmIpPortStr);
ContainerManager cm = ((ContainerManager) rpc.getProxy(ContainerManager.class, cmAddress, conf));
4) 通过ContainerManager启动Container
cm.startContainer(startReq);
3. 轮询获取Container的状态
1) 向ContainerManager获取Container的状态
GetContainerStatusRequest statusReq = Records.newRecord(GetContainerStatusRequest.class);
statusReq.setContainerId(container.getId());
GetContainerStatusResponse statusResp = cm.getContainerStatus(statusReq);
ContainerStatus containerStatus = statusResp.getStatus();
4. 更新Application状态
1) 在所有Container运行成功/失败后通知ResourceManager该Application运行成功/失败
FinishApplicationMasterRequest finishReq = Records.newRecord(FinishApplicationMasterRequest.class);
finishReq.setAppAttemptId(appAttemptID);
finishReq.setFinishApplicationStatus(FinalApplicationStatus.SUCCEEDED);
// finishReq.setFinishApplicationStatus(FinalApplicationStatus.FAILED);
finishReq.setDiagnostics(diagnostics);
resourceManager.finishApplicationMaster(finishReq);
分享到:
相关推荐
从立方体、圆柱体抽象出一个公共基类Container,定义抽象类Container,模拟实现一个容器类层次结构,在主函数进行多态机制测试。各派生类要求实现基类的所有纯虚函数。 抽象类class Container { protected: static ...
#解压nvidia-container-runtime.tar.gz ...#安装完后需要重启容器,未设置为系统启动服务,也可以通过kill docker进程再启动方式重启 systemctl restart docker #查看安装结果 whereis nvidia-container-runtime
赠送jar包:jersey-container-servlet-core-2.22.2.jar; 赠送原API文档:jersey-container-servlet-core-2.22.2-javadoc.jar; 赠送源代码:jersey-container-servlet-core-2.22.2-sources.jar; 赠送Maven依赖信息...
vb.net巧用三个SplitContainer做框架式页面(含顶部左侧显示隐藏按钮)实例 "1、需将SplitContainer1、SplitContainer2、SplitContainer3 的 FixedPanel 值必须设置为:Panel1 ;" & vbCrLf & "2、本程序为全屏,...
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从...
构建一个简单容器 4.3. 为 OPENSHIFT CONTAINER PLATFORM 创建 KUBERNETES 清单 4.4. 面向 OPERATOR 进行开发 第 5 章 RED HAT ENTERPRISE LINUX COREOS (RHCOS) 5.1. 关于 RHCOS 5.2. 查看 IGNITION 配置文件 5.3....
关于 OPENSHIFT CONTAINER PLATFORM 更新服务 1.2. OPENSHIFT CONTAINER PLATFORM 升级频道和发行版本 1.3. 使用WEB控制台更新集群 第 2 章 通过 WEB 控控制制台台将将集集群群更更新新为一一个个新新的的次次版...
Container 数组 容器简介 不同数据类型的容器 迭代器 容器分类 Collection的功能 List的功能 Set功能 Map功能 选择容器
精彩编程与编程技巧-切割一个Container中的图片 ...
C# vs2010 实现SplitContainer(上下左右)隐藏与显示 通过设置不同的Panel 项目源代码
react-container, 一个灵活的容器,用于放置响应应用程序 TouchstoneJS的一部分 容器一个灵活的容器,用于放置响应应用程序。 为 TouchstoneJS 构建。演示&示例现场演示: jedwatson 。github 。/反应容器。要在本地...
SplitContainer带箭头收缩美化,希望使用时尽量保留原作者注释,尊重原著。
container 响应式container 响应式container 响应式container 响应式
Container Disclaimer This program comes with no warranty. You must use this program at your own risk. Introduction This is an Android application, And there is no plan to migrate to other platforms ...
容器映像启动器(又名“ CIP”)将Docker映像从一个注册表(src注册表)提升到另一个(目标注册表)。 在YAML中,要提升的图像集由启动子清单定义。 目前仅支持Google Container Registry(GCR)。 与Prow的连接 ...
C# WPF实现SplitContainer上下左右隐藏与显示
tab-container示例
本文介绍了Docker如何进入启动容器,分享给大家,具体如下: 在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。 这个时候如果需要进入容器进行操作,有多种方法,包括使用官方的...
C#重写SplitContainer收缩自定义控件
shm_container, 高性能服务器的共享内存容器集合 shm容器文档简介共享内存最好是一种有效的IPC方法,而且它是一个强大的服务器架构设计 Pattern,具有进程重新启动而没有丢失内存数据通过分离的流程实现模块化在一个...