You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by pa...@apache.org on 2017/01/20 10:21:34 UTC

ambari git commit: AMBARI-19582. Hive View 2.0: Show query logs (pallavkul)

Repository: ambari
Updated Branches:
  refs/heads/trunk 2c362fd0f -> a51532ac3


AMBARI-19582. Hive View 2.0: Show query logs (pallavkul)


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

Branch: refs/heads/trunk
Commit: a51532ac3c713906b956471bc54fd3d90df5ca7e
Parents: 2c362fd
Author: pallavkul <pa...@gmail.com>
Authored: Fri Jan 20 15:49:24 2017 +0530
Committer: pallavkul <pa...@gmail.com>
Committed: Fri Jan 20 15:51:25 2017 +0530

----------------------------------------------------------------------
 .../src/main/resources/ui/app/adapters/query.js |   6 +
 .../ui/app/components/query-result-log.js       |  28 ++++
 .../main/resources/ui/app/models/worksheet.js   |   5 +-
 .../resources/ui/app/routes/queries/query.js    | 150 +++++++++++++++----
 .../src/main/resources/ui/app/services/jobs.js  |  17 ++-
 .../src/main/resources/ui/app/services/query.js |  14 +-
 .../templates/components/query-result-log.hbs   |  23 +++
 .../ui/app/templates/queries/query.hbs          |  58 +++++--
 8 files changed, 245 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/a51532ac/contrib/views/hive20/src/main/resources/ui/app/adapters/query.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive20/src/main/resources/ui/app/adapters/query.js b/contrib/views/hive20/src/main/resources/ui/app/adapters/query.js
