前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >distributedShell 样例源码详解

distributedShell 样例源码详解

原创
作者头像
zeekling
发布于 2025-06-15 08:48:05
发布于 2025-06-15 08:48:05
6800
代码可运行
举报
运行总次数:0
代码可运行

简介

distributedShell是Yarn自带的应用程序,和MR类似,当前工具可以用来对Yarn进行压测。

使用示例

参考命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./bin/hadoop jar ./share/hadoop/yarn/hadoop-yarn-applications-distributedshell-3.4.1.jar \
 -jar ./share/hadoop/yarn/hadoop-yarn-applications-distributedshell-3.4.1.jar  -shell_command \
'/bin/date' -num_containers 5 

可以提交一个样例作业到Yarn上面。

源码阅读

当前样例的入口类是org.apache.hadoop.yarn.applications.distributedshell.Client ,在pom文件里面默认定义了当前类为主类。所以在提交的时候可以不用指定主类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <executions>
         <!-- 省略部分参数 -->
        </executions>
        <configuration>
           <archive>
             <manifest>
               <mainClass>org.apache.hadoop.yarn.applications.distributedshell.Client</mainClass>
             </manifest>
           </archive>
        </configuration>
      </plugin>

核心流程主要包含下面3个:

  • 初始化CLient对象
  • 初始化Client
  • 提交作业到yarn

其中前面两个主要在客户端,第3个主要是在yarn上面。

客户端提交核心代码

初始化

初始化阶段包括下面两部分:

  • 初始化Client对象,主要是创建Yarn的连接以及初始化支持的参数列表
  • 初始化Client

下面是初始化Client对象的核心代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Client(String appMasterMainClass, Configuration conf) {
    this.conf = conf;
    this.conf.setBoolean(
        YarnConfiguration.YARN_CLIENT_LOAD_RESOURCETYPES_FROM_SERVER, true);
    this.appMasterMainClass = appMasterMainClass;
    // 创建和RM的连接
    yarnClient = YarnClient.createYarnClient();
    yarnClient.init(conf);
    opts = new Options();
    // 初始化支持的参数列表
    stopSignalReceived = new AtomicBoolean(false);
    isRunning = new AtomicBoolean(false);
  }

初始化Client,在初始化Client阶段主要是读取命令行参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 初始化Client函数入口
boolean doRun = client.init(args);

运行作业

首先还是建立和Yarn服务端的连接,为作业提交做准备。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 isRunning.set(true);
 yarnClient.start();

在连接建立之后会查询并且在控制台打印Yarn服务端的一些信息。主要包含下面内容:

  • 当前集群NM的个数,通过yarnClient.getYarnClusterMetrics() 查询到并且显示。
  • 当前集群中运行中NM的详细信息,通过yarnClient.getNodeReports(NodeState.RUNNING)查询到。
  • 当前任务提交的队列的详细信息,通过yarnClient.getQueueInfo(this.amQueue)查询到。
  • 当前集群的ACL信息,通过yarnClient.getQueueAclsInfo()查询。
  • 当前集群的ResourceProfile信息,通过yarnClient.getResourceProfiles()查询。

在打印完集群信息之后才是作业提交的开始。

提交作业之前,是需要先向RM申请AppId的。AppId可以通过YarnClientApplication app = yarnClient.createApplication();获取。作业提交信息一般都在ApplicationSubmissionContext里面,包含下面信息:

  • AM申请资源的请求。通过appContext.setAMContainerResourceRequests(amResourceRequests);设置。
  • AM的上下文信息:
    • 访问hdfs等所需要的token。当前token会伴随着整个作业,直到作业结束才会异步销毁。
    • 需要本地话的文件。
    • AM或者Container所需要的环境变量。
    • AM的启动命令,AM启动的类也是在这里指定的。类似于 java运行jar或者某个主类。
  • App名称。通过appContext.setApplicationName(appName);设置。
  • app tag信息。
  • 资源标签信息。
  • 作业的优先级。
  • 作业提交的队列信息。
  • 日志聚合相关配置。主要是和日志归集的Rolling模式有关系。可以设置需要通过rolling的方式归集哪些日志。通过appContext.setLogAggregationContext(logAggregationContext);设置。

作业真正提交的代码只有一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarnClient.submitApplication(appContext);

当前样例做到了作业所需要的信息可配置。是一个比较适合开发作业的样例。

AM核心代码

AM的核心代码是在ApplicationMaster.java里面的。在启动AM的时候会调用到当前函数的main函数。

在构造函数里面和init函数里面,主要是加载配置项以及命令行参数。真正运行的函数是run,核心在run函数里面,

首先需要创建和RM以及NM的连接。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
amRMClient = AMRMClientAsync.createAMRMClientAsync(1000, allocListener);
amRMClient.init(conf);
amRMClient.start();

