[GRIFFIN-197] Treat non-existing YARN app as FAILED
This avoids jobs becoming stuck in UNKNOWN state on Service side.
Also, improves logging for YARN client errors.
Author: Nikolay Sokolov <chemikadze@gmail.com>
Closes #421 from chemikadze/GRIFFIN-197.
diff --git a/service/src/main/java/org/apache/griffin/core/util/YarnNetUtil.java b/service/src/main/java/org/apache/griffin/core/util/YarnNetUtil.java
index f935aad..71308ab 100644
--- a/service/src/main/java/org/apache/griffin/core/util/YarnNetUtil.java
+++ b/service/src/main/java/org/apache/griffin/core/util/YarnNetUtil.java
@@ -21,14 +21,17 @@
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
-
import org.apache.commons.lang.StringUtils;
import org.apache.griffin.core.job.entity.JobInstanceBean;
import org.apache.griffin.core.job.entity.LivySessionStates;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestTemplate;
+import static org.apache.griffin.core.job.entity.LivySessionStates.State.DEAD;
+
public class YarnNetUtil {
private static final Logger LOGGER = LoggerFactory
.getLogger(YarnNetUtil.class);
@@ -42,6 +45,9 @@
+ appId + "/state",
"{\"state\": \"KILLED\"}");
}
+ } catch (HttpClientErrorException e) {
+ LOGGER.warn("client error {} from yarn: {}",
+ e.getMessage(), e.getResponseBodyAsString());
} catch (Exception e) {
LOGGER.error("delete exception happens by yarn. {}", e);
}
@@ -56,6 +62,14 @@
instance.setState(LivySessionStates.toLivyState(state));
}
return true;
+ } catch (HttpClientErrorException e) {
+ LOGGER.warn("client error {} from yarn: {}",
+ e.getMessage(), e.getResponseBodyAsString());
+ if (e.getStatusCode() == HttpStatus.NOT_FOUND) {
+ // in sync with Livy behavior, see com.cloudera.livy.utils.SparkYarnApp
+ instance.setState(DEAD);
+ return true;
+ }
} catch (Exception e) {
LOGGER.error("update exception happens by yarn. {}", e);
}