index a666b09..ccda9d4 100644
--- a/contrib/views/hive20/src/main/resources/ui/app/adapters/query.js
+++ b/contrib/views/hive20/src/main/resources/ui/app/adapters/query.js
@@ -39,6 +39,12 @@ export default ApplicationAdapter.extend({
     }
 
     return this.ajax(url, 'GET')
+  },
+
+  retrieveQueryLog(logFile){
+    let url = '';
+    url = this.buildURL().replace('/jobs','') + '/files' + logFile;
+    return this.ajax(url, 'GET')
   }
 
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/a51532ac/contrib/views/hive20/src/main/resources/ui/app/components/query-result-log.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive20/src/main/resources/ui/app/components/query-result-log.js b/contrib/views/hive20/src/main/resources/ui/app/components/query-result-log.js
new file mode 100644
index 0000000..9f8fbe1
--- /dev/null
+++ b/contrib/views/hive20/src/main/resources/ui/app/components/query-result-log.js
@@ -0,0 +1,28 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+  logResults:'',
+
+  selectedDatabase: Ember.computed('logResults', function() {
+    return this.get('logResults');
+  }),
+
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/a51532ac/contrib/views/hive20/src/main/resources/ui/app/models/worksheet.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive20/src/main/resources/ui/app/models/worksheet.js b/contrib/views/hive20/src/main/resources/ui/app/models/worksheet.js
index 59395e6..23f16b0 100644
--- a/contrib/views/hive20/src/main/resources/ui/app/models/worksheet.js
+++ b/contrib/views/hive20/src/main/resources/ui/app/models/worksheet.js
@@ -33,5 +33,8 @@ export default DS.Model.extend({
   hidePreviousButton: DS.attr('boolean', { defaultValue: true}),
   selectedTablesModels: DS.attr(),
   selectedMultiDb: DS.attr(),
-  queryFile: DS.attr('string', {defaultValue: ""})
+  queryFile: DS.attr('string', {defaultValue: ""}),
+  logFile: DS.attr('string', {defaultValue: ""}),
+  logResults: DS.attr('string', {defaultValue: ""})
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/a51532ac/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js
index 606b71a..2ecf967 100644
--- a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js
+++ b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js
@@ -81,10 +81,17 @@ export default Ember.Route.extend({
     controller.set('queryResult', model.get('queryResult'));
     controller.set('currentJobId', null);
 
+    controller.set('isJobSuccess', false);
+
     controller.set('isExportResultSuccessMessege', false);
     controller.set('isExportResultFailureMessege', false);
     controller.set('showSaveHdfsModal', false);
 
+    controller.set('logResults', model.get('logResults') || '');
+    controller.set('showQueryEditorLog', true);
+    controller.set('showQueryEditorResult', !controller.get('showQueryEditorLog'));
+
+
   },
 
 
@@ -160,20 +167,66 @@ export default Ember.Route.extend({
         "globalSettings":""};
 
       this.get('query').createJob(payload).then(function(data) {
-        // applying a timeout otherwise it goes for status code 409, although that condition is also handled in the code.
-        setTimeout(function(){
-          self.get('controller.model').set('currentJobData', data);
-          self.get('controller.model').set('queryFile', data.job.queryFile);
 
-          self.get('controller').set('currentJobId', data.job.id);
+        self.get('controller.model').set('currentJobData', data);
+        self.get('controller.model').set('queryFile', data.job.queryFile);
+        self.get('controller.model').set('logFile', data.job.logFile);
+        self.get('controller').set('currentJobId', data.job.id);
+
+        self.get('jobs').waitForJobToComplete(data.job.id, 5 * 1000)
+          .then((status) => {
+            Ember.run.later(() => {
+              self.get('controller').set('isJobSuccess', true);
+              self.send('getJob', data);
+
+              //Last log
+              self.send('fetchLogs');
+
+              //Open result tab and hide log tab
+              self.send('showQueryEditorResult');
+            }, 2 * 1000);
+          }, (error) => {
+            Ember.run.later(() => {
+              // TODO: handle error
+            }, 2 * 1000);
+          });
+
+        self.send('getLogsTillJobSuccess', data.job.id);
 
-          self.send('getJob', data);
-         }, 2000);
       }, function(reason) {
         console.log(reason);
       });
     },
 
+    getLogsTillJobSuccess(jobId){
+      let self = this;
+      this.get('jobs').waitForJobStatus(jobId)
+        .then((status) => {
+          console.log('status', status);
+          if(status !== "succeeded"){
+            self.send('fetchLogs');
+            Ember.run.later(() => {
+              self.send('getLogsTillJobSuccess',jobId )
+            }, 5 * 1000);
+          } else {
+            self.send('fetchLogs');
+          }
+        }, (error) => {
+          console.log('error',error);
+        });
+    },
+
+    fetchLogs(){
+      let self = this;
+
+      let logFile = this.get('controller.model').get('logFile');
+      this.get('query').retrieveQueryLog(logFile).then(function(data) {
+        self.get('controller.model').set('logResults', data.file.fileContent);
+      }, function(error){
+        console.log('error', error);
+      });
+    },
+
     getJob(data){
 
       var self = this;
@@ -206,6 +259,16 @@ export default Ember.Route.extend({
         console.log('reason' , reason);
         if( reason.errors[0].status == 409 ){
           setTimeout(function(){
+
+            //Put the code here for changing the log content.
+            let logFile = self.get('controller.model').get('logFile');
+            self.get('query').retrieveQueryLog(logFile).then(function(data) {
+              self.get('controller.model').set('logResults', data.file.fileContent);
+            }, function(error){
+              console.log('error', error);
+            });
+
+
             self.send('getJob',data);
           }, 2000);
         }
@@ -255,12 +318,12 @@ export default Ember.Route.extend({
           }
         });
       } else { //Pages from cache object
-          this.get('controller.model').set('currentPage', currentPage+1);
-          this.get('controller.model').set('previousPage', previousPage + 1 );
-          this.get('controller.model').set('nextPage', nextPage + 1);
-          this.get('controller.model').set('hidePreviousButton', false);
-          this.get('controller').set('queryResult', this.get('controller.model').get("jobData")[this.get('controller.model').get('currentPage')-1] );
-          this.get('controller.model').set('queryResult', this.get('controller.model').get("jobData")[this.get('controller.model').get('currentPage')-1] );
+        this.get('controller.model').set('currentPage', currentPage+1);
+        this.get('controller.model').set('previousPage', previousPage + 1 );
+        this.get('controller.model').set('nextPage', nextPage + 1);
+        this.get('controller.model').set('hidePreviousButton', false);
+        this.get('controller').set('queryResult', this.get('controller.model').get("jobData")[this.get('controller.model').get('currentPage')-1] );
+        this.get('controller.model').set('queryResult', this.get('controller.model').get("jobData")[this.get('controller.model').get('currentPage')-1] );
       }
     },
 
@@ -303,7 +366,6 @@ export default Ember.Route.extend({
       }
     },
 
-
     openWorksheetModal(){
       this.get('controller').set('showWorksheetModal', true);
     },
@@ -316,12 +378,14 @@ export default Ember.Route.extend({
       let selectedDb = this.get('controller.model').get('selectedDb');
       let owner = this.get('controller.model').get('owner');
       let queryFile = this.get('controller.model').get('queryFile');
+      let logFile = this.get('controller.model').get('logFile');
 
       let payload = {"title" : newTitle,
-                     "dataBase": selectedDb,
-                     "owner" : owner,
-                     "shortQuery" : (currentQuery.length > 0) ? currentQuery : ";",
-                     "queryFile" : queryFile };
+        "dataBase": selectedDb,
+        "owner" : owner,
+        "shortQuery" : (currentQuery.length > 0) ? currentQuery : ";",
+        "queryFile" : queryFile,
+        "logFile" : logFile};
 
       this.get('savedQueries').saveQuery(payload)
         .then((data) => {
@@ -351,25 +415,25 @@ export default Ember.Route.extend({
       console.log('saveToHDFS query route with path == ', path);
 
       this.get('query').saveToHDFS(jobId, path)
-         .then((data) => {
-           console.log('successfully saveToHDFS', data);
-           this.get('controller').set('isExportResultSuccessMessege', true);
-           this.get('controller').set('isExportResultFailureMessege', false);
+        .then((data) => {
+          console.log('successfully saveToHDFS', data);
+          this.get('controller').set('isExportResultSuccessMessege', true);
+          this.get('controller').set('isExportResultFailureMessege', false);
 
-           Ember.run.later(() => {
-             this.get('controller').set('showSaveHdfsModal', false);
-           }, 2 * 1000);
+          Ember.run.later(() => {
+            this.get('controller').set('showSaveHdfsModal', false);
+          }, 2 * 1000);
 
-          }, (error) => {
-            console.log("Error encountered", error);
-            this.get('controller').set('isExportResultFailureMessege', true);
-            this.get('controller').set('isExportResultSuccessMessege', false);
+        }, (error) => {
+          console.log("Error encountered", error);
+          this.get('controller').set('isExportResultFailureMessege', true);
+          this.get('controller').set('isExportResultSuccessMessege', false);
 
-            Ember.run.later(() => {
-               this.get('controller').set('showSaveHdfsModal', false);
-             }, 2 * 1000);
+          Ember.run.later(() => {
+            this.get('controller').set('showSaveHdfsModal', false);
+          }, 2 * 1000);
 
-          });
+        });
     },
 
     downloadAsCsv(jobId, path){
@@ -382,6 +446,26 @@ export default Ember.Route.extend({
       this.get('controller').set('showDownloadCsvModal', false);
       window.open(downloadAsCsvUrl);
 
+    },
+
+    showQueryEditorLog(){
+      this.get('controller').set('showQueryEditorLog', true);
+      this.get('controller').set('showQueryEditorResult', false);
+
+      $('.log-list-anchor').addClass('active');
+      $('.log-list').addClass('active');
+      $('.editor-result-list-anchor').removeClass('active');
+      $('.editor-result-list').removeClass('active');
+    },
+
+    showQueryEditorResult(){
+      this.get('controller').set('showQueryEditorLog', false);
+      this.get('controller').set('showQueryEditorResult', true);
+
+      $('.log-list-anchor').removeClass('active');
+      $('.log-list').removeClass('active');
+      $('.editor-result-list-anchor').addClass('active');
+      $('.editor-result-list').addClass('active');
     }
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/a51532ac/contrib/views/hive20/src/main/resources/ui/app/services/jobs.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive20/src/main/resources/ui/app/services/jobs.js b/contrib/views/hive20/src/main/resources/ui/app/services/jobs.js
index 723953c..ca058f2 100644
--- a/contrib/views/hive20/src/main/resources/ui/app/services/jobs.js
+++ b/contrib/views/hive20/src/main/resources/ui/app/services/jobs.js
@@ -33,10 +33,9 @@ export default Ember.Service.extend({
           .then((job) => {
             let status = job.get('status').toLowerCase();
             if (status === 'succeeded') {
-              this._fetchDummyResult(jobId);
-              resolve();
+              resolve(status);
             } else if (status === 'error') {
-              reject()
+              reject(status)
             } else {
               resolve(this.waitForJobToComplete(jobId, after));
             }
@@ -47,8 +46,16 @@ export default Ember.Service.extend({
     });
   },
 
-  _fetchDummyResult(jobId) {
-    this.get('store').adapterFor('job').fetchResult(jobId);
+  waitForJobStatus: function (jobId) {
+    return new Ember.RSVP.Promise((resolve, reject) => {
+      this.get('store').findRecord('job', jobId, {reload: true})
+        .then((job) => {
+          let status = job.get('status').toLowerCase();
+          resolve(status);
+        }, (error) => {
+          reject(error);
+        });
+    });
   }
 
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/a51532ac/contrib/views/hive20/src/main/resources/ui/app/services/query.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive20/src/main/resources/ui/app/services/query.js b/contrib/views/hive20/src/main/resources/ui/app/services/query.js
index 400f78b..1799f71 100644
--- a/contrib/views/hive20/src/main/resources/ui/app/services/query.js
+++ b/contrib/views/hive20/src/main/resources/ui/app/services/query.js
@@ -53,10 +53,22 @@ export default Ember.Service.extend({
     });
   },
 
-
   downloadAsCsv(jobId, path){
     let self = this;
     return this.get('store').adapterFor('job').downloadAsCsv(jobId, path);
+  },
+
+  retrieveQueryLog(logFile){
+
+    let self = this;
+    return new Promise( (resolve, reject) => {
+      this.get('store').adapterFor('query').retrieveQueryLog(logFile).then(function(data) {
+        resolve(data);
+      }, function(err) {
+        reject(err);
+      });
+    });
+
 
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/a51532ac/contrib/views/hive20/src/main/resources/ui/app/templates/components/query-result-log.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/hive20/src/main/resources/ui/app/templates/components/query-result-log.hbs b/contrib/views/hive20/src/main/resources/ui/app/templates/components/query-result-log.hbs
new file mode 100644
index 0000000..3903473
--- /dev/null
+++ b/contrib/views/hive20/src/main/resources/ui/app/templates/components/query-result-log.hbs
@@ -0,0 +1,23 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+<div style="height: 70vh">
+    <pre class="prettyprint">{{logResults}}</pre>
+</div>
+
+{{yield}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/a51532ac/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query.hbs b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query.hbs
index 2138356..950e4f3 100644
--- a/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query.hbs
+++ b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query.hbs
@@ -35,23 +35,49 @@
         {{/if}}
       </div>
     </div>
-    <div class="clearfix row query-editor-results" style="position: relative">
-      {{query-result-table
-      queryResult=queryResult
-      jobId=currentJobId
-      updateQuery='updateQuery'
-      previousPage=worksheet.previousPage
-      hidePreviousButton=hidePreviousButton
-      goNextPage='goNextPage'
-      goPrevPage='goPrevPage'
-      expandQueryResultPanel='expandQueryResultPanel'
-      saveToHDFS='saveToHDFS'
-      downloadAsCsv='downloadAsCsv'
-      isExportResultSuccessMessege=isExportResultSuccessMessege
-      isExportResultFailureMessege=isExportResultFailureMessege
-      showSaveHdfsModal=showSaveHdfsModal
-      }}
+
+
+    <div>
+      <ul class="row nav nav-tabs inverse">
+        <li class="log-list active">
+          <a href="javascript:void(0)" class="log-list-anchor active" {{action 'showQueryEditorLog' }}>
+            <i id="ember855" aria-hidden="true" class="fa fa-list"><!----></i>&nbsp;&nbsp;LOG
+          </a>
+        </li>
+        <li class="editor-result-list">
+          <a href="javascript:void(0)" class="editor-result-list-anchor" {{action 'showQueryEditorResult' }}>
+            <i id="ember866" aria-hidden="true" class="fa fa-file-text-o"><!----></i>&nbsp;&nbsp;RESULT
+          </a>
+        </li>
+      </ul>
     </div>
+
+    {{#if showQueryEditorLog}}
+      <div class="clearfix row query-editor-log" >
+        {{query-result-log logResults=worksheet.logResults }}
+      </div>
+    {{/if}}
+
+    {{#if showQueryEditorResult}}
+      <div class="clearfix row query-editor-results" >
+        {{query-result-table
+        queryResult=queryResult
+        jobId=currentJobId
+        updateQuery='updateQuery'
+        previousPage=worksheet.previousPage
+        hidePreviousButton=hidePreviousButton
+        goNextPage='goNextPage'
+        goPrevPage='goPrevPage'
+        expandQueryResultPanel='expandQueryResultPanel'
+        saveToHDFS='saveToHDFS'
+        downloadAsCsv='downloadAsCsv'
+        isExportResultSuccessMessege=isExportResultSuccessMessege
+        isExportResultFailureMessege=isExportResultFailureMessege
+        showSaveHdfsModal=showSaveHdfsModal
+        }}
+      </div>
+    {{/if}}
+
   </div>
 </div>