diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/ExecDriver.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/ExecDriver.java index 42d764d..190b93f 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/ExecDriver.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/ExecDriver.java @@ -100,6 +100,7 @@ */ public class ExecDriver extends Task implements Serializable, HadoopJobExecHook { + public static final String EXECUTION_LOG_AT = "Execution log at: "; private static final long serialVersionUID = 1L; private static final String JOBCONF_FILENAME = "jobconf.xml"; @@ -686,7 +687,7 @@ public static void main(String[] args) throws IOException, HiveException { for (Appender appender : Collections.list((Enumeration) LogManager.getRootLogger() .getAllAppenders())) { if (appender instanceof FileAppender) { - console.printInfo("Execution log at: " + ((FileAppender) appender).getFile()); + console.printInfo(EXECUTION_LOG_AT + ((FileAppender) appender).getFile()); } } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java index bd7aec2..d120616 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java @@ -463,7 +463,7 @@ public Counters getCounters() throws IOException { } - public void localJobDebugger(int exitVal, String taskId) { + public void localJobDebugger(int exitVal, String taskId, List errPrintStreamOutput) { StringBuilder sb = new StringBuilder(); sb.append("\n"); sb.append("Task failed!\n"); @@ -477,9 +477,22 @@ public void localJobDebugger(int exitVal, String taskId) { console.printError((new Path(((FileAppender)a).getFile())).toUri().getPath()); } } + + /** + * Find Execution Log from output stream and print it out in client side log + * + * It's hacky but looks like a reasonable way. + */ + for (String log : errPrintStreamOutput) { + if (log.indexOf(ExecDriver.EXECUTION_LOG_AT) > -1) { + console.printError(log); + break; + } + } + } - public int progressLocal(Process runningJob, String taskId) { + public int progressLocal(Process runningJob, String taskId, List errPrintStreamOutput) { int exitVal = -101; try { exitVal = runningJob.waitFor(); //TODO: poll periodically @@ -492,7 +505,7 @@ public int progressLocal(Process runningJob, String taskId) { if (HiveConf.getBoolVar(job, HiveConf.ConfVars.SHOW_JOB_FAIL_DEBUG_INFO)) { // Since local jobs are run sequentially, all relevant information is already available // Therefore, no need to fetch job debug info asynchronously - localJobDebugger(exitVal, taskId); + localJobDebugger(exitVal, taskId, errPrintStreamOutput); } } else { console.printInfo("Execution completed successfully"); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/MapRedTask.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/MapRedTask.java index a7e2253..b8b2060 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/MapRedTask.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/MapRedTask.java @@ -274,7 +274,7 @@ public int execute(DriverContext driverContext) { outPrinter.start(); errPrinter.start(); - int exitVal = jobExecHelper.progressLocal(executor, getId()); + int exitVal = jobExecHelper.progressLocal(executor, getId(), errPrintStream.getOutput()); if (exitVal != 0) { LOG.error("Execution failed with exit status: " + exitVal); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/MapredLocalTask.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/MapredLocalTask.java index 0cc90d0..bf44798 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/MapredLocalTask.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/MapredLocalTask.java @@ -260,7 +260,7 @@ public int execute(DriverContext driverContext) { outPrinter.start(); errPrinter.start(); - int exitVal = jobExecHelper.progressLocal(executor, getId()); + int exitVal = jobExecHelper.progressLocal(executor, getId(), errPrintStream.getOutput()); if (exitVal != 0) { LOG.error("Execution failed with exit status: " + exitVal);