You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用Yarn执行命令及提交分布式Shell任务时,如何获取applicationId?

获取YARN Application ID的两种场景解决方法

1. 使用Yarn命令执行时获取Application ID

当你直接通过Yarn CLI执行任务(比如yarn jaryarn application相关命令),有几种实用方式拿到Application ID:

  • 直接抓取命令输出:大多数Yarn提交命令(比如yarn jar)执行后,控制台会直接输出类似Submitted application application_XXXXXXXXX_XXXX的日志,你可以直接复制,或者用命令行工具过滤提取:

    yarn jar your-app.jar | grep -o "application_[0-9]*_[0-9]*"
    

    这个grep命令会精准匹配并提取出标准格式的Application ID。

  • 查看YARN Web UI:提交任务后,打开YARN资源管理器的Web界面(默认端口8088),在「Applications」列表里找到刚提交的任务,就能看到对应的Application ID,还能同步查看任务状态、日志等详细信息。

  • 查看本地日志文件:Yarn会在用户本地目录的~/.yarn/logs/下保存任务提交日志,打开对应任务的日志文件,里面也会清晰记录Application ID。


2. 编程方式获取分布式Shell任务的Application ID

如果是通过代码或自动化脚本提交分布式Shell任务,可以试试这几种方法:

方法一:用YARN Client API(Java示例)

如果你用Java开发,直接借助YARN的Client API提交任务,能在提交时直接获取Application ID:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.client.api.YarnClient;
import org.apache.hadoop.yarn.client.api.YarnClientApplication;
import org.apache.hadoop.yarn.conf.YarnConfiguration;

public class YarnDistShellSubmitter {
    public static void main(String[] args) throws Exception {
        Configuration conf = new YarnConfiguration();
        YarnClient yarnClient = YarnClient.createYarnClient();
        yarnClient.init(conf);
        yarnClient.start();

        // 创建应用提交上下文
        YarnClientApplication app = yarnClient.createApplication();
        // 配置分布式Shell任务参数(比如容器数量、内存、主类等)
        // ...

        // 提交任务并获取Application ID
        ApplicationId appId = yarnClient.submitApplication(app.getApplicationSubmissionContext());
        System.out.println("Submitted Application ID: " + appId.toString());

        yarnClient.stop();
    }
}

这段代码通过YarnClient提交任务后,直接返回ApplicationId对象,调用toString()就能拿到标准格式的ID字符串。

方法二:解析命令执行输出(Shell脚本场景)

如果是在Shell脚本里调用yarn jar提交分布式Shell任务,可以捕获命令输出并解析:

# 提交分布式Shell任务并捕获输出
APP_OUTPUT=$(yarn jar hadoop-yarn-applications-distributedshell.jar org.apache.hadoop.yarn.applications.distributedshell.Client --num_containers 1 --container_memory 512)
# 提取Application ID
APP_ID=$(echo "$APP_OUTPUT" | grep -o "application_[0-9]*_[0-9]*")
echo "获取到的Application ID: $APP_ID"

这种方式适合自动化脚本场景,通过grep精准提取输出中的Application ID。

方法三:调用YARN REST API

任务提交后,也可以通过YARN的REST API查询目标任务的ID。比如查询所有运行中的应用,过滤出对应任务名称的Application ID:

# 替换为你的YARN ResourceManager地址
RM_ADDRESS="http://your-rm-host:8088"
# 替换为你的分布式Shell任务名称
APP_NAME="Distributed Shell"
# 调用API并解析JSON响应
APP_ID=$(curl -s "$RM_ADDRESS/ws/v1/cluster/apps?states=SUBMITTED,ACCEPTED,RUNNING" | jq -r ".apps.app[] | select(.name == \"$APP_NAME\") | .id")
echo "获取到的Application ID: $APP_ID"

这里用到jq工具解析JSON响应,需要确保你的环境已安装jq。


内容的提问来源于stack exchange,提问作者vy32

火山引擎 最新活动