【问题标题】:How to retrieve yarn's logs programmatically using java如何使用 java 以编程方式检索纱线的日志
【发布时间】:2017-09-22 11:18:15
【问题描述】:

实际上,我使用以下命令在 linux shell 上检索我的 spark 应用程序的日志:

yarn logs -applicationId applicationid

有没有办法使用 java 以编程方式检索它?

【问题讨论】:

    标签: java hadoop apache-spark hadoop-yarn


    【解决方案1】:

    我想使用 java 以编程方式完成,所以我终于看了一下命令背后的代码:

    yarn logs -applicationId applicationid
    

    在:

    src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java
    

    我现在以字符串(内容)的形式检索日志。代码是:

    String applicationId = "application_1492795815045_3940";
    ApplicationId appId = appId = ConverterUtils.toApplicationId(applicationId);
    LogCLIHelpers logCliHelper = new LogCLIHelpers();
    Configuration config = new Configuration();
    logCliHelper.setConf(config);
    String appOwner = UserGroupInformation.getCurrentUser().getShortUserName();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PrintStream ps = new PrintStream(baos);
    // Function to retrieve logs
    logCliHelper.dumpAllContainersLogs(appId, appOwner, ps);
    String content = new String(baos.toByteArray(), StandardCharsets.UTF_8);
    System.out.println(content)
    

    【讨论】:

      【解决方案2】:

      是的,你可以。您可以通过YarnClient 获取有关应用程序的大部分关键信息,您可以拨打Spark History Server API 的其他电话。您在此处寻找的端点是

      /applications/[base-app-id]/logs
      

      【讨论】:

      • YarnClient 可让您检索有关应用程序的一些信息,但不幸的是不能检索日志:(。您可以使用 Spark 的 REST API 方法 /applications/[base-app-id]/logs 但标准输出检索日志,至少从我的应用程序, 似乎从这些日志中丢失了。即使您在使用 yarn logs -applicationId <appid> -log_files stdout 时可以看到标准输出。我真的需要一种从 Java 以编程方式检索标准输出的方法。或者我可能需要我的应用程序改为登录到 Spark.. .
      【解决方案3】:

      你在shell环境下的方法是正确的!

      在我看来,因为 yarn 已经是您系统中的可执行程序

      使当前的 java 进程(即当前的 jvm)访问并使用它。您可以启动一个新的子进程来帮助您完成这项工作。

      也许后面的代码会对你有所帮助。

      public class YarnLog {
          //
          public static void getYarnLog(String appid) throws IOException {
              BufferedReader br = null;
              try {
                  Process p = Runtime.getRuntime().exec(String.format("yarn logs -applicationId %s", appid));
                  br = new BufferedReader(new InputStreamReader(p.getInputStream()));
                  String line;
                  while((line = br.readLine()) != null) {
                      System.out.println(line);
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              } finally {
                  if(br != null) {
                      br.close();
                  }
              }
          }
      }
      

      成功终止该子进程后,您可以将您的特定日志作为当前工作目录中的普通文件使用

      【讨论】:

        猜你喜欢
        • 2018-07-21
        • 2013-05-12
        • 2020-10-19
        • 2021-10-25
        • 1970-01-01
        • 1970-01-01
        • 2014-12-11
        • 1970-01-01
        • 2015-09-26
        相关资源
        最近更新 更多