我实际上在Linux shell上检索了我的Spark应用程序的日志:
yarn logs -applicationId applicationid
有什么方法可以使用Java进行编程检索?
我想使用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)
是的。您可以通过Yarnclient获取有关应用程序的大多数关键信息,并且可以对Spark History Server API进行休息。您在这里寻找的终点是
/applications/[base-app-id]/logs
您在外壳环境中的方法正确!
我认为,因为纱线已经是在您的系统中的可执行程序。
使当前的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();
}
}
}
}
成功终止此子过程后,您可以在当前工作目录中使用特定日志。