问题描述
spark作业使用airflow调度,运行在k8s集群上,如果作业运行时间长超过一小时(甚至更短)则会出现too old Resource问题,造成airflow的hook无法正确判断作业运行完成的状态,然后重试作业。
airflow 是根据返回的日志中exit number部分,number = 0 则是成功。
问题重现
写了一个简单的spark作业,传入一个参数用来接收时间参数,休息多长分钟,然后退出,直接spark submit 会发现一直处在Running状态,即使最后作业已经完成了,客户端的监控其实已经停止在运行状态了。
查找资料找到
https://issues.apache.org/jira/browse/SPARK-24266
https://github.com/fabric8io/kubernetes-client/issues/1075
测试:
1. 对 k8s client ,spark k8s 相关代码 只添加日志,不修改任何内容 ,重新打包制作镜像
2. 只注释掉去k8s api server 取数据的url 去掉resourceVersion参数 这也是chenchun的建议
3. spark k8s端修改 如果获取到HTTP_GONE的错误 忽略掉 重新监控
第一次尝试是在onClose的时候,判断如果是HTTP_GONE的错误,我就忽略掉,
但是好像后面监控还是断掉了,所以spark提交patch的那个人还是重新watch了,
否则问题就还是在?
1, 不让kubernetes client 端扔出异常?
2, 扔出异常后,重新监控?
仍然没有测试成功,现在测试成功的只有第二条,即去掉resourceVersion,这样就不会扔出too old resource 异常信息。
经测试,暂时只有注释掉resourceVersion的方式可以正常返回状态。