You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tez.apache.org by hi...@apache.org on 2015/09/14 23:17:35 UTC

tez git commit: TEZ-2876. Tez UI: Update vertex, task & attempt details page while in progress. (Sreenath Somarajapuram via hitesh)

Repository: tez
Updated Branches:
  refs/heads/master b3ad59578 -> c4817a76b


TEZ-2876. Tez UI: Update vertex, task & attempt details page while in progress. (Sreenath Somarajapuram via hitesh)


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

Branch: refs/heads/master
Commit: c4817a76bda559eacd071e8f46ad4e351e8e8376
Parents: b3ad595
Author: Hitesh Shah <hi...@apache.org>
Authored: Mon Sep 14 14:17:06 2015 -0700
Committer: Hitesh Shah <hi...@apache.org>
Committed: Mon Sep 14 14:17:06 2015 -0700

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 +
 tez-ui/src/main/webapp/app/scripts/app.js       | 19 ++++++++
 .../controllers/task_attempt_controller.js      | 51 ++++++++++++++++++++
 .../app/scripts/controllers/task_controller.js  | 50 +++++++++++++++++++
 .../scripts/controllers/vertex_controller.js    | 47 ++++++++++++++++++
 .../app/scripts/models/TimelineRestAdapter.js   | 20 ++++++++
 .../src/main/webapp/app/scripts/models/dag.js   |  6 +++
 .../webapp/app/scripts/models/task_attempt.js   |  2 +
 tez-ui/src/main/webapp/app/scripts/router.js    | 38 +++++++++++++++
 tez-ui/src/main/webapp/app/styles/main.less     | 10 ++++
 .../main/webapp/app/templates/task/index.hbs    |  4 ++
 .../webapp/app/templates/taskAttempt/index.hbs  |  4 ++
 .../main/webapp/app/templates/vertex/index.hbs  |  4 ++
 13 files changed, 257 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tez/blob/c4817a76/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index e15b08d..fd43abe 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -7,6 +7,7 @@ Release 0.8.1: Unreleased
 INCOMPATIBLE CHANGES
 
 ALL CHANGES:
+  TEZ-2786. Tez UI: Update vertex, task & attempt details page while in progress.
   TEZ-2612. Support for showing allocation delays due to internal preemption
   TEZ-2808. Race condition between preemption and container assignment
   TEZ-2807. Log data in the finish event instead of the start event
@@ -176,6 +177,7 @@ Release 0.7.1: Unreleased
 INCOMPATIBLE CHANGES
 
 ALL CHANGES:
+  TEZ-2786. Tez UI: Update vertex, task & attempt details page while in progress.
   TEZ-2817. Tez UI: update in progress counter data for the dag vertices and tasks table
   TEZ-2813. Tez UI: add counter data for rest api calls to AM Web Services v2
   TEZ-2660. Tez UI: need to show application page even if system metrics publish is disabled.

http://git-wip-us.apache.org/repos/asf/tez/blob/c4817a76/tez-ui/src/main/webapp/app/scripts/app.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/scripts/app.js b/tez-ui/src/main/webapp/app/scripts/app.js
index 2ad5fdd..51d5ee8 100644
--- a/tez-ui/src/main/webapp/app/scripts/app.js
+++ b/tez-ui/src/main/webapp/app/scripts/app.js
@@ -242,6 +242,25 @@ App.ready = function () {
     }
   });
 
