Index: common/src/java/org/apache/hadoop/hive/conf/HiveConf.java =================================================================== --- common/src/java/org/apache/hadoop/hive/conf/HiveConf.java (revision 1153966) +++ common/src/java/org/apache/hadoop/hive/conf/HiveConf.java (working copy) @@ -122,6 +122,7 @@ MAXREDUCERS("hive.exec.reducers.max", 999), PREEXECHOOKS("hive.exec.pre.hooks", ""), POSTEXECHOOKS("hive.exec.post.hooks", ""), + ONFAILUREHOOKS("hive.exec.failure.hooks", ""), EXECPARALLEL("hive.exec.parallel", false), // parallel query launching EXECPARALLETHREADNUMBER("hive.exec.parallel.thread.number", 8), HIVESPECULATIVEEXECREDUCERS("hive.mapred.reduce.tasks.speculative.execution", true), Index: ql/src/java/org/apache/hadoop/hive/ql/Driver.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/Driver.java (revision 1153966) +++ ql/src/java/org/apache/hadoop/hive/ql/Driver.java (working copy) @@ -1021,6 +1021,29 @@ return pehooks; } + private List getOnFailureHooks() throws Exception { + ArrayList ofhooks = new ArrayList(); + String ofstr = conf.getVar(HiveConf.ConfVars.ONFAILUREHOOKS); + ofstr = ofstr.trim(); + if (ofstr.equals("")) { + return ofhooks; + } + + String[] ofClasses = ofstr.split(","); + + for (String ofClass : ofClasses) { + try { + ofhooks.add((Hook) Class.forName(ofClass.trim(), true, JavaUtils.getClassLoader()) + .newInstance()); + } catch (ClassNotFoundException e) { + console.printError("On Failure Hook Class not found:" + e.getMessage()); + throw e; + } + } + + return ofhooks; + } + public int execute() throws CommandNeedRetryException { Utilities.PerfLogBegin(LOG, "Driver.execute"); @@ -1139,6 +1162,16 @@ continue; } else { + hookContext.setHookType(HookContext.HookType.ON_FAILURE_HOOK); + // Get all the post execution hooks and execute them. + for (Hook ofh : getOnFailureHooks()) { + Utilities.PerfLogBegin(LOG, "FailureHook." + ofh.getClass().getSimpleName()); + + ((ExecuteWithHookContext) ofh).run(hookContext); + + Utilities.PerfLogEnd(LOG, "FailureHook." + ofh.getClass().getSimpleName()); + } + // TODO: This error messaging is not very informative. Fix that. errorMessage = "FAILED: Execution Error, return code " + exitVal + " from " + tsk.getClass().getName(); Index: ql/src/java/org/apache/hadoop/hive/ql/hooks/HookContext.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/hooks/HookContext.java (revision 1153966) +++ ql/src/java/org/apache/hadoop/hive/ql/hooks/HookContext.java (working copy) @@ -39,7 +39,7 @@ public class HookContext { static public enum HookType { - PRE_EXEC_HOOK, POST_EXEC_HOOK + PRE_EXEC_HOOK, POST_EXEC_HOOK, ON_FAILURE_HOOK } private QueryPlan queryPlan;