containerListener = createNMCallbackHandler();
nmClientAsync = new NMClientAsyncImpl(containerListener);
nmClientAsync.init(conf);
nmClientAsync.start();  
startTimelineClient(conf);

在AM启动OK了第一件事就是需要去RM上面注册,证明当前AM已经启动完成了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RegisterApplicationMasterResponse response = amRMClient
        .registerApplicationMaster(appMasterHostname, appMasterRpcPort,
            appMasterTrackingUrl, placementConstraintMap);

普通Container的申请是在AM里面处理的,类似下面代码,下面代码是异步申请的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ContainerRequest containerAsk = setupContainerAskForRM();
amRMClient.addContainerRequest(containerAsk);

当Container申请好之后,可以通过下面代码获取,在样例中触发onContainerAllocated事件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Container> allocated = response.getAllocatedContainers();
if (!allocated.isEmpty()) {
    handler.onContainersAllocated(allocated);
}

通过下面代码启动Container.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ContainerLaunchContext ctx = ContainerLaunchContext.newInstance(
        localResources, myShellEnv, commands, null, allTokens.duplicate(),
          null, containerRetryContext); 
nmClientAsync.startContainerAsync(container, ctx);

在作业结束的时候,AM需要做下面事:

  • 停止nmClient。
  • 从RM上取消AppMaster
  • 停止amClient。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nmClientAsync.stop();
