hive_job_details_view.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  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 : [
  49. Em.I18n.t('jobs.hive.tez.metric.input'),
  50. Em.I18n.t('jobs.hive.tez.metric.output'),
  51. /* Em.I18n.t('jobs.hive.tez.metric.recordsRead'),
  52. Em.I18n.t('jobs.hive.tez.metric.recordsWrite'), */
  53. Em.I18n.t('jobs.hive.tez.metric.tezTasks'),
  54. Em.I18n.t('jobs.hive.tez.metric.spilledRecords')
  55. ],
  56. summaryMetricTypeDisplay: function(){
  57. return Em.I18n.t('jobs.hive.tez.metric.'+this.get('summaryMetricType'));
  58. }.property('summaryMetricType'),
  59. sortedVertices : function() {
  60. var sortColumn = this.get('controller.sortingColumn');
  61. if(sortColumn && sortColumn.get('status')){
  62. var sortColumnStatus = sortColumn.get('status');
  63. var sorted = sortColumn.get('parentView').sort(sortColumn, sortColumnStatus === "sorting_desc", true);
  64. sortColumn.set('status', sortColumnStatus);
  65. return sorted;
  66. }
  67. var vertices = this.get('controller.content.tezDag.vertices');
  68. if (vertices != null) {
  69. vertices = vertices.toArray();
  70. return vertices;
  71. }
  72. return vertices;
  73. }.property('content.tezDag.vertices','controller.sortingColumn'),
  74. initialDataLoaded : function() {
  75. var loaded = this.get('controller.loaded');
  76. if (loaded) {
  77. this.set('content', this.get('controller.content'));
  78. }
  79. }.observes('controller.loaded'),
  80. yarnApplicationIdLink : function() {
  81. var yarnService = App.YARNService.find().objectAt(0);
  82. var appId = this.get('content.tezDag.yarnApplicationId');
  83. if (yarnService != null) {
  84. var quickLinksView = App.QuickViewLinks.create();
  85. try {
  86. quickLinksView.set('content', yarnService);
  87. quickLinksView.setQuickLinks();
  88. var links = quickLinksView.get('quickLinks');
  89. if (links && links.length > 0) {
  90. var rmUILink = links.findProperty('label', 'ResourceManager UI');
  91. if (rmUILink != null) {
  92. return rmUILink.get('url') + '/cluster/app/' + appId;
  93. }
  94. }
  95. } finally {
  96. quickLinksView.destroy();
  97. quickLinksView = null;
  98. }
  99. }
  100. return null;
  101. }.property('content.tezDag.yarnApplicationId', 'App.YARNService.resourceManagerNode.hostName'),
  102. jobObserver : function() {
  103. var content = this.get('content');
  104. var selectedVertex = this.get('selectedVertex');
  105. if (selectedVertex == null && content != null) {
  106. var vertices = content.get('tezDag.vertices');
  107. if (vertices) {
  108. vertices.setEach('isSelected', false);
  109. this.doSelectVertex({
  110. context : vertices.objectAt(0)
  111. });
  112. }
  113. }
  114. }.observes('selectedVertex', 'content.tezDag.vertices.@each.id'),
  115. doSelectVertex : function(event) {
  116. var newVertex = event.context;
  117. var currentVertex = this.get('selectedVertex');
  118. if (currentVertex != null) {
  119. currentVertex.set('isSelected', false);
  120. }
  121. newVertex.set('isSelected', true);
  122. this.set('selectedVertex', newVertex);
  123. },
  124. doSelectSummaryMetricType: function(event) {
  125. var summaryType = event.context;
  126. switch (summaryType) {
  127. case Em.I18n.t('jobs.hive.tez.metric.input'):
  128. summaryType = 'input';
  129. break;
  130. case Em.I18n.t('jobs.hive.tez.metric.output'):
  131. summaryType = 'output';
  132. break;
  133. case Em.I18n.t('jobs.hive.tez.metric.recordsRead'):
  134. summaryType = 'recordsRead';
  135. break;
  136. case Em.I18n.t('jobs.hive.tez.metric.recordsWrite'):
  137. summaryType = 'recordsWrite';
  138. break;
  139. case Em.I18n.t('jobs.hive.tez.metric.tezTasks'):
  140. summaryType = 'tezTasks';
  141. break;
  142. case Em.I18n.t('jobs.hive.tez.metric.spilledRecords'):
  143. summaryType = 'spilledRecords';
  144. break;
  145. default:
  146. break;
  147. }
  148. this.set('summaryMetricType', summaryType);
  149. },
  150. /**
  151. * Provides display information for vertex I/O.
  152. *
  153. * {
  154. * 'file': {
  155. * 'read': {
  156. * 'ops': '100 reads',
  157. * 'bytes': '10 MB'
  158. * }
  159. * 'write: {
  160. * 'ops': '200 writes',
  161. * 'bytes': '20 MB'
  162. * }
  163. * },
  164. * 'hdfs': {
  165. * 'read': {
  166. * 'ops': '100 reads',
  167. * 'bytes': '10 MB'
  168. * }
  169. * 'write: {
  170. * 'ops': '200 writes',
  171. * 'bytes': '20 MB'
  172. * }
  173. * },
  174. * 'records': {
  175. * 'read': '100 records',
  176. * 'write': '123 records'
  177. * },
  178. * 'started': 'Feb 12, 2014 10:30am',
  179. * 'ended': 'Feb 12, 2014 10:35am',
  180. * 'status': 'Running'
  181. * }
  182. */
  183. selectedVertexIODisplay : function() {
  184. var v = this.get('selectedVertex');
  185. var status = v.get('state');
  186. if (status) {
  187. status = stringUtils.getCamelCase(status);
  188. }
  189. var fileReadOps = v.get('fileReadOps');
  190. var fileWriteOps = v.get('fileWriteOps');
  191. var hdfsReadOps = v.get('hdfsReadOps');
  192. var hdfsWriteOps = v.get('hdfsWriteOps');
  193. var naString = Em.I18n.t('common.na');
  194. if (fileReadOps === null) {
  195. fileReadOps = naString;
  196. }
  197. if (fileWriteOps === null) {
  198. fileWriteOps = naString;
  199. }
  200. if (hdfsReadOps === null) {
  201. hdfsReadOps = naString;
  202. }
  203. if (hdfsWriteOps === null) {
  204. hdfsWriteOps = naString;
  205. }
  206. return {
  207. file : {
  208. read : {
  209. ops : Em.I18n.t('jobs.hive.tez.reads').format(fileReadOps),
  210. bytes : numberUtils.bytesToSize(v.get('fileReadBytes'))
  211. },
  212. write : {
  213. ops : Em.I18n.t('jobs.hive.tez.writes').format(fileWriteOps),
  214. bytes : numberUtils.bytesToSize(v.get('fileWriteBytes'))
  215. }
  216. },
  217. hdfs : {
  218. read : {
  219. ops : Em.I18n.t('jobs.hive.tez.reads').format(hdfsReadOps),
  220. bytes : numberUtils.bytesToSize(v.get('hdfsReadBytes'))
  221. },
  222. write : {
  223. ops : Em.I18n.t('jobs.hive.tez.writes').format(hdfsWriteOps),
  224. bytes : numberUtils.bytesToSize(v.get('hdfsWriteBytes'))
  225. }
  226. },
  227. records : {
  228. read : v.get('recordReadCount') == null ? null : Em.I18n.t('jobs.hive.tez.records.count').format(v.get('recordReadCount')),
  229. write : v.get('recordWriteCount') == null ? null : Em.I18n.t('jobs.hive.tez.records.count').format(v.get('recordWriteCount'))
  230. },
  231. started: v.get('startTime') ? dateUtils.dateFormat(v.get('startTime'), true, true) : '',
  232. ended: v.get('endTime') ? dateUtils.dateFormat(v.get('endTime'), true, true) : '',
  233. status: status
  234. };
  235. }.property('selectedVertex.fileReadOps', 'selectedVertex.fileWriteOps', 'selectedVertex.hdfsReadOps', 'selectedVertex.hdfdWriteOps',
  236. 'selectedVertex.fileReadBytes', 'selectedVertex.fileWriteBytes', 'selectedVertex.hdfsReadBytes', 'selectedVertex.hdfdWriteBytes',
  237. 'selectedVertex.recordReadCount', 'selectedVertex.recordWriteCount', 'selectedVertex.status'),
  238. canGraphZoomIn : function() {
  239. var zoomTo = this.get('zoomScaleTo');
  240. var zoomScale = this.get('zoomScale');
  241. console.debug("canGraphZoomIn? : ", (zoomScale < zoomTo), " (scaleTo=", zoomTo,", scale=",zoomScale,")");
  242. return zoomScale < zoomTo;
  243. }.property('zoomScale', 'zoomScaleTo'),
  244. canGraphZoomOut : function() {
  245. var zoomFrom = this.get('zoomScaleFrom');
  246. var zoomScale = this.get('zoomScale');
  247. console.debug("canGraphZoomOut? : ", (zoomScale > zoomFrom), " (scaleFrom=", zoomFrom,", scale=",zoomScale,")");
  248. return zoomScale > zoomFrom;
  249. }.property('zoomScale', 'zoomScaleFrom'),
  250. doGraphZoomIn: function() {
  251. var zoomTo = this.get('zoomScaleTo');
  252. var zoomScale = this.get('zoomScale');
  253. var zoomStep = this.get('zoomStep');
  254. if (zoomScale < zoomTo) {
  255. var step = Math.min(zoomStep, (zoomTo - zoomScale));
  256. zoomScale += step;
  257. console.debug("doGraphZoomIn(): New scale = ", zoomScale);
  258. this.set('zoomScale', zoomScale);
  259. }
  260. },
  261. doGraphZoomOut: function() {
  262. var zoomFrom = this.get('zoomScaleFrom');
  263. var zoomScale = this.get('zoomScale');
  264. var zoomStep = this.get('zoomStep');
  265. if (zoomScale > zoomFrom) {
  266. var step = Math.min(zoomStep, (zoomScale - zoomFrom));
  267. zoomScale -= step;
  268. console.debug("doGraphZoomOut(): New scale = ", zoomScale);
  269. this.set('zoomScale', zoomScale);
  270. }
  271. },
  272. doGraphMaximize: function() {
  273. this.set('isGraphMaximized', true);
  274. },
  275. doGraphMinimize: function() {
  276. this.set('isGraphMaximized', false);
  277. }
  278. });
  279. App.MainHiveJobDetailsVerticesTableView = App.TableView.extend({
  280. sortView: sort.wrapperView,
  281. didInsertElement: function () {
  282. if(!this.get('controller.sortingColumn')){
  283. var columns = this.get('childViews')[0].get('childViews');
  284. if(columns && columns.findProperty('name', 'name')){
  285. columns.findProperty('name','name').set('status', 'sorting_asc');
  286. this.get('controller').set('sortingColumn', columns.findProperty('name','name'))
  287. }
  288. }
  289. },
  290. nameSort: sort.fieldView.extend({
  291. column: 0,
  292. name: 'name',
  293. displayName: Em.I18n.t('common.name'),
  294. type: 'string'
  295. }),
  296. tasksSort: sort.fieldView.extend({
  297. column: 1,
  298. name: 'tasksNumber',
  299. displayName: Em.I18n.t('common.tasks'),
  300. type: 'number'
  301. }),
  302. inputSort: sort.fieldView.extend({
  303. column: 2,
  304. name: 'totalReadBytes',
  305. displayName: Em.I18n.t('apps.item.dag.input'),
  306. type: 'number'
  307. }),
  308. outputSort: sort.fieldView.extend({
  309. column: 3,
  310. name: 'totalWriteBytes',
  311. displayName: Em.I18n.t('apps.item.dag.output'),
  312. type: 'number'
  313. }),
  314. durationSort: sort.fieldView.extend({
  315. column: 4,
  316. name: 'duration',
  317. displayName: Em.I18n.t('apps.item.dag.duration'),
  318. type: 'number'
  319. })
  320. });