DistributtedShell的container在所有节点上如何仅执行一次

问题

在上Hadoop2培训课的时候,老师出了这么一道题

修改Distributedshell的源代码,使得用户提供的命令(由“--shell_command”参数指定)可以在所有节点上仅执行一次。(目前的实现是,如果该命令由N个task同时执行,则这N个task可能位于任意节点上,比如都在node1上。)

修改代码

该问题需要在两个地方对源码进行修改:

用参数指定配置是否生效

让每一个container运行在不同的节点上

博客将主要介绍过程2的实现过程,主要思路是首先获取节点列表,再在申请container时,指定节点。具体过程如下:

打开源码。编译好Hadoop-2.3.0之后,用Eclipse打开工程,DistributedShell的源码的位置在/hadoop-2.3.0-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/main/java

获取计算节点列表。定义nodeList用于保存计算节点列表,在ApplicationMaster的init()函数中添加初始化nodeList的代码。初始化完成后,nodeList中保存有计算节点的列表(不包括RM 节点)。

public class ApplicationMaster {
    // 所有计算节点
    private static List nodeList = new ArrayList();
    public boolean init(String[] args) throws ParseException, IOException {
        //该函数的末尾添加如下代码,用于获取计算节点列表
        try {
        YarnClient yarnClient = YarnClient.createYarnClient();
            yarnClient.init(conf);
            yarnClient.start();
            List<NodeReport> clusterNodeReports;
        clusterNodeReports = yarnClient.getNodeReports(
                NodeState.RUNNING);
             for (NodeReport node : clusterNodeReports) {
             this.nodeList.add(node.getNodeId().getHost());
                }
    } catch (YarnException e) {
        // TODO Auto-generated catch block
            e.printStackTrace();
    }
    return true;
    }
}

本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/tools/

让container运行在不同的节点上。申请资源的时候,会调用函数setupContainerAskForRM,修改该函数即可,函数如下:

private ContainerRequest setupContainerAskForRM() {
    // setup requirements for hosts
    // using * as any host will do for the distributed shell app
    // set the priority for the request
    Priority pri = Records.newRecord(Priority.class);
    // TODO - what is the range for priority? how to decide?
    pri.setPriority(requestPriority);
    // Set up resource type requirements
    // For now, memory and CPU are supported so we set memory and cpu
    // requirements
    Resource capability = Records.newRecord(Resource.class);
    capability.setMemory(containerMemory);
    capability.setVirtualCores(containerVirtualCores);
    String []nodes=null;
    if(!nodeList.isEmpty()){
            nodes=new String[1];
        nodes[0]=(String) nodeList.get(0);
        nodeList.remove(0);
    }
    ContainerRequest request = new ContainerRequest(capability, nodes, null,
            pri);//默认的nodes为null
    LOG.info("Requested container ask: " + request.toString());
    return request;
}

改好之后,打成jar包,覆盖${HADOOP_HOME}/share/hadoop/yarn/hadoop-yarn-applications-distributedshell-2.3.0.jar即可生效;

验证,书写如下脚本并运行。发现3个container运行在不同的节点上,表示改写成功

bin/hadoop jar \share/hadoop/yarn/hadoop-yarn-applications-distributedshell-2.3.0.jar \org.apache.hadoop.yarn.applications.distributedshell.Client \--jar share/hadoop/yarn/hadoop-yarn-applications-distributedshell-2.3.0.jar \--shell_command "ls" \--num_containers 3 \--container_memory 512 \--container_vcores 1 \--master_memory 350 \--priority 10

总结

在获取计算节点列表时,被卡住了,最后在和别人交流的时候,知道ApplicationMaster通过yarnClient可以从RM中获取计算节点列表。最后将问题解决了。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索hadoop
, 函数
, container
, 节点
, hadoop2 0
, hadoop2 x
, ava application
, hadoop eclipse jar
, win7 eclipse hadoop
, hadoop eclipse
, hadoop2 2 0 eclipse
, eclipse hadoop
, hadoop hadoop培训
NodeList
distribut、distributi0n、distribut0r、ultraman ribut、ribut,以便于您获取更多的相关知识。

