【发布时间】:2017-09-22 11:18:15
【问题描述】:
实际上,我使用以下命令在 linux shell 上检索我的 spark 应用程序的日志:
yarn logs -applicationId applicationid
有没有办法使用 java 以编程方式检索它?
【问题讨论】:
标签: java hadoop apache-spark hadoop-yarn
实际上,我使用以下命令在 linux shell 上检索我的 spark 应用程序的日志:
yarn logs -applicationId applicationid
有没有办法使用 java 以编程方式检索它?
【问题讨论】:
标签: java hadoop apache-spark hadoop-yarn
我想使用 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
【讨论】:
YarnClient 可让您检索有关应用程序的一些信息,但不幸的是不能检索日志:(。您可以使用 Spark 的 REST API 方法 /applications/[base-app-id]/logs 但标准输出检索日志,至少从我的应用程序, 似乎从这些日志中丢失了。即使您在使用 yarn logs -applicationId <appid> -log_files stdout 时可以看到标准输出。我真的需要一种从 Java 以编程方式检索标准输出的方法。或者我可能需要我的应用程序改为登录到 Spark.. .
你在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();
}
}
}
}
成功终止该子进程后,您可以将您的特定日志作为当前工作目录中的普通文件使用。
【讨论】: