Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >DistributtedShell的container在所有节点上仅执行一次

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

作者头像
jiewuyou
发布于 2022-09-29 07:40:16
发布于 2022-09-29 07:40:16
53300
代码可运行
举报
文章被收录于专栏:数据人生数据人生
运行总次数:0
代码可运行

问题

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

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

修改代码

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

  1. 修改参数,指定实现的feature是否生效
  2. 让每一个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 节点)。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
  }
}
  • 让container运行在不同的节点上。申请资源的时候,会调用函数setupContainerAskForRM,修改该函数即可,函数如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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运行在不同的节点上,表示改写成功
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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中获取计算节点列表。最后将问题解决了。感谢所有提供帮助的人

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
编写一个直接在Yarn上运行的程序
我们知道基于mapReduce框架的分布式程序的编写,在这种框架下我们不需要考虑申请资源,只需要安照mapreduce框架的要求,直接编写Map函数和reduce函数即可。如何在Yarn上直接编写应用程序呢?
Tim在路上
2020/08/04
1.5K0
Hadoop 2.0:主流开源云架构(四)
  Hadoop 2.0分为相互独立的几个模块,访问各个模块的方式也是相互独立的,但每个模块访问方式可分为:浏览器接口、Shell接口和编程接口。
Francek Chen
2025/01/23
1270
Hadoop 2.0:主流开源云架构(四)
如何编写一个YARN应用
在应用的提交流程中,是应用客户端将应用提交到 YARN ResourceManager。这可以通过设置YarnClient来完成。YarnClient启动后,客户端可以设置应用程序环境,准备好包含应用程序的第一个容器ApplicationMaster(AM),然后提交申请。您需要提供诸如应用程序运行所需的本地文件/jar 的详细信息、需要执行的实际命令(带有必要的命令行参数)、任何操作系统环境设置(可选)等信息等等。实际上,您需要描述需要为 ApplicationMaster 启动的 Unix 进程。
从大数据到人工智能
2023/02/13
1K0
Hadoop Yarn 创建Application
创建Application是由client向ResourceManager发起申请,client与RM之间的通信依靠Hadoop RPC,通信协议是ApplicationClientProtocol,所谓通信协议实际上就是一个接口,接口中说明了server/client具备哪些操作函数。
Dlimeng
2023/06/30
3990
distributedShell 样例源码详解
distributedShell是Yarn自带的应用程序,和MR类似,当前工具可以用来对Yarn进行压测。
zeekling
2025/06/15
1000
Hadoop源码系列(一)FairScheduler申请和分配container的过程
1、如何申请资源 1.1 如何启动AM并申请资源 1.1.1 如何启动AM val yarnClient = YarnClient.createYarnClient setupCredentials() yarnClient.init(yarnConf) yarnClient.start() // Get a new application from our RM val newApp = yarnClient.createApplication() val newAppResponse = newApp.
岑玉海
2018/02/28
1.2K0
Hadoop源码系列(一)FairScheduler申请和分配container的过程
快速、安全、可靠!Yarn!| MTdata小讲堂
Yarn 的全称是 Yet Anther Resource Negotiator(另一种资源协商者)。它作为 Hadoop 的一个组件,官方对它的定义是一个工作调度和集群资源管理的框架。关于 Yarn 的发展历史我们在之前的文章曾介绍过,在这里就不赘述了。
美图数据技术团队
2018/09/18
5980
快速、安全、可靠!Yarn!| MTdata小讲堂
YARN之label调度在EMR中的应用
在腾讯云EMR的用户场景使用当中,有部分用户要求希望他们能在任务高峰期,对集群进行扩容,利用云端的弹性计算资源,为集群扩展计算能力,并且在集群相对空闲的情况下,对集群进行缩容,能够最大化的平衡费用成本,达到对资源的按需利用,从而满足自身对计算的需求。
shangwen_
2018/08/10
1.6K0
YARN之label调度在EMR中的应用
[源码解析]Oozie来龙去脉之内部执行
Oozie由Cloudera公司贡献给Apache的基于工作流引擎的开源框架,是用于Hadoop平台的开源的工作流调度引擎,用来管理Hadoop作业,进行。本文是系列的第二篇,介绍Oozie的内部执行阶段。
罗西的思考
2020/09/07
1.3K0
yarn 学习笔记(对比 kubernetes 调度)
ApplicationMaster(AM),用户提交的每个应用程序都需要包含一个AM, 作用为:
王磊-字节跳动
2020/11/03
4.5K0
Spark源码系列(七)Spark on yarn具体实现
本来不打算写的了,但是真的是闲来无事,整天看美剧也没啥意思。这一章打算讲一下Spark on yarn的实现,1.0.0里面已经是一个stable的版本了,可是1.0.1也出来了,离1.0.0发布才一个月的时间,更新太快了,节奏跟不上啊,这里仍旧是讲1.0.0的代码,所以各位朋友也不要再问我讲的是哪个版本,目前为止发布的文章都是基于1.0.0的代码。 在第一章《spark-submit提交作业过程》的时候,我们讲过Spark on yarn的在cluster模式下它的main class是org.apach
岑玉海
2018/02/28
1.7K0
Yarn配置分区
这是CDP中Yarn使用系列中的一篇,之前的文章请参考<使用YARN Web UI和CLI>、<CDP 中配置Yarn的安全性>、<CDP的Yarn资源调度与管理>、<CDP中Yarn管理队列>、<Yarn在全局级别配置调度程序属性>、<Yarn配置每个队列属性>、<Yarn管理放置规则>和<Yarn管理动态队列>。
大数据杂货铺
2021/09/15
1.7K0
Yarn配置分区
yarn节点属性及调度
在2.X版本中,已经支持节点设置标签,并且允许容量调度中的队列,设置可访问的节点标签以及默认标签值,并按照节点标签进行调度。
陈猿解码
2023/02/28
1.1K0
yarn节点属性及调度
yarn-site.xml 配置介绍
yarn-site.xml 配置介绍 yarn.scheduler.minimum-allocation-mb yarn.scheduler.maximum-allocation-mb 说明:单个容器可申请的最小与最大内存,应用在运行申请内存时不能超过最大值,小于最小值则分配最小值,从这个角度看,最小值有点想操作系统中的页。最小值还有另外一种用途,计算一个节点的最大container数目注:这两个值一经设定不能动态改变(此处所说的动态改变是指应用运行时)。 默认值:1024/8192 yarn.scheduler.minimum-allocation-vcores yarn.scheduler.maximum-allocation-vcores 参数解释:单个可申请的最小/最大虚拟CPU个数。比如设置为1和4,则运行MapRedce作业时,每个Task最少可申请1个虚拟CPU,最多可申请4个虚拟CPU。 默认值:1/32 yarn.nodemanager.resource.memory-mb yarn.nodemanager.vmem-pmem-ratio 说明:每个节点可用的最大内存,RM中的两个值不应该超过此值。此数值可以用于计算container最大数目,即:用此值除以RM中的最小容器内存。虚拟内存率,是占task所用内存的百分比,默认值为2.1倍;注意:第一个参数是不可修改的,一旦设置,整个运行过程中不可动态修改,且该值的默认大小是8G,即使计算机内存不足8G也会按着8G内存来使用。 默认值:8G /2.1 yarn.nodemanager.resource.cpu-vcores 参数解释:NodeManager总的可用虚拟CPU个数。 默认值:8 AM内存配置相关参数,此处以MapReduce为例进行说明(这两个值是AM特性,应在mapred-site.xml中配置),如下: mapreduce.map.memory.mb mapreduce.reduce.memory.mb 说明:这两个参数指定用于MapReduce的两个任务(Map and Reduce task)的内存大小,其值应该在RM中的最大最小container之间。如果没有配置则通过如下简单公式获得: max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers)) 一般的reduce应该是map的2倍。注:这两个值可以在应用启动时通过参数改变; AM中其它与内存相关的参数,还有JVM相关的参数,这些参数可以通过,如下选项配置: mapreduce.map.java.opts mapreduce.reduce.java.opts 说明:这两个参主要是为需要运行JVM程序(java、scala等)准备的,通过这两个设置可以向JVM中传递参数的,与内存有关的是,-Xmx,-Xms等选项。此数值大小,应该在AM中的map.mb和reduce.mb之间。 我们对上面的内容进行下总结,当配置Yarn内存的时候主要是配置如下三个方面:每个Map和Reduce可用物理内存限制;对于每个任务的JVM对大小的限制;虚拟内存的限制; 下面通过一个具体错误实例,进行内存相关说明,错误如下: Container[pid=41884,containerID=container_1405950053048_0016_01_000284] is running beyond virtual memory limits. Current usage: 314.6 MB of 2.9 GB physical memory used; 8.7 GB of 6.2 GB virtual memory used. Killing container. 配置如下:
用户1217611
2020/06/19
2K0
yarn-site.xml 配置介绍
Yarn快速入门系列(1)——基本架构与三大组件介绍
本篇博客,博主为大家分享的内容是关于一个在Hadoop中非常重要的组件——Yarn。到底有多重要呢?请看下面详解! 码字不易,先赞后看! Apache Hadoop YARN 1. Yarn 通
大数据梦想家
2021/01/27
1.1K0
Yarn快速入门系列(1)——基本架构与三大组件介绍
hadoop集群老的资源管理Mrv1与Yarn资源管理器的工作流程和对比
2、JobTracker负担重,既要负责资源管理,又要进行作业调度;当需处理太多任务时,会造成过多的资源消耗。
全栈程序员站长
2022/08/09
1.1K0
hadoop集群老的资源管理Mrv1与Yarn资源管理器的工作流程和对比
大数据ETL实践探索 ---- 笔试面试考点
1、Spark的中间数据放到内存中,对于迭代运算效率更高 2、Spark比Hadoop更通用 3、Spark提供了统一的编程接口 4、容错性– 在分布式数据集计算时通过checkpoint来实现容错 5、可用性– Spark通过提供丰富的Scala, Java,Python API及交互式Shell来提高可用性
流川疯
2020/10/09
5320
大数据ETL实践探索 ---- 笔试面试考点
Hadoop基础教程-第5章 YARN:资源调度平台(5.1 YARN介绍)
YARN的全称是Yet Another Resource Negotiator,意为另一种资源调度者。 从Apache Hadoop 2.0开始, Hadoop包含 YARN。
程裕强
2022/05/06
6020
Hadoop基础教程-第5章 YARN:资源调度平台(5.1 YARN介绍)
Spark内核详解 (4) | Spark 部署模式
实际上,除了上述这些通用的集群管理器外,Spark 内部也提供了方便用户测试和学习的简单集群部署模式。由于在实际生产环境下使用的绝大多数的集群管理器是 Hadoop YARN,因此我们关注的重点是 Hadoop YARN 模式下的 Spark 集群部署。
不温卜火
2020/10/28
1.7K0
Spark内核详解 (4) | Spark 部署模式
Container exited with a non-zero exit code 134 Container exited code 134
--driver-class-path "$yarn_client_driver_classpath" \
sandyshu
2022/09/22
1.7K0
相关推荐
编写一个直接在Yarn上运行的程序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验