azkaban-aplcache

Added parsing of job_ids and job tracker links for non-Pig or

1/16/2014 9:05:54 PM

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>
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;
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");