hive_job_details_view.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. /**
  2. * Licensed to the Apache Software Foundation (ASF) under one or more
  3. * contributor license agreements. See the NOTICE file distributed with this
  4. * work for additional information regarding copyright ownership. The ASF
  5. * licenses this file to you under the Apache License, Version 2.0 (the
  6. * "License"); you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  13. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  14. * License for the specific language governing permissions and limitations under
  15. * the License.
  16. */
  17. var App = require('app');
  18. var date = require('utils/date');
  19. var numberUtils = require('utils/number_utils');
  20. var dateUtils = require('utils/date');
  21. var stringUtils = require('utils/string_utils');
  22. var sort = require('views/common/sort_view');
  23. App.MainHiveJobDetailsView = Em.View.extend({
  24. templateName : require('templates/main/jobs/hive_job_details'),
  25. selectedVertex : null,
  26. content : null,
  27. zoomScaleFrom : 1,
  28. zoomScaleTo: 2,
  29. zoomScale : 1,
  30. zoomStep : function() {
  31. var zoomStep = 0.01;
  32. var zoomFrom = this.get('zoomScaleFrom');
  33. var zoomTo = this.get('zoomScaleTo');
  34. if (zoomFrom < zoomTo) {
  35. zoomStep = (zoomTo - zoomFrom) / 5;
  36. }
  37. return zoomStep;
  38. }.property('zoomScaleFrom', 'zoomScaleTo'),
  39. isGraphMaximized: false,
  40. showQuery : false,
  41. toggleShowQuery : function () {
  42. this.toggleProperty('showQuery');
  43. },
  44. toggleShowQueryText : function () {
  45. return this.get('showQuery') ? Em.I18n.t('jobs.hive.less') : Em.I18n.t('jobs.hive.more');
  46. }.property('showQuery'),
  47. summaryMetricType: 'input',
  48. summaryMetricTypesDisplay : [ Em.I18n.t('jobs.hive.tez.metric.input'), Em.I18n.t('jobs.hive.tez.metric.output'), Em.I18n.t('jobs.hive.tez.metric.recordsRead'),
  49. Em.I18n.t('jobs.hive.tez.metric.recordsWrite'), Em.I18n.t('jobs.hive.tez.metric.tezTasks') ],
  50. summaryMetricTypeDisplay: function(){
  51. return Em.I18n.t('jobs.hive.tez.metric.'+this.get('summaryMetricType'));
  52. }.property('summaryMetricType'),
  53. sortedVertices : function() {
  54. var sortColumn = this.get('controller.sortingColumn');
  55. if(sortColumn && sortColumn.get('status')){
  56. var sortColumnStatus = sortColumn.get('status');
  57. var sorted = sortColumn.get('parentView').sort(sortColumn, sortColumnStatus === "sorting_desc", true);
  58. sortColumn.set('status', sortColumnStatus);
  59. return sorted;
  60. }
  61. var vertices = this.get('controller.content.tezDag.vertices');
  62. if (vertices != null) {
  63. vertices = vertices.toArray();
  64. return vertices;
  65. }
  66. return vertices;
  67. }.property('content.tezDag.vertices','controller.sortingColumn'),
  68. initialDataLoaded : function() {
  69. var loaded = this.get('controller.loaded');
  70. if (loaded) {
  71. this.set('content', this.get('controller.content'));
  72. }
  73. }.observes('controller.loaded'),
  74. jobObserver : function() {
  75. var content = this.get('content');
  76. var selectedVertex = this.get('selectedVertex');
  77. if (selectedVertex == null && content != null) {
  78. var vertices = content.get('tezDag.vertices');
  79. if (vertices) {
  80. vertices.setEach('isSelected', false);
  81. this.doSelectVertex({
  82. context : vertices.objectAt(0)
  83. });
  84. }
  85. }
  86. }.observes('selectedVertex', 'content.tezDag.vertices.@each.id'),
  87. doSelectVertex : function(event) {
  88. var newVertex = event.context;
  89. var currentVertex = this.get('selectedVertex');
  90. if (currentVertex != null) {
  91. currentVertex.set('isSelected', false);
  92. }
  93. newVertex.set('isSelected', true);
  94. this.set('selectedVertex', newVertex);
  95. },
  96. doSelectSummaryMetricType: function(event) {
  97. var summaryType = event.context;
  98. switch (summaryType) {
  99. case Em.I18n.t('jobs.hive.tez.metric.input'):
  100. summaryType = 'input';
  101. break;
  102. case Em.I18n.t('jobs.hive.tez.metric.output'):
  103. summaryType = 'output';
  104. break;
  105. case Em.I18n.t('jobs.hive.tez.metric.recordsRead'):
  106. summaryType = 'recordsRead';
  107. break;
  108. case Em.I18n.t('jobs.hive.tez.metric.recordsWrite'):
  109. summaryType = 'recordsWrite';
  110. break;
  111. case Em.I18n.t('jobs.hive.tez.metric.tezTasks'):
  112. summaryType = 'tezTasks';
  113. break;
  114. default:
  115. break;
  116. }
  117. this.set('summaryMetricType', summaryType);
  118. },
  119. /**
  120. * Provides display information for vertex I/O.
  121. *
  122. * {
  123. * 'file': {
  124. * 'read': {
  125. * 'ops': '100 reads',
  126. * 'bytes': '10 MB'
  127. * }
  128. * 'write: {
  129. * 'ops': '200 writes',
  130. * 'bytes': '20 MB'
  131. * }
  132. * },
  133. * 'hdfs': {
  134. * 'read': {
  135. * 'ops': '100 reads',
  136. * 'bytes': '10 MB'
  137. * }
  138. * 'write: {
  139. * 'ops': '200 writes',
  140. * 'bytes': '20 MB'
  141. * }
  142. * },
  143. * 'records': {
  144. * 'read': '100 records',
  145. * 'write': '123 records'
  146. * },
  147. * 'started': 'Feb 12, 2014 10:30am',
  148. * 'ended': 'Feb 12, 2014 10:35am',
  149. * 'status': 'Running'
  150. * }
  151. */
  152. selectedVertexIODisplay : function() {
  153. var v = this.get('selectedVertex');
  154. var status = v.get('state');
  155. if (status) {
  156. status = stringUtils.getCamelCase(status);
  157. }
  158. var fileReadOps = v.get('fileReadOps');
  159. var fileWriteOps = v.get('fileWriteOps');
  160. var hdfsReadOps = v.get('hdfsReadOps');
  161. var hdfsWriteOps = v.get('hdfsWriteOps');
  162. var naString = Em.I18n.t('common.na');
  163. if (fileReadOps === null) {
  164. fileReadOps = naString;
  165. }
  166. if (fileWriteOps === null) {
  167. fileWriteOps = naString;
  168. }
  169. if (hdfsReadOps === null) {
  170. hdfsReadOps = naString;
  171. }
  172. if (hdfsWriteOps === null) {
  173. hdfsWriteOps = naString;
  174. }
  175. return {
  176. file : {
  177. read : {
  178. ops : Em.I18n.t('jobs.hive.tez.reads').format(fileReadOps),
  179. bytes : numberUtils.bytesToSize(v.get('fileReadBytes'))
  180. },
  181. write : {
  182. ops : Em.I18n.t('jobs.hive.tez.writes').format(fileWriteOps),
  183. bytes : numberUtils.bytesToSize(v.get('fileWriteBytes'))
  184. }
  185. },
  186. hdfs : {
  187. read : {
  188. ops : Em.I18n.t('jobs.hive.tez.reads').format(hdfsReadOps),
  189. bytes : numberUtils.bytesToSize(v.get('hdfsReadBytes'))
  190. },
  191. write : {
  192. ops : Em.I18n.t('jobs.hive.tez.writes').format(hdfsWriteOps),
  193. bytes : numberUtils.bytesToSize(v.get('hdfsWriteBytes'))
  194. }
  195. },
  196. records : {
  197. read : v.get('recordReadCount') == null ? null : Em.I18n.t('jobs.hive.tez.records.count').format(v.get('recordReadCount')),
  198. write : v.get('recordWriteCount') == null ? null : Em.I18n.t('jobs.hive.tez.records.count').format(v.get('recordWriteCount'))
  199. },
  200. started: v.get('startTime') ? dateUtils.dateFormat(v.get('startTime')) : '',
  201. ended: v.get('endTime') ? dateUtils.dateFormat(v.get('endTime')) : '',
  202. status: status
  203. };
  204. }.property('selectedVertex.fileReadOps', 'selectedVertex.fileWriteOps', 'selectedVertex.hdfsReadOps', 'selectedVertex.hdfdWriteOps',
  205. 'selectedVertex.fileReadBytes', 'selectedVertex.fileWriteBytes', 'selectedVertex.hdfsReadBytes', 'selectedVertex.hdfdWriteBytes',
  206. 'selectedVertex.recordReadCount', 'selectedVertex.recordWriteCount', 'selectedVertex.status'),
  207. canGraphZoomIn : function() {
  208. var zoomTo = this.get('zoomScaleTo');
  209. var zoomScale = this.get('zoomScale');
  210. console.debug("canGraphZoomIn? : ", (zoomScale < zoomTo), " (scaleTo=", zoomTo,", scale=",zoomScale,")");
  211. return zoomScale < zoomTo;
  212. }.property('zoomScale', 'zoomScaleTo'),
  213. canGraphZoomOut : function() {
  214. var zoomFrom = this.get('zoomScaleFrom');
  215. var zoomScale = this.get('zoomScale');
  216. console.debug("canGraphZoomOut? : ", (zoomScale > zoomFrom), " (scaleFrom=", zoomFrom,", scale=",zoomScale,")");
  217. return zoomScale > zoomFrom;
  218. }.property('zoomScale', 'zoomScaleFrom'),
  219. doGraphZoomIn: function() {
  220. var zoomTo = this.get('zoomScaleTo');
  221. var zoomScale = this.get('zoomScale');
  222. var zoomStep = this.get('zoomStep');
  223. if (zoomScale < zoomTo) {
  224. var step = Math.min(zoomStep, (zoomTo - zoomScale));
  225. zoomScale += step;
  226. console.debug("doGraphZoomIn(): New scale = ", zoomScale);
  227. this.set('zoomScale', zoomScale);
  228. }
  229. },
  230. doGraphZoomOut: function() {
  231. var zoomFrom = this.get('zoomScaleFrom');
  232. var zoomScale = this.get('zoomScale');
  233. var zoomStep = this.get('zoomStep');
  234. if (zoomScale > zoomFrom) {
  235. var step = Math.min(zoomStep, (zoomScale - zoomFrom));
  236. zoomScale -= step;
  237. console.debug("doGraphZoomOut(): New scale = ", zoomScale);
  238. this.set('zoomScale', zoomScale);
  239. }
  240. },
  241. doGraphMaximize: function() {
  242. this.set('isGraphMaximized', true);
  243. },
  244. doGraphMinimize: function() {
  245. this.set('isGraphMaximized', false);
  246. }
  247. });
  248. App.MainHiveJobDetailsVerticesTableView = App.TableView.extend({
  249. sortView: sort.wrapperView,
  250. didInsertElement: function () {
  251. if(!this.get('controller.sortingColumn')){
  252. var columns = this.get('childViews')[0].get('childViews')
  253. if(columns && columns.findProperty('name', 'name')){
  254. columns.findProperty('name','name').set('status', 'sorting_asc');
  255. this.get('controller').set('sortingColumn', columns.findProperty('name','name'))
  256. }
  257. }
  258. },
  259. nameSort: sort.fieldView.extend({
  260. column: 0,
  261. name: 'name',
  262. displayName: Em.I18n.t('common.name'),
  263. type: 'string'
  264. }),
  265. tasksSort: sort.fieldView.extend({
  266. column: 1,
  267. name: 'tasksNumber',
  268. displayName: Em.I18n.t('common.tasks'),
  269. type: 'number'
  270. }),
  271. inputSort: sort.fieldView.extend({
  272. column: 2,
  273. name: 'totalReadBytesDisplay',
  274. displayName: Em.I18n.t('apps.item.dag.input'),
  275. type: 'number'
  276. }),
  277. outputSort: sort.fieldView.extend({
  278. column: 3,
  279. name: 'totalWriteBytesDisplay',
  280. displayName: Em.I18n.t('apps.item.dag.output'),
  281. type: 'number'
  282. }),
  283. durationSort: sort.fieldView.extend({
  284. column: 4,
  285. name: 'durationDisplay',
  286. displayName: Em.I18n.t('apps.item.dag.duration'),
  287. type: 'number'
  288. })
  289. });