时间: 2024-10-31 04:12:39

DistributtedShell的container在所有节点上如何仅执行一次的相关文章

【RAC】在所有节点上滚动安装BUNDLE Patch for Base Bug 9413827补丁包

在升级rac  11.2.0.1到11.2.0.2 的时候会遇到一个bug 11201 TO 11202 ASM ROLLING UPGRADE – OLD CRS STACK FAILS TO STOP 本文以实例介绍如何安装次bug的补丁! 1 确定opatch 的版本 下载最新的optach版本和补丁程序 p6880880 可以参照 此文 Patch 9413827: 11201 TO 11202 ASM ROLLING UPGRADE – OLD CRS STACK FAILS TO S

Oracle 10203 RAC环境添加新节点(四)添加一个新节点上的数据库实例

简单描述一下,在Oracle 10203 for Solaris sparc的RAC双节点环境中,新增一个节点的过程.共享存储已经在第三个节点上配置完成,这里主要介绍操作系统上和Oracle上的配置. 这一篇添加一个新节点上的数据库实例. 首先确保数据库处于启动状态,如果数据库没有启动: bash-2.03$ srvctl start inst -d testrac -i testrac1 bash-2.03$ srvctl start inst -d testrac -i testrac2 确

openstack-为什么我的控制节点上有vxlan接口,但计算节点没有?

问题描述 为什么我的控制节点上有vxlan接口,但计算节点没有? _就是我用vmware做了两台虚拟机,一台综合(有控制节点的功能,也可以部署虚拟机),另外一台只安装控制节点.综合节点的配置文件:RABBIT_HOST=192.168.125.134 GLANCE_HOSTPORT=192.168.125.134:9292ADMIN_PASSWORD=123456DATABASE_PASSWORD=123456RABBIT_PASSWORD=123456SERVICE_PASSWORD=1234

JAVA新增树节点后树是展开的并且焦点在该节点上

问题描述 JAVA新增树节点后树是展开的并且焦点在该节点上 如题 这个问题该如何实现,刷新树之后,树还是展开的,请大神讲解一二 解决方案 你是用的ztree吗?

添加根节点 循环数据-TreeView控件,把数据库的内容,循环绑定到一个写死的根节点上

问题描述 TreeView控件,把数据库的内容,循环绑定到一个写死的根节点上 我用的递归方法绑定数据,代码是这样的:private void BindDate(int Pid TreeNode PNode) { DataSet ds = cBll.GetList(""""); DataTable dt = ds.Tables[0]; if (dt.Rows.Count > 0) { DataView dv = new DataView(dt);//过滤Pare

使用DOTNETBAR控件, 想实现DATAGRIDVIEWX数据往advTree的节点上的拖动操作

问题描述 如题,在使用DOTNETBAR控件时,想实现DATAGRIDVIEWX数据往advTree的节点上的拖动操作,拖动到advTree控件上后,如何选定节点? 解决方案 解决方案二:没人来吗~自己顶下,有实例最好~

treeview-怎么在TreeView的节点上显示图片?

问题描述 怎么在TreeView的节点上显示图片? 项目中要求TreeView的节点名称旁边带有图片,怎么实现?有Load属性,可是Load图片的话直接改变了节点标题,而且之前设置的子节点也没了.运行之后也没有显示出对应的图片.

请问各位是否做过有TreeView的节点上显示一行DataRow数据的效果??

问题描述 请问各位是否做过有TreeView的节点上显示一行DataRow数据的效果?? 解决方案 解决方案二:没明白lz意思

aws新加坡节点上服务器与中国电信不通,求指导

问题描述 年前服务器之间都是互通的,但是年后来上班发现aws上服务器的新加坡节点上的服务器到越南和中国电信不通,求指导.请帮忙解答下,谢谢 解决方案