Skip to content
This repository was archived by the owner on Mar 3, 2023. It is now read-only.

Commit d8db1c5

Browse files
authored
Add parallelism calculator in Heron UI (#3401)
1 parent ae2d1f7 commit d8db1c5

File tree

3 files changed

+110
-8
lines changed

3 files changed

+110
-8
lines changed

heron/tools/ui/resources/static/css/main.css

+7-1
Original file line numberDiff line numberDiff line change
@@ -2291,4 +2291,10 @@ div#topologydetails.display-stats div.display-info.display-stats,
22912291
div#topologydetails.display-counters div.display-info.display-counters,
22922292
div#topologydetails.display-config div.display-info.display-config {
22932293
display: block;
2294-
}
2294+
}
2295+
2296+
/* Backdrop in bootstrap 3 seems to have solid color and we would like it to be half transparent */
2297+
div.modal-backdrop.fade.in {
2298+
opacity: 0.5;
2299+
filter: alpha(opacity=50);
2300+
}

heron/tools/ui/resources/static/js/topologies.js

+44-7
Original file line numberDiff line numberDiff line change
@@ -1067,8 +1067,34 @@ var BoltRunningInfo = React.createClass({
10671067
});
10681068
var setState = this.setState.bind(this);
10691069

1070-
const headings = ["Bolt", "Parallelism", "Execute Count", "Failure Count",
1071-
"Capacity Utilization(min)", "Capacity Utilization(max)"];
1070+
const headings = [
1071+
{ name: "Bolt", sortable: true },
1072+
{ name: "Parallelism", sortable: true },
1073+
{ name: "Execute Count", sortable: true },
1074+
{ name: "Failure Count", sortable: true },
1075+
{ name: "Capacity Utilization(min)", sortable: true },
1076+
{ name: "Capacity Utilization(max)", sortable: true },
1077+
{ name: "Parallelism Calculator", sortable: false }
1078+
];
1079+
1080+
var openParallelismCalculator = function (e, index) {
1081+
var row = rows[index];
1082+
1083+
var calculator = $("#parallelism-calculator-modal");
1084+
calculator.find('#modal-component').text(row[0]);
1085+
calculator.attr('data-execute-count', row[2]);
1086+
calculator.find('#modal-execute-count').text(row[2]);
1087+
calculator.find('#target-execute-count').val(row[2]);
1088+
calculator.attr('data-max-utilization', row[5].replace("%", ""));
1089+
calculator.find('#modal-max-utilization').text(row[5]);
1090+
calculator.find('#target-max-utilization').val(row[5].replace("%", ""));
1091+
calculator.attr('data-parallelism', row[1]);
1092+
calculator.find('#modal-parallelism').text(row[1]);
1093+
calculator.find('#target-parallelism').val(row[1]);
1094+
1095+
calculator.modal({keyboard: true});
1096+
};
1097+
10721098
return (
10731099
<div id="componentrunninginfo">
10741100
<div className="widget-header">
@@ -1100,16 +1126,27 @@ var BoltRunningInfo = React.createClass({
11001126
reverse: i === sortKey ? (!reverse) : true
11011127
});
11021128
}
1103-
return <th key={i} className={classNameVals} onClick={clicked}>{heading}</th>;
1129+
1130+
if (heading.sortable) {
1131+
return <th key={i} className={classNameVals} onClick={clicked}>{heading.name}</th>;
1132+
} else {
1133+
return <th key={i}>{heading.name}</th>;
1134+
}
11041135
})}
11051136
</tr>
11061137
</thead>
11071138
<tbody>
1108-
{rows.map(function (row) {
1139+
{rows.map(function (row, index) {
11091140
return <tr key={row[0]}>{
1110-
row.map(function (value, i) {
1111-
return <td className="col-md-2" key={i}>{value}</td>;
1112-
})}</tr>;
1141+
row.map(function (value, i) {
1142+
return <td className="col-md-2" key={i}>{value}</td>;
1143+
})}
1144+
<td className="col-md-1">
1145+
<button type="button" className="btn btn-primary btn-xs" data-toggle="modal"
1146+
onClick={(e) => openParallelismCalculator(e, index)}>
1147+
Calculator
1148+
</button>
1149+
</td></tr>;
11131150
})}
11141151
</tbody>
11151152
</table>

heron/tools/ui/resources/templates/topology.html

+59
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,49 @@ <h4 class="space-above">
182182
<div class="col-md-12">
183183
<div id="display-counters"></div>
184184
</div>
185+
<!-- Popup dialog for parallelism calculator -->
186+
<div class="modal fade" id="parallelism-calculator-modal" tabindex="-1" role="dialog" aria-labelledby="parallelismCalculatorModalLabel" aria-hidden="true">
187+
<div class="modal-dialog modal-sm" role="document">
188+
<div class="modal-content">
189+
<div class="modal-header">
190+
<h5 class="modal-title" id="exampleModalLabel">Parallelism Calculator: <span id="modal-component"></span></h5>
191+
</div>
192+
<div class="modal-body">
193+
<form class="form-horizontal">
194+
<h3 id="modal-component"></h3>
195+
<div class="form-group">
196+
<label class="col-sm-8 control-label" for="target-execute-count">
197+
Target execute count (current: <b id="modal-execute-count"></b>)</label>
198+
<div class="col-sm-4">
199+
<input id="target-execute-count" class="form-control form-control-sm" value="100"></input>
200+
</div>
201+
</div>
202+
<div class="form-group">
203+
<label class="col-sm-8 control-label" for="target-max-utilization">
204+
Target max capacity utilization (current: <b id="modal-max-utilization"></b>)</label>
205+
<div class="col-sm-3">
206+
<input id="target-max-utilization" class="form-control form-control-sm" value=50 max=100 min=1></input>
207+
</div>
208+
<span class="col-sm-1 control-label">%</span>
209+
</div>
210+
<div class="form-group">
211+
<label class="col-sm-8 control-label" for="target-parallelism">
212+
Target parallelism (current: <b id="modal-parallelism"></b>)</label>
213+
<div class="col-sm-4">
214+
<input id="target-parallelism" class="form-control form-control-sm" readonly=true value="3"></input>
215+
</div>
216+
</div>
217+
</form>
218+
</div>
219+
<div class="modal-footer">
220+
<button type="button" class="btn btn-default" onclick="calculateParallelism()">Calculate</button>
221+
<button type="button" class="btn btn-primary" data-dismiss="modal">Close</button>
222+
</div>
223+
</div>
224+
</div>
225+
</div>
185226
</div>
227+
186228
<!-- Config -->
187229
<div class="col-md-12">
188230
<div class="col-md-12">
@@ -204,6 +246,23 @@ <h4 class="space-above">
204246
<script type="text/jsx" src="{{ static_url('js/topologies.js') }}" ></script>
205247
<script type="text/jsx" src="{{ static_url('js/config.js') }}"></script>
206248

249+
<script type="application/javascript">
250+
function calculateParallelism() {
251+
var calculator = $("#parallelism-calculator-modal");
252+
253+
var execute_count = calculator.attr("data-execute-count");
254+
var max_utilization = calculator.attr("data-max-utilization");
255+
var parallelism = calculator.attr("data-parallelism");
256+
var target_execute_count = calculator.find('#target-execute-count').val();
257+
var target_max_utilization = calculator.find('#target-max-utilization').val();
258+
259+
// Estimate the target parallelism based on the current information.
260+
var newParallelism = max_utilization * target_execute_count * parallelism /
261+
(execute_count * target_max_utilization);
262+
calculator.find('#target-parallelism').val(Math.ceil(newParallelism));
263+
}
264+
</script>
265+
207266
<script type="application/javascript">
208267

209268
// colors used shading nodes in logical and physical plan

0 commit comments

Comments
 (0)