作业执行失败排查思路
作业执行失败,有如下场景:
- 场景1:作业显示运行正常,但实际作业中的某一个应用运行失败
- 场景2:作业投递后处于运行中,运行过程正常,但是最后超时失败
- 场景3:作业投递后显示运行成功,但是根据日志分析作业有报错,也未能正确输出相关信息
- 场景4:作业投递后显示运行成功,但是根据日志分析作业有报错,也未能正确输出相关信息
- 场景5:参数配置的不合理导致的作业执行失败
场景1:作业显示运行正常,但实际作业中的某一个应用运行失败
如果作业显示运行正常,但实际作业中的某一个应用运行失败,请检查输入数据是否正常,并修改算法程序入口的main函数,保证运行结果有显式的返回值。
排查思路
作业运行时,每个应用称之为一个任务(Task)。部分场景下,任务输入数据异常,实际作业运行失败,但界面显示运行正常。
作业中子任务没有返回正确的值,但是容器仍正常退出return 0,此时判定为子任务已正确执行。
实际上作业的子任务对应的就是K8S中的一个Pod,其返回状态就是Pod的phase映射,即容器以非0状态退出或者被系统终止会算作失败;容器return 0并且不再重启即算成功。详细内容介绍请参见Pod的生命周期。
解决方法
所有的算法程序的入口main函数都显式的给出返回值,即正确执行则return 0。其他异常场景return其他数值或者抛出异常,并输出相关日志。
# python def funcA(): try: doSomething(); except: log.print("An exception occurred, xxxxx"); raise 自定义异常; def funcB(): result = doSomething(); return result; if __name__ == '__main__': funcA(); result = funcB(); if result: sys.exit(1); else: sys.exit(0);
# c++ int main(){ int result = doSomething(); if(result != 0){ return -1; } else{ return 0; } }
场景2:作业投递后处于运行中,运行过程正常,但是最后超时失败

排查思路
判断是否是作业超时。作业详情右上角可查看失败原因,若为Graph timeOut for executin xxx,则可以确认为作业超时失败。
解决方法
根据实际业务需要,在“创建作业”阶段,设置合适的超时时间,默认设置的超时时间为24小时(1440分钟),最大可设置为144000分钟,即作业运行至多100天。

场景3:作业投递后显示运行成功,但是根据日志分析作业有报错,也未能正确输出相关信息

排查思路
- 首先需要用户自行确认投递的作业是否会在控制台打印日志,如果是有重定向日志输出到具体文件,则此处无日志为正常现象。
- 子任务的事件中,确认作业子任务的实例是否有正常创建。
图4 子任务事件
- 查看子任务中实例的事件,查看实例是否有正常创建。
图5 子任务中实例的事件
解决方法
- 若子任务未正常创建,请联系服务技术支持解决。
- 若子任务正常创建,但是实例未正常创建,可以通过事件信息分析,常见有以下问题场景和对应解决方案。
- 0/4 nodes are available: XXX Insufficient cpu 或者 XXX Insufficient memory。该场景表示当前集群中无充足的计算资源,可以根据实际需要提前结束掉其他作业或notebook来释放资源,也可以进入资源订购页面管理集群购买新节点。
- 其他场景可以联系服务技术支持解决。
