You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jd...@apache.org on 2017/05/19 17:46:48 UTC

hive git commit: HIVE-13673: LLAP: handle case where no service instance is found on the host specified in the input split (Jason Dere, reviewed by Siddharth Seth)

Repository: hive
Updated Branches:
  refs/heads/master 04246db02 -> fa59d4753


HIVE-13673: LLAP: handle case where no service instance is found on the host specified in the input split (Jason Dere, reviewed by Siddharth Seth)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/fa59d475
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/fa59d475
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/fa59d475

Branch: refs/heads/master
Commit: fa59d47531edd3c7357c239046e9f72f3f3e0550
Parents: 04246db
Author: Jason Dere <jd...@hortonworks.com>
Authored: Fri May 19 10:46:13 2017 -0700
Committer: Jason Dere <jd...@hortonworks.com>
Committed: Fri May 19 10:46:13 2017 -0700

----------------------------------------------------------------------
 .../hadoop/hive/llap/LlapBaseInputFormat.java   | 24 +++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/fa59d475/llap-ext-client/src/java/org/apache/hadoop/hive/llap/LlapBaseInputFormat.java
----------------------------------------------------------------------
diff --git a/llap-ext-client/src/java/org/apache/hadoop/hive/llap/LlapBaseInputFormat.java b/llap-ext-client/src/java/org/apache/hadoop/hive/llap/LlapBaseInputFormat.java
index 15a81da..eb93241 100644
--- a/llap-ext-client/src/java/org/apache/hadoop/hive/llap/LlapBaseInputFormat.java
+++ b/llap-ext-client/src/java/org/apache/hadoop/hive/llap/LlapBaseInputFormat.java
@@ -29,7 +29,9 @@ import java.sql.DriverManager;
 import java.sql.ResultSet;
 import java.sql.Statement;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
+import java.util.Random;
 import java.util.Set;
 import java.util.concurrent.LinkedBlockingQueue;
 
@@ -94,6 +96,7 @@ public class LlapBaseInputFormat<V extends WritableComparable<?>>
   private String user; // "hive",
   private String pwd;  // ""
   private String query;
+  private final Random rand = new Random();
 
   public static final String URL_KEY = "llap.if.hs2.connection";
   public static final String QUERY_KEY = "llap.if.query";
@@ -101,6 +104,7 @@ public class LlapBaseInputFormat<V extends WritableComparable<?>>
   public static final String PWD_KEY = "llap.if.pwd";
 
   public final String SPLIT_QUERY = "select get_splits(\"%s\",%d)";
+  public static final ServiceInstance[] serviceInstanceArray = new ServiceInstance[0];
 
   public LlapBaseInputFormat(String url, String user, String pwd, String query) {
     this.url = url;
@@ -234,7 +238,11 @@ public class LlapBaseInputFormat<V extends WritableComparable<?>>
 
     ServiceInstance serviceInstance = getServiceInstanceForHost(registryService, host);
     if (serviceInstance == null) {
-      throw new IOException("No service instances found for " + host + " in registry");
+      LOG.info("No service instances found for " + host + " in registry.");
+      serviceInstance = getServiceInstanceRandom(registryService);
+      if (serviceInstance == null) {
+        throw new IOException("No service instances found in registry");
+      }
     }
 
     return serviceInstance;
@@ -272,6 +280,20 @@ public class LlapBaseInputFormat<V extends WritableComparable<?>>
     return serviceInstance;
   }
 
+
+  private ServiceInstance getServiceInstanceRandom(LlapRegistryService registryService) throws IOException {
+    ServiceInstanceSet instanceSet = registryService.getInstances();
+    ServiceInstance serviceInstance = null;
+
+    LOG.info("Finding random live service instance");
+    Collection<ServiceInstance> allInstances = instanceSet.getAll();
+    if (allInstances.size() > 0) {
+      int randIdx = rand.nextInt() % allInstances.size();
+      serviceInstance = allInstances.toArray(serviceInstanceArray)[randIdx];
+    }
+    return serviceInstance;
+  }
+
   private ServiceInstance selectServiceInstance(Set<ServiceInstance> serviceInstances) {
     if (serviceInstances == null || serviceInstances.isEmpty()) {
       return null;