使用Yarn执行命令及提交分布式Shell任务时,如何获取applicationId?
1. 使用Yarn命令执行时获取Application ID
当你直接通过Yarn CLI执行任务(比如yarn jar、yarn 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