+  App.AttemptInfoAdapter = App.AMInfoAdapter.extend({
+    namespace: App.Configs.restNamespace.aminfoV2,
+    findQuery: function(store, type, query) {
+      var record = query.metadata;
+      delete query.metadata;
+      return this.ajax(
+        this.buildURL(Ember.String.pluralize(type.typeKey),
+          record.attemptID, Em.Object.create(record)), 'GET', { data: query});
+    },
+    buildURL: function(type, id, record) {
+      var url = this._super(type, undefined, record);
+      return url.replace('__app_id__', record.get('appID'))
+        .fmt(record.get('dagID'), record.get('taskID'), id, record.get('counters'));
+    },
+    pathForType: function(typeName) {
+      return 'attemptsInfo?dagID=%@&taskID=%@&attemptID=%@&counters=%@';
+    }
+  });
+
 };
 
 $.ajaxPrefilter(function(options, originalOptions, jqXHR) {

http://git-wip-us.apache.org/repos/asf/tez/blob/c4817a76/tez-ui/src/main/webapp/app/scripts/controllers/task_attempt_controller.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/scripts/controllers/task_attempt_controller.js b/tez-ui/src/main/webapp/app/scripts/controllers/task_attempt_controller.js
index ad8dccd..ebb8d32 100644
--- a/tez-ui/src/main/webapp/app/scripts/controllers/task_attempt_controller.js
+++ b/tez-ui/src/main/webapp/app/scripts/controllers/task_attempt_controller.js
@@ -23,6 +23,57 @@ App.TaskAttemptController = Em.ObjectController.extend(App.Helpers.DisplayHelper
 
   loading: true,
 
+  isActive: false,
+
+  pollster: App.Helpers.EntityArrayPollster.create(),
+
+  init: function () {
+    this._super();
+    this.get('pollster').setProperties({
+      entityType: 'attemptInfo',
+      mergeProperties: ['status', 'progress'],
+      store: this.get('store')
+    });
+  },
+
+  setup: function () {
+    this.set('isActive', true);
+  },
+  reset: function () {
+    this.set('isActive', false);
+  },
+
+  pollsterControl: function () {
+    if(this.get('task.vertex.dag.status') == 'RUNNING' &&
+        this.get('task.vertex.dag.amWebServiceVersion') != '1' &&
+        this.get('isActive')) {
+      this.get('pollster').start();
+    }
+    else {
+      this.get('pollster').stop();
+    }
+  }.observes('task.vertex.dag.status', 'task.vertex.dag.amWebServiceVersion', 'isActive'),
+
+  pollsterOptionsObserver: function () {
+    var model = this.get('model');
+
+    this.get('pollster').setProperties( (model && model.get('status') != 'SUCCEEDED') ? {
+      targetRecords: [model],
+      options: {
+        appID: this.get('task.vertex.dag.applicationId'),
+        dagID: App.Helpers.misc.getIndexFromId(this.get('dagID')),
+        attemptID: '%@_%@_%@'.fmt(
+          App.Helpers.misc.getIndexFromId(this.get('vertexID')),
+          App.Helpers.misc.getIndexFromId(this.get('taskID')),
+          App.Helpers.misc.getIndexFromId(this.get('id'))
+        )
+      }
+    } : {
+      targetRecords: [],
+      options: null
+    });
+  }.observes('task.vertex.dag.applicationId', 'status', 'dagID', 'vertexID', 'id'),
+
   loadAdditional: function(attempt) {
     var that = this;
 

http://git-wip-us.apache.org/repos/asf/tez/blob/c4817a76/tez-ui/src/main/webapp/app/scripts/controllers/task_controller.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/scripts/controllers/task_controller.js b/tez-ui/src/main/webapp/app/scripts/controllers/task_controller.js
index b95620a..8893c87 100644
--- a/tez-ui/src/main/webapp/app/scripts/controllers/task_controller.js
+++ b/tez-ui/src/main/webapp/app/scripts/controllers/task_controller.js
@@ -23,6 +23,56 @@ App.TaskController = Em.ObjectController.extend(App.Helpers.DisplayHelper, App.M
 
   loading: true,
 
+  isActive: false,
+
+  pollster: App.Helpers.EntityArrayPollster.create(),
+
+  init: function () {
+    this._super();
+    this.get('pollster').setProperties({
+      entityType: 'taskInfo',
+      mergeProperties: ['status', 'progress'],
+      store: this.get('store')
+    });
+  },
+
+  setup: function () {
+    this.set('isActive', true);
+  },
+  reset: function () {
+    this.set('isActive', false);
+  },
+
+  pollsterControl: function () {
+    if(this.get('vertex.dag.status') == 'RUNNING' &&
+        this.get('vertex.dag.amWebServiceVersion') != '1' &&
+        this.get('isActive')) {
+      this.get('pollster').start();
+    }
+    else {
+      this.get('pollster').stop();
+    }
+  }.observes('vertex.dag.status', 'vertex.dag.amWebServiceVersion', 'isActive'),
+
+  pollsterOptionsObserver: function () {
+    var model = this.get('model');
+
+    this.get('pollster').setProperties( (model && model.get('status') != 'SUCCEEDED') ? {
+      targetRecords: [model],
+      options: {
+        appID: this.get('vertex.dag.applicationId'),
+        dagID: App.Helpers.misc.getIndexFromId(this.get('dagID')),
+        taskID: '%@_%@'.fmt(
+          App.Helpers.misc.getIndexFromId(this.get('vertexID')),
+          App.Helpers.misc.getIndexFromId(this.get('id'))
+        )
+      }
+    } : {
+      targetRecords: [],
+      options: null
+    });
+  }.observes('vertex.dag.applicationId', 'status', 'dagID', 'vertexID', 'id'),
+
   loadAdditional: function(task) {
     var that = this;
     var applicationId = App.Helpers.misc.getAppIdFromVertexId(task.get('vertexID'));

http://git-wip-us.apache.org/repos/asf/tez/blob/c4817a76/tez-ui/src/main/webapp/app/scripts/controllers/vertex_controller.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/scripts/controllers/vertex_controller.js b/tez-ui/src/main/webapp/app/scripts/controllers/vertex_controller.js
index a4ba6e1..eeee1c9 100644
--- a/tez-ui/src/main/webapp/app/scripts/controllers/vertex_controller.js
+++ b/tez-ui/src/main/webapp/app/scripts/controllers/vertex_controller.js
@@ -22,12 +22,59 @@ App.VertexController = Em.ObjectController.extend(App.Helpers.DisplayHelper, App
   pageTitle: 'Vertex',
 
   loading: true,
+  isActive: false,
+
+  pollster: App.Helpers.EntityArrayPollster.create(),
+
+  init: function () {
+    this._super();
+    this.get('pollster').setProperties({
+      entityType: 'vertexInfo',
+      mergeProperties: ['status', 'progress'],
+      store: this.get('store')
+    });
+  },
+
+  setup: function () {
+    this.set('isActive', true);
+  },
+  reset: function () {
+    this.set('isActive', false);
+  },
+
+  pollsterControl: function () {
+    if(this.get('dag.status') == 'RUNNING' &&
+        this.get('dag.amWebServiceVersion') != '1' &&
+        this.get('isActive')) {
+      this.get('pollster').start();
+    }
+    else {
+      this.get('pollster').stop();
+    }
+  }.observes('dag.status', 'dag.amWebServiceVersion', 'isActive'),
+
+  pollsterOptionsObserver: function () {
+    var model = this.get('model');
+
+    this.get('pollster').setProperties( (model && model.get('status') != 'SUCCEEDED') ? {
+      targetRecords: [model],
+      options: {
+        appID: this.get('applicationId'),
+        dagID: App.Helpers.misc.getIndexFromId(this.get('dagID')),
+        vertexID: App.Helpers.misc.getIndexFromId(this.get('id'))
+      }
+    } : {
+      targetRecords: [],
+      options: null
+    });
+  }.observes('applicationId', 'status', 'dagID', 'id'),
 
   loadAdditional: function(vertex) {
     var loaders = [],
       that = this,
       applicationId = vertex.get('applicationId');
 
+    // Irrespective of am version this will get the progress first.
     if (vertex.get('status') == 'RUNNING') {
       var vertexIdx = vertex.get('id').split('_').splice(-1).pop();
       App.Helpers.misc.removeRecord(this.store, 'vertexProgress', vertexIdx);

http://git-wip-us.apache.org/repos/asf/tez/blob/c4817a76/tez-ui/src/main/webapp/app/scripts/models/TimelineRestAdapter.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/scripts/models/TimelineRestAdapter.js b/tez-ui/src/main/webapp/app/scripts/models/TimelineRestAdapter.js
index fce7ab1..c295366 100644
--- a/tez-ui/src/main/webapp/app/scripts/models/TimelineRestAdapter.js
+++ b/tez-ui/src/main/webapp/app/scripts/models/TimelineRestAdapter.js
@@ -165,6 +165,12 @@ var timelineJsonToTaskAttemptMap = {
   diagnostics: 'otherinfo.diagnostics',
   counterGroups: 'otherinfo.counters.counterGroups',
 
+  progress: {
+    custom: function(source) {
+      return Em.get(source, 'otherinfo.status') == 'SUCCEEDED' ? 1 : null;
+    }
+  },
+
   inProgressLog: 'otherinfo.inProgressLogsURL',
   completedLog: 'otherinfo.completedLogsURL',
 
@@ -225,6 +231,12 @@ var timelineJsonToVertexMap = {
   startTime: 'otherinfo.startTime',
   endTime: 'otherinfo.endTime',
 
+  progress: {
+    custom: function(source) {
+      return Em.get(source, 'otherinfo.status') == 'SUCCEEDED' ? 1 : null;
+    }
+  },
+
   status: 'otherinfo.status',
   hasFailedTaskAttempts: {
     custom: function(source) {
@@ -559,4 +571,12 @@ App.TaskInfoSerializer = DS.RESTSerializer.extend({
       taskInfo : rawPayload.tasks
     }
   }
+});
+
+App.AttemptInfoSerializer = DS.RESTSerializer.extend({
+  normalizePayload: function(rawPayload) {
+    return {
+      attemptInfo : rawPayload.attempts
+    }
+  }
 });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tez/blob/c4817a76/tez-ui/src/main/webapp/app/scripts/models/dag.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/scripts/models/dag.js b/tez-ui/src/main/webapp/app/scripts/models/dag.js
index 3e48cfe..7aa3915 100644
--- a/tez-ui/src/main/webapp/app/scripts/models/dag.js
+++ b/tez-ui/src/main/webapp/app/scripts/models/dag.js
@@ -441,6 +441,12 @@ App.TaskInfo = DS.Model.extend({
   counters: DS.attr('object')
 });
 
+App.AttemptInfo = DS.Model.extend({
+  progress: DS.attr('number'),
+  status: DS.attr('string'),
+  counters: DS.attr('object')
+});
+
 App.KVDatum = DS.Model.extend({
   key: DS.attr('string'),
   value: DS.attr('string'),

http://git-wip-us.apache.org/repos/asf/tez/blob/c4817a76/tez-ui/src/main/webapp/app/scripts/models/task_attempt.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/scripts/models/task_attempt.js b/tez-ui/src/main/webapp/app/scripts/models/task_attempt.js
index d8a48e6..888408d 100644
--- a/tez-ui/src/main/webapp/app/scripts/models/task_attempt.js
+++ b/tez-ui/src/main/webapp/app/scripts/models/task_attempt.js
@@ -22,6 +22,8 @@ App.TaskAttempt = App.AbstractEntity.extend({
     return id.indexOf(idPrefix) == 0 ? id.substr(idPrefix.length) : id;
   }.property('id'),
 
+  progress: DS.attr('number'),
+
   // start time of the entity
   startTime: DS.attr('number'),
 

http://git-wip-us.apache.org/repos/asf/tez/blob/c4817a76/tez-ui/src/main/webapp/app/scripts/router.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/scripts/router.js b/tez-ui/src/main/webapp/app/scripts/router.js
index a937387..88880e8 100644
--- a/tez-ui/src/main/webapp/app/scripts/router.js
+++ b/tez-ui/src/main/webapp/app/scripts/router.js
@@ -155,6 +155,9 @@ App.DagRoute = Em.Route.extend({
   setupController: setupControllerFactory('Dag: %@ (%@)', 'name', 'id'),
   resetController: function() {
     this.controller.dostopAMInfoUpdateService();
+    if(this.controller.reset) {
+      this.controller.reset();
+    }
   }
 });
 
@@ -182,6 +185,11 @@ App.TaskRoute = Em.Route.extend({
   afterModel: function(model) {
     return this.controllerFor('task').loadAdditional(model);
   },
+  resetController: function () {
+    if(this.controller.reset) {
+      this.controller.reset();
+    }
+  },
   setupController: setupControllerFactory('Task: %@', 'id')
 });
 
@@ -195,6 +203,11 @@ App.VertexRoute = Em.Route.extend({
   model: function(params) {
     return this.store.find('vertex', params.vertex_id);
   },
+  resetController: function () {
+    if(this.controller.reset) {
+      this.controller.reset();
+    }
+  },
   afterModel: function(model) {
     return this.controllerFor('vertex').loadAdditional(model);
   },
@@ -244,11 +257,21 @@ App.TaskAttemptRoute = Em.Route.extend({
   afterModel: function(model) {
     return this.controllerFor('task_attempt').loadAdditional(model);
   },
+  resetController: function () {
+    if(this.controller.reset) {
+      this.controller.reset();
+    }
+  },
   setupController: setupControllerFactory('Task Attempt: %@', 'id')
 });
 
 App.TaskAttemptsRoute = Em.Route.extend({
   renderTemplate: renderTable,
+  resetController: function () {
+    if(this.controller.reset) {
+      this.controller.reset();
+    }
+  },
   setupController: setupControllerFactory('Task Attempt: %@', 'id')
 });
 
@@ -267,11 +290,21 @@ App.TezAppRoute = Em.Route.extend({
       });
     });
   },
+  resetController: function () {
+    if(this.controller.reset) {
+      this.controller.reset();
+    }
+  },
   setupController: setupControllerFactory('Application: %@', 'id')
 });
 
 App.TezAppDagsRoute = Em.Route.extend({
   renderTemplate: renderTable,
+  resetController: function () {
+    if(this.controller.reset) {
+      this.controller.reset();
+    }
+  },
   setupController: setupControllerFactory()
 });
 
@@ -300,6 +333,11 @@ App.DagCountersRoute =
     App.TaskCountersRoute =
     App.TaskAttemptCountersRoute =
     Em.Route.extend({
+      resetController: function () {
+        if(this.controller.reset) {
+          this.controller.reset();
+        }
+      },
       renderTemplate: function() {
         this.render('common/counters');
       }

http://git-wip-us.apache.org/repos/asf/tez/blob/c4817a76/tez-ui/src/main/webapp/app/styles/main.less
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/styles/main.less b/tez-ui/src/main/webapp/app/styles/main.less
index fa8a124..51e28e8 100644
--- a/tez-ui/src/main/webapp/app/styles/main.less
+++ b/tez-ui/src/main/webapp/app/styles/main.less
@@ -358,6 +358,10 @@ body, html {
   table-layout: fixed;
   white-space: nowrap;
 
+  .progress {
+    margin-bottom: 0px;
+  }
+
   tr {
     margin: 0px 0px 0px 15px;
     overflow: hidden;
@@ -393,6 +397,12 @@ body, html {
     color: @success-color;
   }
 
+  &.schedule {
+    .fa-icon(history);
+    .fa-flip-horizontal;
+    color: @warning-color;
+  }
+
   &.running {
     .fa-icon(spinner);
     .fa-spin;

http://git-wip-us.apache.org/repos/asf/tez/blob/c4817a76/tez-ui/src/main/webapp/app/templates/task/index.hbs
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/templates/task/index.hbs b/tez-ui/src/main/webapp/app/templates/task/index.hbs
index f760797..30a0037 100644
--- a/tez-ui/src/main/webapp/app/templates/task/index.hbs
+++ b/tez-ui/src/main/webapp/app/templates/task/index.hbs
@@ -47,6 +47,10 @@
 					</td>
 				</tr>
 				<tr>
+					<td>Progress</td>
+					<td>{{bs-progress-animated progressDecimal=progress}}</td>
+				</tr>
+				<tr>
 					<td>{{t 'common.time.start'}}</td>
 					<td>{{formatUnixTimestamp startTime}}</td>
 				</tr>

http://git-wip-us.apache.org/repos/asf/tez/blob/c4817a76/tez-ui/src/main/webapp/app/templates/taskAttempt/index.hbs
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/templates/taskAttempt/index.hbs b/tez-ui/src/main/webapp/app/templates/taskAttempt/index.hbs
index ee6452b..346c44f 100644
--- a/tez-ui/src/main/webapp/app/templates/taskAttempt/index.hbs
+++ b/tez-ui/src/main/webapp/app/templates/taskAttempt/index.hbs
@@ -55,6 +55,10 @@
 					</td>
 				</tr>
 				<tr>
+					<td>Progress</td>
+					<td>{{bs-progress-animated progressDecimal=progress}}</td>
+				</tr>
+				<tr>
 					<td>{{t 'common.time.start'}}</td>
 					<td>{{formatUnixTimestamp startTime}}</td>
 				</tr>

http://git-wip-us.apache.org/repos/asf/tez/blob/c4817a76/tez-ui/src/main/webapp/app/templates/vertex/index.hbs
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/templates/vertex/index.hbs b/tez-ui/src/main/webapp/app/templates/vertex/index.hbs
index 56f4eb9..437b381 100644
--- a/tez-ui/src/main/webapp/app/templates/vertex/index.hbs
+++ b/tez-ui/src/main/webapp/app/templates/vertex/index.hbs
@@ -74,6 +74,10 @@
           </td>
         </tr>
         <tr>
+          <td>Progress</td>
+          <td>{{bs-progress-animated progressDecimal=progress}}</td>
+        </tr>
+        <tr>
           <td>{{t 'common.time.start'}}</td>
           <td>{{formatUnixTimestamp startTime}}</td>
         </tr>