MapReduce作业状态检查报错:状态为DEFINE而非RUNNING,求提交判断方法
解决MapReduce作业调用
isComplete()时的"DEFINE instead of RUNNING"异常 这个问题我之前也碰到过,其实原因很直白:DEFINE状态表示你的作业还完全在客户端本地定义阶段,根本没提交到集群,所以此时调用isComplete()这种查询集群作业状态的方法,自然会抛出异常。
为什么会出现这个状态?
Hadoop的Job对象有几个内部状态,DEFINE就是其中之一——当你刚创建Job、配置好参数,但还没调用job.submit()或者job.waitForCompletion(true)的时候,作业就处于这个状态。这个状态是客户端本地的,还没同步到YARN集群,所以官方的JobStatus文档里确实查不到它(因为JobStatus是集群端的作业状态枚举)。
怎么判断作业是否已提交?
Hadoop的Job类没有公开的isSubmitted()方法,但我们可以自己在代码里跟踪这个状态:
- 在调用
job.submit()之前,设置一个布尔标记; - 提交成功后把标记设为
true; - 之后调用
isComplete()之前,先检查这个标记,避免在未提交时触发异常。
修改后的代码示例
// 新增一个标记跟踪作业是否已提交 boolean isJobSubmitted = false; // 先完成作业配置,然后提交 try { // ... 这里是你的作业配置代码(设置InputFormat、Mapper、Reducer等) ... job.submit(); // 提交作业到集群 isJobSubmitted = true; } catch (IOException e) { LOG.error("Failed to submit MapReduce job", e); } // 检查作业完成状态的逻辑 if (isJobSubmitted) { try { if (job.isComplete()) { printInfoLog(LOG, this.filename, "** " + job.getTrackingURL()); break; } } catch (Exception e) { LOG.warn("** " + e.getMessage()); } } else { LOG.warn("Skipping job completion check: Job hasn't been submitted to cluster yet"); }
额外提示
如果你不需要异步处理作业,直接用job.waitForCompletion(true)会更省心——这个方法会自动完成提交,并且阻塞直到作业结束,内部已经处理了状态校验,不会出现DEFINE状态的异常。
内容的提问来源于stack exchange,提问作者 Harish
相关产品推荐
相关产品推荐