try {
    amRMClient.unregisterApplicationMaster(appStatus, message, null);
} catch (YarnException | IOException ex) {
    LOG.error("Failed to unregister application", ex);
}
amRMClient.stop();

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
Kubernetes 1.26 正式发布,所有变化都在这儿了!
太平洋时间 2022 年 12 月 8 号 Kubernetes 正式发布了主题为 `Electrifying` 的 v1.26。
我的小碗汤
2023/03/20
1.1K0
Kubernetes 1.26 正式发布,所有变化都在这儿了!
Kubernetes 1.26 中的删除、弃用和主要更改
变化是 Kubernetes 生命周期不可或缺的一部分:随着 Kubernetes 的成长和成熟,功能可能会被弃用、删除或替换为项目健康的改进。对于 Kubernetes v1.26,有几个计划:本文根据 v1.26 发布过程中这个周期中期点可用的信息确定并描述了其中的一部分,该过程仍在进行中,并且可能会引入其他更改。
我的小碗汤
2023/03/20
1.9K0
Kubernetes 1.26 中的删除、弃用和主要更改
Kubernetes 1.25 中的重大更改和删除
随着 Kubernetes 的发展和成熟,有些功能可能会被弃用、删除或替换。Kubernetes v1.25 包括几项重大更改和删除。
我的小碗汤
2023/03/19
2.2K0
Kubernetes 1.25 中的重大更改和删除
Kubernetes 1.24的删除和弃用
随着 Kubernetes 的发展,特性和 API 会定期给重新访问和删除。新的特性可能会提供一种替代的或改进的方法,来解决现有的问题,激励团队去除旧的方法。根据Kubernetes 弃用策略[1],旧的 API 首先被弃用(deprecated),然后被删除(removed)。
CNCF
2022/04/19
1.6K0
刚刚 Kubernetes 1.25 正式发布,所有变化都在这儿了
此版本带来了 40 项增强功能,略少于Kubernetes 1.24 中的 46 项。在这 40 项增强功能中,13 项正在升级到稳定版,10 项是对现有功能的不断改进,15 项是全新的,2 项是已弃用的功能。
我的小碗汤
2023/03/19
1.7K0
刚刚 Kubernetes 1.25 正式发布,所有变化都在这儿了
Kubernetes 1.24 正式发布,这里是功能总览!
Kubernetes 1.24 的发布日期从 4 月 19 日 移至 5 月 3 日[1]。现已正式发布。
我的小碗汤
2023/03/19
1.2K0
Kubernetes 1.24 正式发布,这里是功能总览!
Kubernetes 1.24:观星者
我们很兴奋地宣布 Kubernetes 1.24 的发布,这是 2022 年的第一个版本!
CNCF
2022/06/10
4560
Kubernetes 1.24:观星者
K8S 在 v1.27 中移除的特性和主要变更
随着 Kubernetes 发展和成熟,为了此项目的整体健康,某些特性可能会被弃用、移除或替换为优化过的特性。基于目前在 v1.27 发布流程中获得的信息,本文将列举并描述一些计划在 Kubernetes v1.27 发布中的变更, 发布工作目前仍在进行中,可能会引入更多变更。
我的小碗汤
2023/03/23
1.4K0
K8S 在 v1.27 中移除的特性和主要变更
刚刚,Kubernetes 1.24正式发布
今天,我们很高兴地向大家宣布,Kubernetes 1.24暨2022年的首个版本已经正式发布!
肉眼品世界
2022/06/15
7850
刚刚,Kubernetes 1.24正式发布
Kubernetes 1.26: 动态资源分配 Alpha API
作者: Patrick Ohly (Intel)、Kevin Klues (NVIDIA)
CNCF
2023/02/12
1.2K0
Kubernetes 1.26: 动态资源分配 Alpha API
Kubernetes 1.25:CSI 内联存储卷正式发布
CSI 内联存储卷是在 Kubernetes 1.15 中作为 Alpha 功能推出的,并从 1.16 开始成为 Beta 版本。我们很高兴地宣布,这项功能在 Kubernetes 1.25 版本中正式发布(GA)。
CNCF
2022/11/28
5260
Kubernetes v1.19.0 正式发布!
终于,我们推出了Kubernetes 1.19,这是2020年的第二个发行版,并且迄今为止最长的发行周期持续了20周。它由33项增强功能组成。12个增强功能进入稳定版,18个增强功能进入测试版,13个增强功能进入alpha版。
YP小站
2020/08/28
8320
Kubernetes v1.19.0 正式发布!
Kubernetes 1.29正式发布,包含49个增强功能
现在宣布 Kubernetes v1.29:Mandala 版本正式发布,这是 2023 年发布的最后一个版本!
公众号: 云原生生态圈
2024/01/23
1.1K0
Kubernetes 1.29正式发布,包含49个增强功能
Kubernetes的容器存储接口(CSI)GA了
Kubernetes实施的容器存储接口(CSI)已在Kubernetes v1.13版本中升级为GA。CSI的支持在Kubernetes v1.9版本中作为alpha引入,并在Kubernetes v1.10版本中升级为beta。
CNCF
2019/12/05
1.5K0
K8S v1.26:CPUManager 正式发布,生产可用!
CPU 管理器是 kubelet 的一部分;kubelet 是 Kubernetes 的节点代理,能够让用户给容器分配独占 CPU。CPU 管理器自从 Kubernetes v1.10 进阶至 Beta[1], 已证明了它本身的可靠性,能够充分胜任将独占 CPU 分配给容器,因此采用率稳步增长, 使其成为性能关键型和低延迟场景的基本组件。随着时间的推移,大多数变更均与错误修复或内部重构有关, 以下列出了几个值得关注、用户可见的变更:
我的小碗汤
2023/03/20
6740
K8S v1.26:CPUManager 正式发布,生产可用!
Kubernetes v1.26 新特性一览
Kubernetes v1.26 是 2022 年的最后一个大版本更新,包含了 37 项主要的更新。
Jintao Zhang
2023/02/26
6820
Kubernetes v1.26 新特性一览
存储容量跟踪在Kubernetes 1.24中正式GA
正如在之前一篇博客文章[2]中详细解释的那样,存储容量跟踪允许 CSI 驱动程序发布关于剩余容量的信息。kube-scheduler 然后使用该信息为一个 pod 挑选合适的节点,如果该 pod 仍有卷需要创建(provision)。
CNCF
2022/06/10
5350
Kubernetes v1.23即将发布,有哪些重磅更新?
Kubernetes 1.23即将发布,此版本带来了 45 项增强功能,与 Kubernetes 1.22 中的 56 项和 Kubernetes 1.21 中的 50 项相近。在这 45 项增强功能中,11 项已升级为稳定版,多达 15 项是不断改进的现有功能,还有 19 项是全新的。
用户5166556
2023/03/18
9560
Kubernetes v1.23即将发布,有哪些重磅更新?
Kubernetes v1.28 新特性一览
Kubernetes v1.28 是 2023 年的第二个大版本更新,包含了 46 项主要的更新。 而今年发布的第一个版本 v1.27 有近 60 项,所以可以看出来,在发布节奏调整后,每个 Kubernetes 版本中都会包含很多新的变化。
Jintao Zhang
2023/09/03
7970
Kubernetes v1.28 新特性一览
K8S 1.26 跨命名空间存储数据源实践详解
上个月发布的 Kubernetes v1.26 引入了一项 alpha 功能,允许您为 PersistentVolumeClaim 指定数据源,即使源数据属于不同的命名空间。启用新功能后,您可以在新 PersistentVolumeClaim 的 dataSourceRef字段中指定 namespace。一旦 Kubernetes 检查访问是正常的,新的 PersistentVolume 就可以从其他命名空间中指定的存储源填充其数据。
我的小碗汤
2023/03/20
1.2K0
K8S 1.26 跨命名空间存储数据源实践详解
推荐阅读
相关推荐
Kubernetes 1.26 正式发布,所有变化都在这儿了!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档