Browse Source

HUE-4908 [metastore] Support displaying Kudu tables

They are Impala only currently
Romain Rigaux 9 years ago
parent
commit
c001d105a9

+ 3 - 0
apps/beeswax/src/beeswax/api.py

@@ -634,6 +634,9 @@ def get_sample_data(request, database, table, column=None):
 
 def _get_sample_data(db, database, table, column):
   table_obj = db.get_table(database, table)
+  if table_obj.is_impala_only and db.client.query_server['server_name'] != 'impala':
+    query_server = get_query_server_config('impala')
+    db = dbms.get(db.client.user, query_server)
   sample_data = db.get_sample(database, table_obj, column)
   response = {'status': -1}
 

+ 12 - 2
apps/beeswax/src/beeswax/server/dbms.py

@@ -199,8 +199,18 @@ class HiveServer2Dbms(object):
 
 
   def get_table(self, database, table_name):
-    return self.client.get_table(database, table_name)
-
+    try:
+      return self.client.get_table(database, table_name)
+    except QueryServerException, e:
+      LOG.debug("Seems like %s.%s is a Kudu table" % (database, table_name))
+      if 'java.lang.ClassNotFoundException' in e.message:
+        query_server = get_query_server_config('impala')
+        db = get(self.client.user, query_server)
+        table = db.get_table(database, table_name)
+        table.is_impala_only = True
+        return table
+      else:
+        raise e
 
   def alter_table(self, database, table_name, new_table_name=None, comment=None, tblproperties=None):
     hql = 'ALTER TABLE `%s`.`%s`' % (database, table_name)

+ 2 - 1
apps/beeswax/src/beeswax/server/hive_server2_lib.py

@@ -802,7 +802,7 @@ class HiveServerClient:
         (desc_results, desc_schema), operation_handle = self.execute_statement('USE `%s`' % database)
         self.close_operation(operation_handle)
         if partition_spec:
-          query = 'DESCRIBE FORMATTED ``%s` PARTITION(%s)' % (table_name, partition_spec)
+          query = 'DESCRIBE FORMATTED `%s` PARTITION(%s)' % (table_name, partition_spec)
         else:
           query = 'DESCRIBE FORMATTED `%s`' % table_name
         (desc_results, desc_schema), operation_handle = self.execute_statement(query, max_rows=10000, orientation=TFetchOrientation.FETCH_NEXT)
@@ -1028,6 +1028,7 @@ class HiveServerTableCompatible(HiveServerTable):
 
     self.describe = HiveServerTTableSchema(self.desc_results, self.desc_schema).cols()
     self._details = None
+    self.is_impala_only = False
 
   @property
   def cols(self):

+ 1 - 1
apps/impala/src/impala/server.py

@@ -23,7 +23,7 @@ from desktop.lib.rest.http_client import HttpClient
 from desktop.lib.rest.resource import Resource
 
 from beeswax.server.dbms import QueryServerException
-from beeswax.server.hive_server2_lib import HiveServerClient, HiveServerDataTable
+from beeswax.server.hive_server2_lib import HiveServerClient
 
 from ImpalaService import ImpalaHiveServer2Service
 

+ 5 - 3
apps/metastore/src/metastore/views.py

@@ -36,7 +36,7 @@ from metadata.conf import has_optimizer, has_navigator, get_optimizer_url, get_n
 from beeswax.design import hql_query
 from beeswax.models import SavedQuery, MetaInstall
 from beeswax.server import dbms
-from beeswax.server.dbms import get_query_server_config
+from beeswax.server.dbms import get_query_server_config, QueryServerException
 from filebrowser.views import location_to_url
 from metastore.forms import LoadDataForm, DbForm
 from metastore.settings import DJANGO_APPS
@@ -230,9 +230,11 @@ def get_table_metadata(request, database, table):
       'hdfs_link': table_metadata.hdfs_link,
       'is_view': table_metadata.is_view
     }
-  except Exception, ex:
+  except:
+    msg = "Cannot get metadata for table: `%s`.`%s`"
+    LOG.exception(msg) % (database, table)
     response['status'] = 1
-    response['data'] = _("Cannot get metadata for table: `%s`.`%s`") % (database, table)
+    response['data'] = _(msg) % (database, table)
 
   return JsonResponse(response)
 

+ 3 - 0
desktop/libs/indexer/src/indexer/api3.py

@@ -225,6 +225,9 @@ def _create_table(request, source, destination):
       PRIMARY KEY (%(primary_keys)s)
       DISTRIBUTE BY HASH INTO 16 BUCKETS
       STORED AS %(file_format)s
+      TBLPROPERTIES(
+      'kudu.num_tablet_replicas' = '1'
+      )
       AS SELECT %(columns_list)s
       FROM `%(database)s`.`%(table_name)s`;''' % {
         'database': database,