如何检索纱线&x27;使用java以编程方式创建日志

如何检索纱线&x27;使用java以编程方式创建日志,java,hadoop,apache-spark,yarn,Java,Hadoop,Apache Spark,Yarn,实际上,我在linux shell上检索spark应用程序的日志时使用了: 纱线原木-applicationId applicationId 是否有任何方法可以使用java以编程方式检索它?是的,您可以。您可以通过获取有关应用程序的大部分关键信息,还可以对应用程序进行其他调用。您在这里寻找的端点是 /applications/[base-app-id]/logs 您在shell环境中的方法是正确的 在我看来,因为纱线在您的系统中已经是一个可执行程序 使当前java进程(即当前jvm)访问并使用

实际上,我在linux shell上检索spark应用程序的日志时使用了:

纱线原木-applicationId applicationId


是否有任何方法可以使用java以编程方式检索它?

是的,您可以。您可以通过获取有关应用程序的大部分关键信息,还可以对应用程序进行其他调用。您在这里寻找的端点是

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

您在shell环境中的方法是正确的

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

使当前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();
            }
        }
    }
}

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

我想使用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)

yanclient
允许您检索有关应用程序的一些信息,但不幸的是无法检索日志:(。您可以使用Spark的REST API方法检索日志
/applications/[base app id]/日志
但是,至少我的应用程序中的stdout似乎从那些日志中丢失了。即使你在使用
纱线日志-applicationId-log\u文件stdout
时可以看到stdout。我真的需要一种从Java编程检索stdout的方法。或者也许我需要我的应用程序记录以激发。。。