azkaban-developers
Changes
src/web/js/azkaban/model/log-data.js 23(+22 -1)
src/web/js/azkaban/view/job-details.js 24(+24 -0)
Details
diff --git a/src/java/azkaban/webapp/servlet/velocity/jobdetailspage.vm b/src/java/azkaban/webapp/servlet/velocity/jobdetailspage.vm
index 077c9ab..ad579ce 100644
--- a/src/java/azkaban/webapp/servlet/velocity/jobdetailspage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/jobdetailspage.vm
@@ -162,6 +162,13 @@
</tbody>
</table>
</div>
+
+ <div id="jobIds">
+ <h4>Map Reduce Jobs</h4>
+ <table class="table table-striped table-bordered table-hover">
+ <tbody id="jobIdsTableBody"></tbody>
+ </table>
+ </div>
</div>
</div>
</div>
src/web/js/azkaban/model/log-data.js 23(+22 -1)
diff --git a/src/web/js/azkaban/model/log-data.js b/src/web/js/azkaban/model/log-data.js
index 518e9bd..90a958f 100644
--- a/src/web/js/azkaban/model/log-data.js
+++ b/src/web/js/azkaban/model/log-data.js
@@ -24,6 +24,8 @@ azkaban.LogDataModel = Backbone.Model.extend({
HIVE_MAP_REDUCE_JOBS_SUMMARY: "MapReduce Jobs Launched:",
HIVE_MAP_REDUCE_SUMMARY_REGEX: /Job (\d+):\s+Map: (\d+)\s+Reduce: (\d+)\s+(?:Cumulative CPU: (.+?))?\s+HDFS Read: (\d+)\s+HDFS Write: (\d+)/,
+ JOB_ID_REGEX: /job_\d{12}_\d{4,}/,
+
initialize: function() {
this.set("offset", 0 );
this.set("logData", "");
@@ -91,8 +93,8 @@ azkaban.LogDataModel = Backbone.Model.extend({
var lines = data.split("\n");
if (this.parseCommand(lines)) {
- this.parseJobTrackerUrls(lines);
this.parseJobType(lines);
+ this.parseJobTrackerUrls(lines);
var jobType = this.get("jobType");
if (jobType) {
@@ -101,6 +103,8 @@ azkaban.LogDataModel = Backbone.Model.extend({
this.parsePigTable(lines, "pigStats", this.PIG_JOB_STATS_START, "", 1);
} else if (jobType.indexOf("hive") !== -1) {
this.parseHiveQueries(lines);
+ } else {
+ this.parseJobIds(lines);
}
}
}
@@ -166,6 +170,23 @@ azkaban.LogDataModel = Backbone.Model.extend({
this.set("jobTrackerUrlsOrdered", jobTrackerUrlsOrdered);
},
+ parseJobIds: function(lines) {
+ var seenJobIds = {};
+ var jobIds = [];
+ var numLines = lines.length;
+ var match;
+ for (var i = 0; i < numLines; i++) {
+ if ((match = this.JOB_ID_REGEX.exec(lines[i])) && !seenJobIds[match[0]]) {
+ seenJobIds[match[0]] = true;
+ jobIds.push(match[0]);
+ }
+ }
+
+ if (jobIds.length > 0) {
+ this.set("jobIds", jobIds);
+ }
+ },
+
parseJobType: function(lines) {
var numLines = lines.length;
var match;
src/web/js/azkaban/view/job-details.js 24(+24 -0)
diff --git a/src/web/js/azkaban/view/job-details.js b/src/web/js/azkaban/view/job-details.js
index 3bac395..07b823e 100644
--- a/src/web/js/azkaban/view/job-details.js
+++ b/src/web/js/azkaban/view/job-details.js
@@ -50,12 +50,14 @@ azkaban.JobSummaryView = Backbone.View.extend({
$("#pigJobSummary").hide();
$("#pigJobStats").hide();
$("#hiveJobSummary").hide();
+ $("#jobIds").hide();
this.listenTo(this.model, "change:jobType", this.renderJobTypeTable);
this.listenTo(this.model, "change:commandProperties", this.renderCommandTable);
this.listenTo(this.model, "change:pigSummary", this.renderPigSummaryTable);
this.listenTo(this.model, "change:pigStats", this.renderPigStatsTable);
this.listenTo(this.model, "change:hiveSummary", this.renderHiveTable);
+ this.listenTo(this.model, "change:jobIds", this.renderJobIdsTable);
},
refresh: function() {
@@ -85,6 +87,28 @@ azkaban.JobSummaryView = Backbone.View.extend({
$("#jobType").show();
},
+ renderJobIdsTable: function() {
+ var oldBody = $("#jobIdsTableBody");
+ var newBody = $(document.createElement("tbody")).attr("id", "jobIdsTableBody");
+
+ var jobIds = this.model.get("jobIds");
+ var jobUrls = this.model.get("jobTrackerUrls");
+ var numJobs = jobIds.length;
+ for (var i = 0; i < numJobs; i++) {
+ var job = jobIds[i];
+ var tr = document.createElement("tr");
+ var td = document.createElement("td");
+ var html = jobUrls[job] ? "<a href='" + jobUrls[job] + "'>" + job + "</a>" : job;
+ $(td).html(html);
+ $(tr).append(td);
+ newBody.append(tr);
+ }
+
+ oldBody.replaceWith(newBody);
+
+ $("#jobIds").show();
+ },
+
renderCommandTable: function() {
var commandTable = $("#commandTable");
var commandProperties = this.model.get("commandProperties");