从一个简单的命令阅读hadoop源码(上)

简介: 从一个简单的命令阅读hadoop源码

01 引言

最近经常使用到了hadoop里面的yarn kill命令,如下:

yarn application -kill application_1653633751750_0039

本文就从这个简单的命令开始分析该命令的执行流程,分析一下其源码。

02 源码分析

2.1 导入hadoop源码

首先下载hadoop的源码并导入我们的IDEA:

github地址:https://github.com/apache/hadoop

源码结构如下红色报错忽略,我们只看源码):

2.2 源码入口

从命令可以分析,执行完这个命令之后,最后会有一句打印“Killed application ”:

项目全局搜索“Killed application ”:

可以看到整个项目只有在org.apache.hadoop.yarn.client.api.impl.YarnClientImpl打印了,看看这个类位于项目的哪个位置:

可以看到YarnClientImpl是处于hadoop-yarn-project ->hadoop-yarn ->hadoop-yarn-client下的。

从上图,不难发现,还有一个bin目录,展开:

很容易就能得知我们运行的启动命令就在这里面,这里也是程序的入口,我们来看看yarn命令里面的脚本内容。

2.3 yarn 脚本分析

从命令的内容看,一开始就定义了hadoop_usage方法,也就是我们使用这个命令时的help提示:

继续往下翻,可以看到定义了yarncmd_case方法,这里的意思判断终端输入的命令里面是否包含一些特定的子命令(如:application),然后就在org.apache.hadoop.yarn.client.cli.ApplicationCLI这个类里面执行了:

其余的命令内容不重要了,我们主要看我们需要的,继续进入ApplicationCLI类看看。

2.4 ApplicationCLI 代码分析

进入ApplicationCLI这个类,可以看到里面的run方法内容如下(包含解析):

@Override
  public int run(String[] args) throws Exception {
    int exitCode = -1;
    // 定义命令的title和参数
    Options opts = new Options();
    String title = null;
    if (firstArg != null) {
      title = firstArg;
    } else if (args.length > 0) {
      title = args[0];
    }
    if (APPLICATION.equalsIgnoreCase(title) || APP.equalsIgnoreCase(title)) {
      title = APPLICATION;
      addApplicationOptions(opts);
    } else if (APPLICATION_ATTEMPT.equalsIgnoreCase(title)) {
      addApplicationAttemptOptions(opts);
    } else if (CONTAINER.equalsIgnoreCase(title)) {
      addContainerOptions(opts);
    }
    // 解析命令
    CommandLine cliParser = createCLIParser(opts, args);
    if (cliParser == null) {
      printUsage(title, opts);
      return exitCode;
    }
    // 创建yarn客户端
    if (cliParser.hasOption(CLUSTER_ID_OPTION)) {
      String clusterIdStr = cliParser.getOptionValue(CLUSTER_ID_OPTION);
      getConf().set(YarnConfiguration.RM_CLUSTER_ID, clusterIdStr);
    }
    createAndStartYarnClient();
    // 执行命令
    if (cliParser.hasOption(STATUS_CMD)) {
      return executeStatusCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(LIST_CMD)) {
      return executeListCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(KILL_CMD)) {
      return executeKillCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(MOVE_TO_QUEUE_CMD)) {
      return executeMoveToQueueCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(FAIL_CMD)) {
      return executeFailCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(UPDATE_PRIORITY)) {
      return executeUpdatePriorityCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(SIGNAL_CMD)) {
      return executeSignalCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(SHELL_CMD)) {
      return executeShellCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(LAUNCH_CMD)) {
      return executeLaunchCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(STOP_CMD)) {
      return executeStopCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(START_CMD)) {
      return executeStartCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(SAVE_CMD)) {
      return executeSaveCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(DESTROY_CMD)) {
      return executeDestroyCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(FLEX_CMD)) {
      return executeFlexCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(ENABLE_FAST_LAUNCH)) {
      return executeEnableFastLaunchCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(UPDATE_LIFETIME)) {
      return executeUpdateLifeTimeCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(CHANGE_APPLICATION_QUEUE)) {
      return executeChangeApplicationQueueCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(UPGRADE_CMD)) {
      return executeUpgradeCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(DECOMMISSION)) {
      return executeDecommissionCommand(cliParser, title, opts);
    } else if (cliParser.hasOption(HELP_CMD)) {
      printUsage(title, opts);
      return 0;
    } else {
      syserr.println("Invalid Command Usage : ");
      printUsage(title, opts);
    }
    return 0;
  }

从该方法,可以看到做了几个事:

  • 解析命令createCLIParser(opts, args);
  • 创建并启动yarn客户端 createAndStartYarnClient()
  • 执行命令 executeKillCommand(cliParser, title, opts)

下面根据步骤讲解。

2.4.1 创建并启动yarn客户端

可以看到创建并启动yarn客户端代码在YarnCLI代码里面,而ApplicationCLI是继承与YarnCLI的:

createAndStartYarnClient 继承关系

继续点击createYarnClient方法:

可以看得出,这个类就是一开始本文根据提示查找出来的 源码入口类 了,那是如何执行到里面的killApplication方法呢?先不看这个类里面的源码,继续看ApplicationCLI是如何执行这个executeKillCommand方法的。

目录
相关文章
|
1月前
|
分布式计算 监控 Hadoop
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
39 1
|
2月前
|
资源调度 分布式计算 Hadoop
使用YARN命令管理Hadoop作业
本文介绍了如何使用YARN命令来管理Hadoop作业,包括查看作业列表、检查作业状态、杀死作业、获取作业日志以及检查节点和队列状态等操作。
54 1
使用YARN命令管理Hadoop作业
|
3月前
|
分布式计算 资源调度 Hadoop
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
|
4月前
|
分布式计算 Hadoop
hadoop格式化HDFS的命令
【7月更文挑战第21天】
477 5
|
4月前
|
分布式计算 资源调度 Hadoop
Hadoop执行格式化命令
【7月更文挑战第20天】
111 1
|
5月前
|
分布式计算 Hadoop Java
|
5月前
|
分布式计算 Hadoop Shell
分布式系统详解--框架(Hadoop-基本shell命令)
分布式系统详解--框架(Hadoop-基本shell命令)
40 0
|
1月前
|
分布式计算 Kubernetes Hadoop
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
149 6
|
1月前
|
分布式计算 资源调度 Hadoop
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
65 2
|
17天前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第27天】在大数据时代,数据湖技术凭借其灵活性和成本效益成为企业存储和分析大规模异构数据的首选。Hadoop和Spark作为数据湖技术的核心组件,通过HDFS存储数据和Spark进行高效计算,实现了数据处理的优化。本文探讨了Hadoop与Spark的最佳实践,包括数据存储、处理、安全和可视化等方面,展示了它们在实际应用中的协同效应。
63 2