[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);
         }