http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/index/history-query/index.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/index/history-query/index.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/index/history-query/index.js index be5d1f9..5959938 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/index/history-query/index.js +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/index/history-query/index.js @@ -18,6 +18,7 @@ import Ember from 'ember'; import constants from 'hive/utils/constants'; +import utils from 'hive/utils/functions'; export default Ember.Route.extend({ setupController: function (controller, model) { @@ -28,10 +29,16 @@ export default Ember.Route.extend({ subroute = existingTab.get('subroute'); } - if (subroute) { - this.transitionTo(subroute, model); + // filter out hdfs jobs + if (utils.isInteger(model.get('id'))) { + if (subroute) { + this.transitionTo(subroute, model); + } else { + this.transitionTo(constants.namingConventions.subroutes.jobLogs, model); + } } else { - this.transitionTo(constants.namingConventions.subroutes.jobLogs, model); + this.transitionTo(constants.namingConventions.subroutes.historyQuery, model); + this.controllerFor(constants.namingConventions.routes.index).set('model', model); } } });
http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/app.scss ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/app.scss b/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/app.scss index 6a1d35c..7085c85 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/app.scss +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/app.scss @@ -20,6 +20,7 @@ $panel-background: #f5f5f5; $placeholder-color: #aaa; +$border-color: #ddd; @-webkit-keyframes fadeIn { 0% {opacity: 0;} @@ -50,10 +51,23 @@ $placeholder-color: #aaa; -webkit-animation-name: fadeOut; animation-name: fadeOut; } + #content { padding: 20px 0; } +#index-content { + display: flex; +} + +#visual-explain, #tez-ui { + position: absolute; + left: 0; + width: 0; + z-index: 99; + background: white; +} + #alerts-container { position: absolute; left: 15px; @@ -78,7 +92,7 @@ aside hr { } .toolbox { - margin-top: 15px; + margin: 15px 15px 0 0; insert-udfs { display: inline-block; @@ -97,6 +111,10 @@ aside hr { color: $placeholder-color; } +.form-group { + margin-bottom: 0; +} + .secondary-row { background: $panel-background; } @@ -109,12 +127,12 @@ aside hr { } .CodeMirror { - border: 0 1px solid #ddd; + border: 0 1px solid $border-color; } .grip { height: 20px; - border: 0 1px 1px solid #ddd; + border: 0 1px 1px solid $border-color; background-color: $panel-background; color: #bbb; text-align: center; @@ -133,19 +151,19 @@ aside hr { background-color: white; } -.Unknown { +.UNKNOWN { color: gray; } -.Running, .Pending, .Initialized, .fa-edit { +.RUNNING, .PENDING, .INITIALIZED, .fa-edit { color: orange; } -.Finished { +.SUCCEEDED { color: green; } -.Canceled, .Error { +.CANCELED, .ERROR { color: red; } @@ -153,7 +171,7 @@ dropdown .fa-remove { color: red; } -.Closed { +.CLOSED { color: blue; } @@ -162,6 +180,35 @@ dropdown .fa-remove { padding-right: 0; } +.main-content { + flex-grow: 1; +} + +.query-menu { + margin-top: 57px; + + span, popover { + cursor: pointer; + overflow: hidden; + display: block; + border-bottom: 1px solid $border-color; + padding: 10px; + } +} + +.queries-icon { + font-size: 20px; + + &.active { + color: #428bca; + } + + &.text-icon { + font-size: 12px; + font-weight: 800; + } +} + .alert { margin-bottom: 5px; padding-bottom: 10px; @@ -231,7 +278,7 @@ body { height: 36px; background: url("/img/spinner.gif"); background-repeat: no-repeat; - margin: 0px auto; + margin: 0 auto; &.small { background-size: 20px; @@ -257,25 +304,18 @@ body { padding-right: 0 !important; } -.popover-right { - z-index: 92; - float: right; - position: relative; -} - .query-editor-panel .panel-body { position: relative; + padding-right: 0; } -.settings-toggle { + +.settings-containers-toggle { position: absolute; top: 0; right: 25px; cursor: pointer; } -.settings-toggle.active { - color: #428bca; -} .settings-container { width: 100%; overflow-y: scroll; @@ -286,8 +326,8 @@ body { position: absolute; padding: 0 15px; z-index: 1000; - border: 1px solid #ddd; + border: 1px solid $border-color; -webkit-animation-duration: .5s; animation-duration: .5s; -webkit-animation-fill-mode: both; @@ -302,14 +342,25 @@ body { .setting { float: left; - margin: 0 10px 10px 0; + padding-right: 10px; + padding-top: 10px; + + .input-group { + width: 100%; + } + .input-group-addon { + text-align: justify; + width: 50%; + } } .setting .remove { line-height: 30px; - margin-left: 10px; font-size: 18px; cursor: pointer; + position: absolute; + right: -5px; + top: -10px; } tabs { @@ -320,8 +371,3 @@ tabs { tree-view ul li { padding-left: 10px; } - -.runOnTez { - float: right; - margin: 0 -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/_typeahead-widget.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/_typeahead-widget.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/_typeahead-widget.hbs new file mode 100644 index 0000000..4083ad6 --- /dev/null +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/_typeahead-widget.hbs @@ -0,0 +1,17 @@ +{{! +* 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. +}} http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/popover-widget.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/popover-widget.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/popover-widget.hbs index fee80c7..f7c6d9c 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/popover-widget.hbs +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/popover-widget.hbs @@ -16,4 +16,4 @@ * limitations under the License. }} -<div class="hide"> {{yield}} </div> +<span class="hide"> {{yield}} </span> http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/databases-search-results.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/databases-search-results.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/databases-search-results.hbs index 38f6b66..354d7bd 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/databases-search-results.hbs +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/databases-search-results.hbs @@ -45,4 +45,4 @@ </div> {{else}} <h4>{{t "labels.noTablesMatches"}} "{{tablesSearchTerm}}"</h4> -{{/if}} \ No newline at end of file +{{/if}} http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/databases.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/databases.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/databases.hbs index 115bd70..a0ce19f 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/databases.hbs +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/databases.hbs @@ -21,8 +21,8 @@ {{typeahead-widget content=model - optionValuePath="content.id" - optionLabelPath="content.name" + optionValuePath="id" + optionLabelPath="name" selection=selectedDatabase }} http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/history.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/history.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/history.hbs index 22c2ff3..313a233 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/history.hbs +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/history.hbs @@ -47,8 +47,8 @@ {{item.title}} {{/link-to}} </td> - <td {{bind-attr class=item.status}}>{{item.status}}</td> - <td>{{date-binding item "dateSubmitted"}}</td> + <td {{bind-attr class=item.uppercaseStatus}}>{{all-uppercase item.status}}</td> + <td>{{date-binding item "dateSubmittedTimestamp"}}</td> <td>{{item.duration}}</td> <td> <a class="fa fa-expand pull-right"></a> http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/index.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/index.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/index.hbs index 622af66..b8d1d3b 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/index.hbs +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/index.hbs @@ -16,67 +16,87 @@ * limitations under the License. }} -<aside class="col-md-3 col-xs-12 pull-left no-padding"> - {{render 'databases'}} -</aside> +<div id="index-content"> + <div class="main-content"> + <aside class="col-md-3 col-xs-12 no-padding"> + {{render 'databases'}} + </aside> -<div class="col-md-9 col-xs 12 pull-left query-container"> + <div class="col-md-9 col-xs-12 query-container"> + {{render 'alerts'}} - {{render 'alerts'}} - {{#panel-widget headingTranslation="titles.query.editor" classNames="query-editor-panel"}} - {{#popover-widget classNames="fa fa-info-circle popover-right" titleTranslation="popover.queryEditorHelp.title" }} - <ul> - <li>{{t 'popover.queryEditorHelp.content.line1'}}</li> - <li>{{t 'popover.queryEditorHelp.content.line2'}}</li> - <li>{{t 'popover.queryEditorHelp.content.line3'}}</li> - </ul> - {{/popover-widget}} + {{#panel-widget headingTranslation="titles.query.editor" classNames="query-editor-panel"}} + {{render 'open-queries'}} - {{render 'open-queries'}} + <div class="toolbox"> + <button type="button" class="btn btn-sm btn-success execute-query" + {{bind-attr class="canExecute::disabled"}} + {{action "executeQuery"}}> + {{t "buttons.execute"}} + </button> + <button type="button" class="btn btn-sm btn-default" + {{bind-attr class="canExecute::disabled"}} + {{action "explainQuery"}}> + {{t "buttons.explain"}} + </button> + <button type="button" class="btn btn-sm btn-default save-query-as" {{action "saveQuery"}}>{{t "buttons.saveAs"}}</button> - <div class="toolbox"> - <button type="button" class="btn btn-sm btn-success execute-query" - {{bind-attr class="canExecute::disabled"}} - {{action "executeQuery"}}> - {{t "buttons.execute"}} - </button> - <button type="button" class="btn btn-sm btn-default" - {{bind-attr class="canExecute::disabled"}} - {{action "explainQuery"}}> - {{t "buttons.explain"}} - </button> - <button type="button" class="btn btn-sm btn-default save-query-as" {{action "saveQuery"}}>{{t "buttons.saveAs"}}</button> + {{render 'insert-udfs'}} - {{render 'insert-udfs'}} + <button type="button" class="btn btn-sm btn-primary pull-right" {{action "addQuery"}}>{{t "buttons.newQuery"}}</button> + </div> + {{/panel-widget}} - <button type="button" class="btn btn-sm btn-primary pull-right" {{action "addQuery"}}>{{t "buttons.newQuery"}}</button> - </div> - {{/panel-widget}} - - {{#if queryParams}} - {{#panel-widget headingTranslation="titles.query.parameters"}} - <div class="form-horizontal"> - {{#each param in queryParams}} - <div {{bind-attr class=":form-group param.value:has-success:has-error"}}> - <label class="col-sm-3 control-label">{{param.name}}</label> - <div class="col-sm-9"> - {{input value=param.value placeholder="value" class="form-control"}} + {{#if queryParams}} + {{#panel-widget headingTranslation="titles.query.parameters"}} + <div class="form-horizontal"> + {{#each param in queryParams}} + <div {{bind-attr class=":form-group param.value:has-success:has-error"}}> + <label class="col-sm-3 control-label">{{param.name}}</label> + <div class="col-sm-9"> + {{input value=param.value placeholder="value" class="form-control"}} + </div> </div> + {{/each}} </div> - {{/each}} - </div> - {{/panel-widget}} + {{/panel-widget}} + {{/if}} + + {{#if displayJobTabs}} + {{#panel-widget headingTranslation="titles.query.process" + isLoading=model.isRunning + menuItems=downloadMenu + menuHeadingTranslation="titles.download" + classNames="query-process-results-panel"}} + {{#tabs-widget tabs=queryProcessTabs selectedTab=selectedQueryProcessTab}} + {{outlet}} + {{/tabs-widget}} + {{/panel-widget}} + {{/if}} + </div> + </div> + + {{#if tezUI.showOverlay}} + {{render 'tez-ui'}} {{/if}} - {{#if displayJobTabs}} - {{#panel-widget headingTranslation="titles.query.process" - isLoading=model.isRunning - menuItems=downloadMenu - menuHeadingTranslation="titles.download" - classNames="query-process-results-panel"}} - {{#tabs-widget tabs=queryProcessTabs selectedTab=selectedQueryProcessTab}} - {{outlet}} - {{/tabs-widget}} - {{/panel-widget}} + {{#if visualExplain.showOverlay}} + {{render 'visual-explain'}} {{/if}} + + <div class="query-menu"> + {{#popover-widget classNames="fa fa-info-circle queries-icon" titleTranslation="popover.queryEditorHelp.title" }} + <ul> + <li>{{t 'popover.queryEditorHelp.content.line1'}}</li> + <li>{{t 'popover.queryEditorHelp.content.line2'}}</li> + <li>{{t 'popover.queryEditorHelp.content.line3'}}</li> + </ul> + {{/popover-widget}} + + <span {{bind-attr class="settings.showOverlay:active :fa :fa-gear :queries-icon"}} {{action 'toggleOverlay' 'settings'}}></span> + + <span {{bind-attr class="visualExplain.showOverlay:active :fa :fa-bar-chart :queries-icon"}} {{action 'toggleOverlay' 'visualExplain'}}></span> + + <span {{bind-attr class="tezUI.showOverlay:active :queries-icon :text-icon"}} {{action 'toggleOverlay' 'tezUI'}}>TEZ</span> + </div> </div> http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/queries.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/queries.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/queries.hbs index 6187dfe..692a462 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/queries.hbs +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/queries.hbs @@ -41,38 +41,40 @@ </thead> <tbody> {{#each query in this}} - <tr> - <td> - {{#link-to "index.savedQuery" query}} - {{query.shortQuery}} - {{/link-to}} - </td> + {{#unless query.isNew}} + <tr> + <td> + {{#link-to "index.savedQuery" query}} + {{query.shortQuery}} + {{/link-to}} + </td> - <td> - {{#link-to "index.savedQuery" query}} - {{query.title}} - {{/link-to}} - </td> + <td> + {{#link-to "index.savedQuery" query}} + {{query.title}} + {{/link-to}} + </td> - <td>{{query.dataBase}}</td> + <td>{{query.dataBase}}</td> - <td>{{query.owner}}</td> + <td>{{query.owner}}</td> - <td> - {{#unless query.isNew}} - <div class="btn-group pull-right"> - <span data-toggle="dropdown"> - <a class="fa fa-gear"></a> - </span> - <ul class="dropdown-menu" role="menu"> - {{#each link in controller.links}} - <li {{action 'executeAction' link query}}><a>{{tb-helper link}}</a></li> - {{/each}} - </ul> - </div> - {{/unless}} - </td> - </tr> + <td> + {{#unless query.isNew}} + <div class="btn-group pull-right"> + <span data-toggle="dropdown"> + <a class="fa fa-gear"></a> + </span> + <ul class="dropdown-menu" role="menu"> + {{#each link in controller.links}} + <li {{action 'executeAction' link query}}><a>{{tb-helper link}}</a></li> + {{/each}} + </ul> + </div> + {{/unless}} + </td> + </tr> + {{/unless}} {{/each}} </tbody> </table> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/settings.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/settings.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/settings.hbs index 15741802..791b7d0 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/settings.hbs +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/settings.hbs @@ -16,37 +16,44 @@ * limitations under the License. }} -<span {{bind-attr class="showSettingsOverlay:active :fa :fa-gear :settings-toggle"}} {{action 'toggleOverlay'}}></span> +{{#if showOverlay}} + <div class="settings-container fadeIn"> + <h3> Settings + <button class="btn btn-success btn-xs" {{action 'add'}}><i class="fa fa-plus"></i> Add</button> + </h3> -{{#if showSettingsOverlay}} -<div class="settings-container fadeIn"> - <h3>Settings - <button class="btn btn-success btn-xs" {{action 'add'}}><i class="fa fa-plus"></i> Add</button> + {{#each setting in currentSettings.settings}} + <div class="setting col-md-6 col-sm-12"> + <form> + <div class="form-group"> + <div class="input-group"> + <div class="input-group-addon"> + {{typeahead-widget + content=predefinedSettings + optionLabelPath="name" + optionValuePath="name" + selection=setting.key + create="addKey" + }} + </div> + <div {{bind-attr class=":input-group-addon setting.valid::has-error"}}> - <div class="checkbox btn btn-primary btn-xs runOnTez"> - <label for="runOnTez"> - {{input type="checkbox" checked=querySettings.runOnTez id="runOnTez"}} {{t "buttons.runOnTez"}} - </label> - </div> - </h3> + {{#if setting.key.values}} + {{select-widget items=setting.key.values + labelPath="value" + selectedValue=setting.selection + defaultLabelTranslation="placeholders.select.value" + }} + {{else}} + {{input class="input-sm form-control" placeholderTranslation="placeholders.select.value" value=setting.selection.value}} + {{/if}} - {{#each setting in querySettings.settings}} - <div class="setting"> - <form class="form-inline"> - <div class="form-group"> - <div class="input-group"> - <div class="input-group-addon"> - {{input class="input-sm form-control" placeholder="Key" value=setting.key}} - </div> - <div class="input-group-addon"> - {{input class="input-sm form-control" placeholder="Value" value=setting.value}} - <span class="fa fa-times-circle remove" {{action 'remove' setting}}></span> + <span class="fa fa-times-circle remove pull-right" {{action 'remove' setting}}></span> + </div> </div> </div> - </div> - </form> - </div> - {{/each}} - -</div> + </form> + </div> + {{/each}} + </div> {{/if}} http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/tez-ui.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/tez-ui.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/tez-ui.hbs new file mode 100644 index 0000000..f9b8d9c --- /dev/null +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/tez-ui.hbs @@ -0,0 +1,22 @@ +{{! +* 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 id="tez-ui"> + {{#panel-widget headingTranslation="titles.query.tez"}} + {{/panel-widget}} +</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/visual-explain.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/visual-explain.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/visual-explain.hbs new file mode 100644 index 0000000..a823ef2 --- /dev/null +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/visual-explain.hbs @@ -0,0 +1,22 @@ +{{! +* 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 id="visual-explain"> + {{#panel-widget headingTranslation="titles.query.visualExplain"}} + {{/panel-widget}} +</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/utils/constants.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/utils/constants.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/utils/constants.js index c9b1fda..888275d 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/app/utils/constants.js +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/utils/constants.js @@ -17,6 +17,7 @@ */ import Ember from 'ember'; +import helpers from 'hive/utils/functions'; export default Ember.Object.create({ appTitle: 'Hive', @@ -62,6 +63,8 @@ export default Ember.Object.create({ database: 'database', databases: 'databases', openQueries: 'open-queries', + visualExplain: 'visual-explain', + tezUI: 'tez-ui', file: 'file', fileResource: 'file-resource', fileResources: 'file-resources', @@ -79,15 +82,83 @@ export default Ember.Object.create({ settings: 'settings' }, + hiveParameters: [ + { + name: 'hive.tez.container.size', + values: [ + Ember.Object.create({ value: 'true' }), + Ember.Object.create({ value: 'false' }) + ] + }, + { + name: 'hive.prewarm.enabled', + validate: helpers.regexes.digits + }, + { + name: 'hive.prewarm.numcontainers', + values: [ + Ember.Object.create({ value: 'one' }), + Ember.Object.create({ value: 'two' }), + Ember.Object.create({ value: 'three' }) + ] + }, + { + name: 'hive.tez.auto.reducer.parallelism', + value: 'test' + }, + { + name: 'hive.execution.engine' + }, + { + name: 'hive.vectorized.execution.enabled' + }, + { + name: 'tez.am.resource.memory.mb' + }, + { + name: 'tez.am.container.idle.release-timeout-min.millis' + }, + { + name: 'tez.am.container.idle.release-timeout-max.millis' + }, + { + name: 'tez.queue.name' + }, + { + name: 'tez.runtime.io.sort.mb' + }, + { + name: 'tez.runtime.sort.threads' + }, + { + name: 'tez.runtime.optimize.shared.fetch' + }, + { + name: 'tez.runtime.compress.codec' + }, + { + name: 'tez.runtime.shuffle.keep-alive.enabled' + }, + { + name: 'tez.grouping.min-size' + }, + { + name: 'tez.grouping.max-size' + }, + { + name: 'tez.generate.debug.artifacts' + } + ], + statuses: { - unknown: "Unknown", - initialized: "Initialized", - running: "Running", - finished: "Finished", - canceled: "Canceled", - closed: "Closed", - error: "Error", - pending: "Pending" + unknown: "UNKNOWN", + initialized: "INITIALIZED", + running: "RUNNING", + succeeded: "SUCCEEDED", + canceled: "CANCELED", + closed: "CLOSED", + error: "ERROR", + pending: "PENDING" }, alerts: { http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/utils/functions.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/utils/functions.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/utils/functions.js index ab4f8e5..a63dc5b 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/app/utils/functions.js +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/utils/functions.js @@ -22,7 +22,7 @@ import Ember from 'ember'; export default Ember.Object.create({ isInteger: function (x) { - return (x^0) === x; + return !isNaN(x); }, isDate: function(date) { @@ -31,6 +31,19 @@ export default Ember.Object.create({ regexes: { allUppercase: /^[^a-z]*$/, - whitespaces: /^(\s*).*$/ + whitespaces: /^(\s*).*$/, + digits: /^\d+$/ + }, + + insensitiveCompare: function (sourceString) { + var args = Array.prototype.slice.call(arguments, 1); + + if (!sourceString) { + return; + } + + return args.find(function (arg) { + return sourceString.match(new RegExp('^' + arg + '$', 'i')); + }); } -}); \ No newline at end of file +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/views/tez-ui.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/views/tez-ui.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/views/tez-ui.js new file mode 100644 index 0000000..c14fd34 --- /dev/null +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/views/tez-ui.js @@ -0,0 +1,35 @@ +/** + * 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.View.extend({ + didInsertElement: function () { + var target = this.$('#tez-ui'); + + target.css('min-height', $('.main-content').height()); + target.animate({ width: $('.main-content').width() }, 'fast'); + }, + + willDestroyElement: function () { + var target = this.$('#tez-ui'); + + target.css('min-height', 0); + target.css('width', 0); + } +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/app/views/visual-explain.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/views/visual-explain.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/views/visual-explain.js new file mode 100644 index 0000000..4a887e2 --- /dev/null +++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/views/visual-explain.js @@ -0,0 +1,35 @@ +/** + * 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.View.extend({ + didInsertElement: function () { + var target = this.$('#visual-explain'); + + target.css('min-height', $('.main-content').height()); + target.animate({ width: $('.main-content').width() }, 'fast'); + }, + + willDestroyElement: function () { + var target = this.$('#visual-explain'); + + target.css('min-height', 0); + target.css('width', 0); + } +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/bower.json ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/bower.json b/contrib/views/hive/src/main/resources/ui/hive-web/bower.json index a4c2aca..161a626 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/bower.json +++ b/contrib/views/hive/src/main/resources/ui/hive-web/bower.json @@ -4,20 +4,20 @@ "handlebars": "2.0.0", "jquery": "^1.11.1", "ember": "1.9.0", - "ember-data": "1.0.0-beta.11", + "ember-data": "1.0.0-beta.14.1", "ember-resolver": "~0.1.7", "loader.js": "stefanpenner/loader.js#1.0.1", "ember-cli-shims": "stefanpenner/ember-cli-shims#0.0.3", "ember-cli-test-loader": "rwjblue/ember-cli-test-loader#0.0.4", "ember-load-initializers": "stefanpenner/ember-load-initializers#0.0.2", - "ember-qunit": "0.1.8", - "ember-qunit-notifications": "0.0.4", + "ember-qunit": "0.2.8", + "ember-qunit-notifications": "0.0.7", "qunit": "~1.15.0", "bootstrap": "~3.2.0", "ember-i18n": "~2.9.0", "blanket": "~1.1.5", "jquery-ui": "~1.11.2", - "selectize": "~0.11.2", + "selectize": "~0.12.0", "pretender": "0.1.0" }, "resolutions": { http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/package.json ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/package.json b/contrib/views/hive/src/main/resources/ui/hive-web/package.json index 52e908a..c2523b1 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/package.json +++ b/contrib/views/hive/src/main/resources/ui/hive-web/package.json @@ -15,7 +15,7 @@ }, "repository": "https://github.com/stefanpenner/ember-cli", "engines": { - "node": ">= 0.10.0" + "node": ">= 0.10.32" }, "author": "", "license": "MIT", @@ -24,7 +24,7 @@ "bower": ">= 1.3.12", "broccoli-asset-rev": "0.3.1", "broccoli-sass": "^0.3.2", - "ember-cli": "0.1.2", + "ember-cli": "0.1.15", "ember-cli-blanket": "^0.2.2", "ember-cli-content-security-policy": "0.3.0", "ember-cli-font-awesome": "0.0.4", @@ -34,12 +34,12 @@ "ember-cli-jquery-ui": "0.0.12", "ember-cli-moment": "0.0.1", "ember-cli-pretender": "^0.3.1", - "ember-cli-qunit": "0.1.0", - "ember-cli-selectize": "0.0.7", - "ember-data": "1.0.0-beta.10", + "ember-cli-qunit": "0.3.7", + "ember-cli-selectize": "0.0.19", + "ember-data": "1.0.0-beta.14.1", "ember-dynamic-component": "0.0.1", "ember-export-application-global": "^1.0.0", "express": "^4.8.5", - "glob": "^4.0.5" + "glob": "4.4.0" } } http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/tests/integration/query-editor-test.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/tests/integration/query-editor-test.js b/contrib/views/hive/src/main/resources/ui/hive-web/tests/integration/query-editor-test.js index 235a225..19c2356 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/tests/integration/query-editor-test.js +++ b/contrib/views/hive/src/main/resources/ui/hive-web/tests/integration/query-editor-test.js @@ -59,7 +59,7 @@ test('Can execute query', function() { click('.execute-query'); andThen(function() { - ok(find('.query-process-results-panel .nav-tabs li:nth-child(2)').hasClass('active'), 'Results tab is visible'); + equal(find('.query-process-results-panel').length, 1, 'Job tabs are visible.'); }); }); http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/history-test.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/history-test.js b/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/history-test.js index c43cfda..51d4112 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/history-test.js +++ b/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/history-test.js @@ -40,10 +40,10 @@ test('date range is set correctly', function () { var history = Ember.ArrayProxy.create({ content: [ Ember.Object.create({ - dateSubmitted: min + dateSubmittedTimestamp: min }), Ember.Object.create({ - dateSubmitted: max + dateSubmittedTimestamp: max }) ]}); http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/queries-test.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/queries-test.js b/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/queries-test.js index 0ed7dd7..d14f2cc 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/queries-test.js +++ b/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/queries-test.js @@ -30,18 +30,3 @@ test('controller is initialized', function() { equal(component.get('columns.length'), 4, 'Columns are initialized correctly'); }); - -test('Should hide new queries', function() { - expect(1); - - var queries = [ - { isNew: true }, - { isNew: false} - ]; - - var controller = this.subject({ - queries: queries - }); - - equal(controller.get('model.length'), 1, 'Hide new queries from the list'); -}); http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/settings-test.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/settings-test.js b/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/settings-test.js new file mode 100644 index 0000000..ef1b3d8 --- /dev/null +++ b/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/settings-test.js @@ -0,0 +1,97 @@ +/** + * 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'; +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:settings', 'SettingsController', { + needs: [ + 'controller:databases', + 'controller:index', + 'controller:open-queries', + 'controller:loaded-files', + 'controller:index/history-query/results', + 'controller:index/history-query/explain', + 'controller:columns', + 'controller:udfs', + 'controller:index/history-query/logs' + ] +}); + +test('can add a setting', function() { + var controller = this.subject(); + + ok(!controller.get('currentSettings.settings.length'), 'No initial settings'); + + Ember.run(function() { + controller.send('add'); + }); + + equal(controller.get('currentSettings.settings.length'), 1, 'Can add settings'); +}); + +test('hasSettings return true if there are settings', function() { + var controller = this.subject(); + + ok(!controller.hasSettings(null), 'No settings => return false'); + + Ember.run(function() { + controller.send('add'); + }); + + ok(controller.hasSettings(null), '1 setting => returns true'); +}); + +test('setSettingForQuery', function() { + var controller = this.subject(); + + var settings = [ Ember.Object.create({key: 'key', value: 'value'}) ]; + + Ember.run(function() { + controller.setSettingForQuery(1, settings); + }); + + equal(controller.get('currentSettings.settings.firstObject.key'), settings.get('key'), 'It sets the settings for specified query'); +}); + +test('validate', function() { + var predefinedSettings = [ + { + name: 'some.key', + validate: new RegExp(/^\d+$/) // digits + } + ]; + + var controller = this.subject({ + predefinedSettings: predefinedSettings + }); + + var settings = [ + Ember.Object.create({key: { name: 'some.key' }, value: 'value'}), + Ember.Object.create({key: { name: 'some.key' }, value: '123'}) + ]; + + Ember.run(function() { + controller.setSettingForQuery(1, settings); + }); + + var currentSettings = controller.get('model.firstObject.settings'); + console.log(currentSettings); + ok(!currentSettings.get('firstObject.valid'), "First setting doesn\' pass validataion"); + ok(currentSettings.get('lastObject.valid'), 'Second setting passes validation'); +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/tez-ui-test.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/tez-ui-test.js b/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/tez-ui-test.js new file mode 100644 index 0000000..f2755c5 --- /dev/null +++ b/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/tez-ui-test.js @@ -0,0 +1,33 @@ +/** + * 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 { + moduleFor, + test +} from 'ember-qunit'; + +moduleFor('controller:tez-ui', 'TezUiController', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function() { + var controller = this.subject(); + ok(controller); +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/visual-explain-test.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/visual-explain-test.js b/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/visual-explain-test.js new file mode 100644 index 0000000..1ab84e2 --- /dev/null +++ b/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/controllers/visual-explain-test.js @@ -0,0 +1,33 @@ +/** + * 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 { + moduleFor, + test +} from 'ember-qunit'; + +moduleFor('controller:visual-explain', 'VisualExplainController', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function() { + var controller = this.subject(); + ok(controller); +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/views/visual-explain-test.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/views/visual-explain-test.js b/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/views/visual-explain-test.js new file mode 100644 index 0000000..97faea6 --- /dev/null +++ b/contrib/views/hive/src/main/resources/ui/hive-web/tests/unit/views/visual-explain-test.js @@ -0,0 +1,30 @@ +/** + * 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 { + moduleFor, + test +} from 'ember-qunit'; + +moduleFor('view:visual-explain', 'VisualExplainView'); + +// Replace this with your real tests. +test('it exists', function() { + var view = this.subject(); + ok(view); +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/main/resources/view.xml ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/view.xml b/contrib/views/hive/src/main/resources/view.xml index b936c6d..b1d9ce6 100644 --- a/contrib/views/hive/src/main/resources/view.xml +++ b/contrib/views/hive/src/main/resources/view.xml @@ -19,22 +19,30 @@ <label>Hive</label> <version>0.0.1</version> + <min-ambari-version>1.7.*</min-ambari-version> + <!-- HDFS Configs --> <parameter> <name>webhdfs.url</name> - <description>WebHDFS FileSystem URI (example: webhdfs://namenode:50070)</description> + <description>Enter the WebHDFS FileSystem URI. Typically this is the dfs.namenode.http-address property in the hdfs-site.xml configuration. URL must be accessible from Ambari Server.</description> + <label>WebHDFS FileSystem URI</label> + <placeholder>webhdfs://namenode:50070</placeholder> <required>true</required> </parameter> <parameter> <name>webhdfs.username</name> - <description>User and doAs for proxy user for HDFS</description> + <description>doAs for proxy user for HDFS. By default, uses the currently logged-in Ambari user.</description> + <label>WebHDFS Username</label> <required>false</required> </parameter> <parameter> <name>webhdfs.auth</name> - <description>Semicolon-separated authentication configs. Default: auth=SIMPLE</description> + <description>Semicolon-separated authentication configs.</description> + <label>WebHDFS Authentication</label> + <placeholder>auth=SIMPLE</placeholder> + <default-value>auth=SIMPLE</default-value> <required>false</required> </parameter> @@ -42,40 +50,62 @@ <parameter> <name>dataworker.username</name> - <description>The username (defaults to ViewContext username)</description> + <description>The dataworker username. By default, users the currently logged-in Ambari user.</description> + <label>Dataworker Username</label> <required>false</required> </parameter> <parameter> <name>scripts.dir</name> - <description>HDFS directory path to store Hive scripts (example: /users/${username})</description> + <description>HDFS directory path to store Hive scripts.</description> + <label>Scripts HDFS Directory</label> + <placeholder>/user/${username}/hive/scripts</placeholder> + <default-value>/user/${username}/hive/scripts</default-value> <required>true</required> </parameter> <parameter> <name>jobs.dir</name> - <description>HDFS directory path to store Hive job status (example: /users/${username})</description> + <description>HDFS directory path to store Hive job status.</description> + <label>Jobs HDFS Directory</label> + <placeholder>/user/${username}/hive/jobs</placeholder> + <default-value>/user/${username}/hive/jobs</default-value> <required>true</required> </parameter> <parameter> <name>hive.host</name> - <description>HiveServer2 hostname or IP (example: 127.0.0.1)</description> + <description>Enter the HiveServer2 host. Host must be accessible from Ambari Server.</description> + <label>HiveServer2 Host</label> + <placeholder>127.0.0.1</placeholder> <required>true</required> </parameter> <parameter> <name>hive.port</name> - <description>HiveServer2 Thrift port (example: 10000)</description> + <description>HiveServer2 Thrift port (example: 10000).</description> + <label>HiveServer2 Thrift port</label> + <placeholder>10000</placeholder> + <default-value>10000</default-value> <required>true</required> </parameter> <parameter> <name>hive.auth</name> - <description>Semicolon-separated authentication configs. Default: auth=NOSASL</description> + <description>Semicolon-separated authentication configs.</description> + <label>Hive Authentication</label> + <placeholder>auth=NONE</placeholder> + <default-value>auth=NONE</default-value> <required>false</required> </parameter> + <parameter> + <name>yarn.ats.url</name> + <description>The URL to the YARN Application Timeline Server, used to provide Jobs information, typically, this is the yarn.timeline-service.webapp.address property in the yarn-site.xml configuration.</description> + <placeholder>http://yarn.ats.address:8188</placeholder> + <required>true</required> + </parameter> + <resource> <name>savedQuery</name> <plural-name>savedQueries</plural-name> @@ -107,7 +137,7 @@ <name>job</name> <plural-name>jobs</plural-name> <id-property>id</id-property> - <resource-class>org.apache.ambari.view.hive.resources.jobs.JobImpl</resource-class> + <resource-class>org.apache.ambari.view.hive.resources.jobs.viewJobs.JobImpl</resource-class> <provider-class>org.apache.ambari.view.hive.resources.jobs.JobResourceProvider</provider-class> <service-class>org.apache.ambari.view.hive.resources.jobs.JobService</service-class> </resource> @@ -133,7 +163,7 @@ <id-property>id</id-property> </entity> <entity> - <class>org.apache.ambari.view.hive.resources.jobs.JobImpl</class> + <class>org.apache.ambari.view.hive.resources.jobs.viewJobs.JobImpl</class> <id-property>id</id-property> </entity> <entity> http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/test/java/org/apache/ambari/view/hive/resources/files/FileServiceTest.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/test/java/org/apache/ambari/view/hive/resources/files/FileServiceTest.java b/contrib/views/hive/src/test/java/org/apache/ambari/view/hive/resources/files/FileServiceTest.java index 7ce2dd3..a5a0f48 100644 --- a/contrib/views/hive/src/test/java/org/apache/ambari/view/hive/resources/files/FileServiceTest.java +++ b/contrib/views/hive/src/test/java/org/apache/ambari/view/hive/resources/files/FileServiceTest.java @@ -55,7 +55,12 @@ public class FileServiceTest extends HDFSTest { @AfterClass public static void shutDown() throws Exception { HDFSTest.shutDown(); // super - HdfsApi.dropAllConnections(); //cleanup API connection + } + + @Override + @After + public void tearDown() throws Exception { + fileService.getSharedObjectsFactory().clear(HdfsApi.class); } @Test http://git-wip-us.apache.org/repos/asf/ambari/blob/8dbdbf66/contrib/views/hive/src/test/java/org/apache/ambari/view/hive/resources/jobs/ATSParserTest.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/test/java/org/apache/ambari/view/hive/resources/jobs/ATSParserTest.java b/contrib/views/hive/src/test/java/org/apache/ambari/view/hive/resources/jobs/ATSParserTest.java new file mode 100644 index 0000000..ced7772 --- /dev/null +++ b/contrib/views/hive/src/test/java/org/apache/ambari/view/hive/resources/jobs/ATSParserTest.java @@ -0,0 +1,411 @@ +/** + * 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. + */ + +package org.apache.ambari.view.hive.resources.jobs; + +import org.apache.ambari.view.hive.resources.jobs.atsJobs.*; +import org.apache.commons.codec.binary.Base64; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; +import org.junit.Assert; +import org.junit.Test; +import sun.reflect.generics.reflectiveObjects.NotImplementedException; + +import java.util.Arrays; +import java.util.List; + +public class ATSParserTest { + @Test + public void testBase64() throws Exception { + System.out.println(Arrays.toString(Base64.decodeBase64("HWvpjKiERZCy_le4s-odOQ"))); + } + + @Test + public void testGetHiveJobsList() throws Exception { + IATSParser jobLoader = new ATSParser(new ATSRequestsDelegateStub()); + + List<HiveQueryId> jobs = jobLoader.getHiveQuieryIdsList("hive"); + + Assert.assertEquals(1, jobs.size()); + + HiveQueryId job = jobs.get(0); + Assert.assertEquals("hive_20150209144848_c3a5a07b-c3b6-4f57-a6d5-3dadecdd6fd0", job.entity); + Assert.assertEquals(1423493324L, job.starttime); + Assert.assertEquals("hive", job.user); + Assert.assertEquals(1423493342L - 1423493324L, job.duration); + Assert.assertEquals("select count(*) from z", job.query); + + Assert.assertEquals(1, job.dagNames.size()); + Assert.assertEquals("hive_20150209144848_c3a5a07b-c3b6-4f57-a6d5-3dadecdd6fd0:4", job.dagNames.get(0)); + + Assert.assertEquals(2, job.stages.size()); + } + + @Test + public void testGetTezDAGByName() throws Exception { + IATSParser jobLoader = new ATSParser(new ATSRequestsDelegateStub()); + + TezDagId tezDag = jobLoader.getTezDAGByName("hive_20150209144848_c3a5a07b-c3b6-4f57-a6d5-3dadecdd6fd0:4"); + + Assert.assertEquals("application_1423156117563_0005", tezDag.applicationId); + Assert.assertEquals("SUCCEEDED", tezDag.status); + } + + protected static class ATSRequestsDelegateStub implements ATSRequestsDelegate { + + @Override + public JSONObject hiveQueryIdList(String username) { + return (JSONObject) JSONValue.parse( + "{ \"entities\" : [ { \"domain\" : \"DEFAULT\",\n" + + " \"entity\" : \"hive_20150209144848_c3a5a07b-c3b6-4f57-a6d5-3dadecdd6fd0\",\n" + + " \"entitytype\" : \"HIVE_QUERY_ID\",\n" + + " \"events\" : [ { \"eventinfo\" : { },\n" + + " \"eventtype\" : \"QUERY_COMPLETED\",\n" + + " \"timestamp\" : 1423493342843\n" + + " },\n" + + " { \"eventinfo\" : { },\n" + + " \"eventtype\" : \"QUERY_SUBMITTED\",\n" + + " \"timestamp\" : 1423493324355\n" + + " }\n" + + " ],\n" + + " \"otherinfo\" : { \"MAPRED\" : false,\n" + + " \"QUERY\" : \"{\\\"queryText\\\":\\\"select count(*) from z\\\",\\\"queryPlan\\\":{\\\"STAGE PLANS\\\":{\\\"Stage-1\\\":{\\\"Tez\\\":{\\\"DagName:\\\":\\\"hive_20150209144848_c3a5a07b-c3b6-4f57-a6d5-3dadecdd6fd0:4\\\",\\\"Vertices:\\\":{\\\"Reducer 2\\\":{\\\"Reduce Operator Tree:\\\":{\\\"Group By Operator\\\":{\\\"mode:\\\":\\\"mergepartial\\\",\\\"aggregations:\\\":[\\\"count(VALUE._col0)\\\"],\\\"outputColumnNames:\\\":[\\\"_col0\\\"],\\\"children\\\":{\\\"Select Operator\\\":{\\\"expressions:\\\":\\\"_col0 (type: bigint)\\\",\\\"outputColumnNames:\\\":[\\\"_col0\\\"],\\\"children\\\":{\\\"File Output Operator\\\":{\\\"Statistics:\\\":\\\"Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE\\\",\\\"compressed:\\\":\\\"false\\\",\\\"table:\\\":{\\\"serde:\\\":\\\"org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe\\\",\\\"input format:\\\":\\\"org.apache.hadoop.mapred.TextInputFormat\\\",\\\"output format:\\\":\\\"org.apache.hadoop.hive. ql.io.HiveIgnoreKeyTextOutputFormat\\\"}}},\\\"Statistics:\\\":\\\"Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE\\\"}},\\\"Statistics:\\\":\\\"Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE\\\"}}},\\\"Map 1\\\":{\\\"Map Operator Tree:\\\":[{\\\"TableScan\\\":{\\\"alias:\\\":\\\"z\\\",\\\"children\\\":{\\\"Select Operator\\\":{\\\"children\\\":{\\\"Group By Operator\\\":{\\\"mode:\\\":\\\"hash\\\",\\\"aggregations:\\\":[\\\"count()\\\"],\\\"outputColumnNames:\\\":[\\\"_col0\\\"],\\\"children\\\":{\\\"Reduce Output Operator\\\":{\\\"sort order:\\\":\\\"\\\",\\\"value expressions:\\\":\\\"_col0 (type: bigint)\\\",\\\"Statistics:\\\":\\\"Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE\\\"}},\\\"Statistics:\\\":\\\"Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE\\\"}},\\\"Statistics:\\\":\\\"Num rows: 0 Data size: 40 Basic stats: PARTIAL Column stats: COMPLETE\\\"}},\\\"Statistics:\\\":\\\"Num rows : 0 Data size: 40 Basic stats: PARTIAL Column stats: COMPLETE\\\"}}]}},\\\"Edges:\\\":{\\\"Reducer 2\\\":{\\\"parent\\\":\\\"Map 1\\\",\\\"type\\\":\\\"SIMPLE_EDGE\\\"}}}},\\\"Stage-0\\\":{\\\"Fetch Operator\\\":{\\\"limit:\\\":\\\"-1\\\",\\\"Processor Tree:\\\":{\\\"ListSink\\\":{}}}}},\\\"STAGE DEPENDENCIES\\\":{\\\"Stage-1\\\":{\\\"ROOT STAGE\\\":\\\"TRUE\\\"},\\\"Stage-0\\\":{\\\"DEPENDENT STAGES\\\":\\\"Stage-1\\\"}}}}\",\n" + + " \"STATUS\" : true,\n" + + " \"TEZ\" : true\n" + + " },\n" + + " \"primaryfilters\" : { \"user\" : [ \"hive\" ] },\n" + + " \"relatedentities\" : { },\n" + + " \"starttime\" : 1423493324355\n" + + " } ] }" + ); + } + + @Override + public JSONObject hiveQueryIdByOperationId(String operationId) { + throw new NotImplementedException(); + } + + @Override + public JSONObject tezDagByName(String name) { + return (JSONObject) JSONValue.parse( + "{ \"entities\" : [ { \"domain\" : \"DEFAULT\",\n" + + " \"entity\" : \"dag_1423156117563_0005_2\",\n" + + " \"entitytype\" : \"TEZ_DAG_ID\",\n" + + " \"events\" : [ { \"eventinfo\" : { },\n" + + " \"eventtype\" : \"DAG_FINISHED\",\n" + + " \"timestamp\" : 1423493342484\n" + + " },\n" + + " { \"eventinfo\" : { },\n" + + " \"eventtype\" : \"DAG_STARTED\",\n" + + " \"timestamp\" : 1423493325803\n" + + " },\n" + + " { \"eventinfo\" : { },\n" + + " \"eventtype\" : \"DAG_INITIALIZED\",\n" + + " \"timestamp\" : 1423493325794\n" + + " },\n" + + " { \"eventinfo\" : { },\n" + + " \"eventtype\" : \"DAG_SUBMITTED\",\n" + + " \"timestamp\" : 1423493325578\n" + + " }\n" + + " ],\n" + + " \"otherinfo\" : { \"applicationId\" : \"application_1423156117563_0005\",\n" + + " \"counters\" : { \"counterGroups\" : [ { \"counterGroupDisplayName\" : \"org.apache.tez.common.counters.DAGCounter\",\n" + + " \"counterGroupName\" : \"org.apache.tez.common.counters.DAGCounter\",\n" + + " \"counters\" : [ { \"counterDisplayName\" : \"NUM_SUCCEEDED_TASKS\",\n" + + " \"counterName\" : \"NUM_SUCCEEDED_TASKS\",\n" + + " \"counterValue\" : 2\n" + + " },\n" + + " { \"counterDisplayName\" : \"TOTAL_LAUNCHED_TASKS\",\n" + + " \"counterName\" : \"TOTAL_LAUNCHED_TASKS\",\n" + + " \"counterValue\" : 2\n" + + " },\n" + + " { \"counterDisplayName\" : \"DATA_LOCAL_TASKS\",\n" + + " \"counterName\" : \"DATA_LOCAL_TASKS\",\n" + + " \"counterValue\" : 1\n" + + " }\n" + + " ]\n" + + " },\n" + + " { \"counterGroupDisplayName\" : \"File System Counters\",\n" + + " \"counterGroupName\" : \"org.apache.tez.common.counters.FileSystemCounter\",\n" + + " \"counters\" : [ { \"counterDisplayName\" : \"FILE_BYTES_READ\",\n" + + " \"counterName\" : \"FILE_BYTES_READ\",\n" + + " \"counterValue\" : 57\n" + + " },\n" + + " { \"counterDisplayName\" : \"FILE_BYTES_WRITTEN\",\n" + + " \"counterName\" : \"FILE_BYTES_WRITTEN\",\n" + + " \"counterValue\" : 82\n" + + " },\n" + + " { \"counterDisplayName\" : \"FILE_READ_OPS\",\n" + + " \"counterName\" : \"FILE_READ_OPS\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"FILE_LARGE_READ_OPS\",\n" + + " \"counterName\" : \"FILE_LARGE_READ_OPS\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"FILE_WRITE_OPS\",\n" + + " \"counterName\" : \"FILE_WRITE_OPS\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"HDFS_BYTES_READ\",\n" + + " \"counterName\" : \"HDFS_BYTES_READ\",\n" + + " \"counterValue\" : 287\n" + + " },\n" + + " { \"counterDisplayName\" : \"HDFS_BYTES_WRITTEN\",\n" + + " \"counterName\" : \"HDFS_BYTES_WRITTEN\",\n" + + " \"counterValue\" : 2\n" + + " },\n" + + " { \"counterDisplayName\" : \"HDFS_READ_OPS\",\n" + + " \"counterName\" : \"HDFS_READ_OPS\",\n" + + " \"counterValue\" : 16\n" + + " },\n" + + " { \"counterDisplayName\" : \"HDFS_LARGE_READ_OPS\",\n" + + " \"counterName\" : \"HDFS_LARGE_READ_OPS\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"HDFS_WRITE_OPS\",\n" + + " \"counterName\" : \"HDFS_WRITE_OPS\",\n" + + " \"counterValue\" : 2\n" + + " }\n" + + " ]\n" + + " },\n" + + " { \"counterGroupDisplayName\" : \"org.apache.tez.common.counters.TaskCounter\",\n" + + " \"counterGroupName\" : \"org.apache.tez.common.counters.TaskCounter\",\n" + + " \"counters\" : [ { \"counterDisplayName\" : \"REDUCE_INPUT_GROUPS\",\n" + + " \"counterName\" : \"REDUCE_INPUT_GROUPS\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"REDUCE_INPUT_RECORDS\",\n" + + " \"counterName\" : \"REDUCE_INPUT_RECORDS\",\n" + + " \"counterValue\" : 1\n" + + " },\n" + + " { \"counterDisplayName\" : \"COMBINE_INPUT_RECORDS\",\n" + + " \"counterName\" : \"COMBINE_INPUT_RECORDS\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"SPILLED_RECORDS\",\n" + + " \"counterName\" : \"SPILLED_RECORDS\",\n" + + " \"counterValue\" : 2\n" + + " },\n" + + " { \"counterDisplayName\" : \"NUM_SHUFFLED_INPUTS\",\n" + + " \"counterName\" : \"NUM_SHUFFLED_INPUTS\",\n" + + " \"counterValue\" : 1\n" + + " },\n" + + " { \"counterDisplayName\" : \"NUM_SKIPPED_INPUTS\",\n" + + " \"counterName\" : \"NUM_SKIPPED_INPUTS\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"NUM_FAILED_SHUFFLE_INPUTS\",\n" + + " \"counterName\" : \"NUM_FAILED_SHUFFLE_INPUTS\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"MERGED_MAP_OUTPUTS\",\n" + + " \"counterName\" : \"MERGED_MAP_OUTPUTS\",\n" + + " \"counterValue\" : 1\n" + + " },\n" + + " { \"counterDisplayName\" : \"GC_TIME_MILLIS\",\n" + + " \"counterName\" : \"GC_TIME_MILLIS\",\n" + + " \"counterValue\" : 389\n" + + " },\n" + + " { \"counterDisplayName\" : \"CPU_MILLISECONDS\",\n" + + " \"counterName\" : \"CPU_MILLISECONDS\",\n" + + " \"counterValue\" : 2820\n" + + " },\n" + + " { \"counterDisplayName\" : \"PHYSICAL_MEMORY_BYTES\",\n" + + " \"counterName\" : \"PHYSICAL_MEMORY_BYTES\",\n" + + " \"counterValue\" : 490799104\n" + + " },\n" + + " { \"counterDisplayName\" : \"VIRTUAL_MEMORY_BYTES\",\n" + + " \"counterName\" : \"VIRTUAL_MEMORY_BYTES\",\n" + + " \"counterValue\" : 1558253568\n" + + " },\n" + + " { \"counterDisplayName\" : \"COMMITTED_HEAP_BYTES\",\n" + + " \"counterName\" : \"COMMITTED_HEAP_BYTES\",\n" + + " \"counterValue\" : 312475648\n" + + " },\n" + + " { \"counterDisplayName\" : \"INPUT_RECORDS_PROCESSED\",\n" + + " \"counterName\" : \"INPUT_RECORDS_PROCESSED\",\n" + + " \"counterValue\" : 3\n" + + " },\n" + + " { \"counterDisplayName\" : \"OUTPUT_RECORDS\",\n" + + " \"counterName\" : \"OUTPUT_RECORDS\",\n" + + " \"counterValue\" : 1\n" + + " },\n" + + " { \"counterDisplayName\" : \"OUTPUT_BYTES\",\n" + + " \"counterName\" : \"OUTPUT_BYTES\",\n" + + " \"counterValue\" : 3\n" + + " },\n" + + " { \"counterDisplayName\" : \"OUTPUT_BYTES_WITH_OVERHEAD\",\n" + + " \"counterName\" : \"OUTPUT_BYTES_WITH_OVERHEAD\",\n" + + " \"counterValue\" : 11\n" + + " },\n" + + " { \"counterDisplayName\" : \"OUTPUT_BYTES_PHYSICAL\",\n" + + " \"counterName\" : \"OUTPUT_BYTES_PHYSICAL\",\n" + + " \"counterValue\" : 25\n" + + " },\n" + + " { \"counterDisplayName\" : \"ADDITIONAL_SPILLS_BYTES_WRITTEN\",\n" + + " \"counterName\" : \"ADDITIONAL_SPILLS_BYTES_WRITTEN\",\n" + + " \"counterValue\" : 25\n" + + " },\n" + + " { \"counterDisplayName\" : \"ADDITIONAL_SPILLS_BYTES_READ\",\n" + + " \"counterName\" : \"ADDITIONAL_SPILLS_BYTES_READ\",\n" + + " \"counterValue\" : 25\n" + + " },\n" + + " { \"counterDisplayName\" : \"ADDITIONAL_SPILL_COUNT\",\n" + + " \"counterName\" : \"ADDITIONAL_SPILL_COUNT\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"SHUFFLE_BYTES\",\n" + + " \"counterName\" : \"SHUFFLE_BYTES\",\n" + + " \"counterValue\" : 25\n" + + " },\n" + + " { \"counterDisplayName\" : \"SHUFFLE_BYTES_DECOMPRESSED\",\n" + + " \"counterName\" : \"SHUFFLE_BYTES_DECOMPRESSED\",\n" + + " \"counterValue\" : 11\n" + + " },\n" + + " { \"counterDisplayName\" : \"SHUFFLE_BYTES_TO_MEM\",\n" + + " \"counterName\" : \"SHUFFLE_BYTES_TO_MEM\",\n" + + " \"counterValue\" : 25\n" + + " },\n" + + " { \"counterDisplayName\" : \"SHUFFLE_BYTES_TO_DISK\",\n" + + " \"counterName\" : \"SHUFFLE_BYTES_TO_DISK\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"SHUFFLE_BYTES_DISK_DIRECT\",\n" + + " \"counterName\" : \"SHUFFLE_BYTES_DISK_DIRECT\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"NUM_MEM_TO_DISK_MERGES\",\n" + + " \"counterName\" : \"NUM_MEM_TO_DISK_MERGES\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"NUM_DISK_TO_DISK_MERGES\",\n" + + " \"counterName\" : \"NUM_DISK_TO_DISK_MERGES\",\n" + + " \"counterValue\" : 0\n" + + " }\n" + + " ]\n" + + " },\n" + + " { \"counterGroupDisplayName\" : \"HIVE\",\n" + + " \"counterGroupName\" : \"HIVE\",\n" + + " \"counters\" : [ { \"counterDisplayName\" : \"CREATED_FILES\",\n" + + " \"counterName\" : \"CREATED_FILES\",\n" + + " \"counterValue\" : 1\n" + + " },\n" + + " { \"counterDisplayName\" : \"DESERIALIZE_ERRORS\",\n" + + " \"counterName\" : \"DESERIALIZE_ERRORS\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"RECORDS_IN_Map_1\",\n" + + " \"counterName\" : \"RECORDS_IN_Map_1\",\n" + + " \"counterValue\" : 3\n" + + " },\n" + + " { \"counterDisplayName\" : \"RECORDS_OUT_INTERMEDIATE_Map_1\",\n" + + " \"counterName\" : \"RECORDS_OUT_INTERMEDIATE_Map_1\",\n" + + " \"counterValue\" : 1\n" + + " },\n" + + " { \"counterDisplayName\" : \"RECORDS_OUT_Reducer_2\",\n" + + " \"counterName\" : \"RECORDS_OUT_Reducer_2\",\n" + + " \"counterValue\" : 1\n" + + " }\n" + + " ]\n" + + " },\n" + + " { \"counterGroupDisplayName\" : \"Shuffle Errors\",\n" + + " \"counterGroupName\" : \"Shuffle Errors\",\n" + + " \"counters\" : [ { \"counterDisplayName\" : \"BAD_ID\",\n" + + " \"counterName\" : \"BAD_ID\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"CONNECTION\",\n" + + " \"counterName\" : \"CONNECTION\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"IO_ERROR\",\n" + + " \"counterName\" : \"IO_ERROR\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"WRONG_LENGTH\",\n" + + " \"counterName\" : \"WRONG_LENGTH\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"WRONG_MAP\",\n" + + " \"counterName\" : \"WRONG_MAP\",\n" + + " \"counterValue\" : 0\n" + + " },\n" + + " { \"counterDisplayName\" : \"WRONG_REDUCE\",\n" + + " \"counterName\" : \"WRONG_REDUCE\",\n" + + " \"counterValue\" : 0\n" + + " }\n" + + " ]\n" + + " }\n" + + " ] },\n" + + " \"dagPlan\" : { \"dagName\" : \"hive_20150209144848_c3a5a07b-c3b6-4f57-a6d5-3dadecdd6fd0:4\",\n" + + " \"edges\" : [ { \"dataMovementType\" : \"SCATTER_GATHER\",\n" + + " \"dataSourceType\" : \"PERSISTED\",\n" + + " \"edgeDestinationClass\" : \"org.apache.tez.runtime.library.input.OrderedGroupedKVInput\",\n" + + " \"edgeId\" : \"533454263\",\n" + + " \"edgeSourceClass\" : \"org.apache.tez.runtime.library.output.OrderedPartitionedKVOutput\",\n" + + " \"inputVertexName\" : \"Map 1\",\n" + + " \"outputVertexName\" : \"Reducer 2\",\n" + + " \"schedulingType\" : \"SEQUENTIAL\"\n" + + " } ],\n" + + " \"version\" : 1,\n" + + " \"vertices\" : [ { \"additionalInputs\" : [ { \"class\" : \"org.apache.tez.mapreduce.input.MRInputLegacy\",\n" + + " \"initializer\" : \"org.apache.hadoop.hive.ql.exec.tez.HiveSplitGenerator\",\n" + + " \"name\" : \"z\"\n" + + " } ],\n" + + " \"outEdgeIds\" : [ \"533454263\" ],\n" + + " \"processorClass\" : \"org.apache.hadoop.hive.ql.exec.tez.MapTezProcessor\",\n" + + " \"vertexName\" : \"Map 1\"\n" + + " },\n" + + " { \"additionalOutputs\" : [ { \"class\" : \"org.apache.tez.mapreduce.output.MROutput\",\n" + + " \"name\" : \"out_Reducer 2\"\n" + + " } ],\n" + + " \"inEdgeIds\" : [ \"533454263\" ],\n" + + " \"processorClass\" : \"org.apache.hadoop.hive.ql.exec.tez.ReduceTezProcessor\",\n" + + " \"vertexName\" : \"Reducer 2\"\n" + + " }\n" + + " ]\n" + + " },\n" + + " \"diagnostics\" : \"\",\n" + + " \"endTime\" : 1423493342484,\n" + + " \"initTime\" : 1423493325794,\n" + + " \"numCompletedTasks\" : 2,\n" + + " \"numFailedTaskAttempts\" : 0,\n" + + " \"numFailedTasks\" : 0,\n" + + " \"numKilledTaskAttempts\" : 0,\n" + + " \"numKilledTasks\" : 0,\n" + + " \"numSucceededTasks\" : 2,\n" + + " \"startTime\" : 1423493325803,\n" + + " \"status\" : \"SUCCEEDED\",\n" + + " \"timeTaken\" : 16681,\n" + + " \"vertexNameIdMapping\" : { \"Map 1\" : \"vertex_1423156117563_0005_2_00\",\n" + + " \"Reducer 2\" : \"vertex_1423156117563_0005_2_01\"\n" + + " }\n" + + " },\n" + + " \"primaryfilters\" : { \"applicationId\" : [ \"application_1423156117563_0005\" ],\n" + + " \"dagName\" : [ \"hive_20150209144848_c3a5a07b-c3b6-4f57-a6d5-3dadecdd6fd0:4\" ],\n" + + " \"status\" : [ \"SUCCEEDED\" ],\n" + + " \"user\" : [ \"hive\" ]\n" + + " },\n" + + " \"relatedentities\" : { },\n" + + " \"starttime\" : 1423493325578\n" + + " } ] }" + ); + } + } +} \ No newline at end of file