├── .gitignore ├── LICENSE ├── README.md ├── examples ├── example.css ├── example.html ├── example.js ├── example2.html ├── example2.js ├── example3.html ├── example3.js ├── external-data-examples │ ├── example.css │ ├── example.html │ ├── example.js │ └── example.json ├── screenshot1.png └── screenshot2.png ├── gantt-chart-d3.js ├── job-tracker-parser.js ├── jobtracker.jsp └── lib └── d3 ├── LICENSE └── d3.v3.min.js /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Package Files # 4 | *.jar 5 | *.war 6 | *.ear 7 | 8 | # eclipse project files. 9 | .classpath 10 | .project 11 | .settings 12 | 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2012 Dimitry Kudryavtsev (dk8996 at gmail.com) 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Introduction 2 | A basic implementation of a Gantt Chart using D3.js. Here is an example [Example 1] (http://bl.ocks.org/dk8996/5534835) and another one [Example 2] (http://bl.ocks.org/dk8996/5449641). 3 | 4 | ![screenshot](https://raw.github.com/dk8996/Gantt-Chart/master/examples/screenshot1.png) 5 | 6 | #### External Data Example 7 | Here is an [example] (http://static.mentful.com/d3ganttchart/example.html) of loading external data, in JSON format, into the Gantt Chart, you need to watch out for [cross-domain restrictions] (http://en.wikipedia.org/wiki/Same-origin_policy). 8 | 9 | ## Getting Started 10 | ### Data 11 | Create an array of all your data. 12 | 13 | ```javascript 14 | var tasks = [ 15 | 16 | { 17 | "startDate": new Date("Sun Dec 09 01:36:45 EST 2012"), 18 | "endDate": new Date("Sun Dec 09 02:36:45 EST 2012"), 19 | "taskName": "E Job", 20 | "status": "FAILED" 21 | }, 22 | 23 | { 24 | "startDate": new Date("Sun Dec 09 04:56:32 EST 2012"), 25 | "endDate": new Date("Sun Dec 09 06:35:47 EST 2012"), 26 | "taskName": "A Job", 27 | "status": "RUNNING" 28 | }]; 29 | 30 | ``` 31 | 32 | ### Style 33 | Create a map between task status and css class, this is optional. 34 | 35 | ```javascript 36 | var taskStatus = { 37 | "SUCCEEDED": "bar", 38 | "FAILED": "bar-failed", 39 | "RUNNING": "bar-running", 40 | "KILLED": "bar-killed" 41 | }; 42 | ``` 43 | 44 | ```css 45 | .bar { 46 | fill: #33b5e5; 47 | } 48 | 49 | .bar-failed { 50 | fill: #CC0000; 51 | } 52 | 53 | .bar-running { 54 | fill: #669900; 55 | } 56 | 57 | .bar-succeeded { 58 | fill: #33b5e5; 59 | } 60 | 61 | .bar-killed { 62 | fill: #ffbb33; 63 | } 64 | ``` 65 | ### Task Names 66 | Create an array of task names, they will be display on they y-axis in the order given to the array. 67 | 68 | ```javascript 69 | var taskNames = [ "D Job", "P Job", "E Job", "A Job", "N Job" ]; 70 | ``` 71 | 72 | ### Create a Simple Gantt-Chart 73 | Create a simple Gantt-Chart 74 | 75 | ```javascript 76 | var gantt = d3.gantt().taskTypes(taskNames).taskStatus(taskStatus); 77 | gantt(tasks); 78 | ``` 79 | 80 | ## Dependencies & Building 81 | Relies on the fantastic [D3 visualization library](http://mbostock.github.com/d3/) to do lots of the heavy lifting for stacking and rendering to SVG. 82 | 83 | ## License 84 | 85 | Copyright 2012 Dimitry Kudryavtsev 86 | 87 | Licensed under the Apache License, Version 2.0 (the "License"); 88 | you may not use this file except in compliance with the License. 89 | You may obtain a copy of the License at 90 | 91 | http://www.apache.org/licenses/LICENSE-2.0 92 | 93 | Unless required by applicable law or agreed to in writing, software 94 | distributed under the License is distributed on an "AS IS" BASIS, 95 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 96 | See the License for the specific language governing permissions and 97 | limitations under the License. 98 | 99 | -------------------------------------------------------------------------------- /examples/example.css: -------------------------------------------------------------------------------- 1 | html,body,#wrapper { 2 | width: 100%; 3 | height: 100%; 4 | margin: 0px; 5 | } 6 | 7 | .chart { 8 | font-family: Arial, sans-serif; 9 | font-size: 12px; 10 | } 11 | 12 | .axis path,.axis line { 13 | fill: none; 14 | stroke: #000; 15 | shape-rendering: crispEdges; 16 | } 17 | 18 | .bar { 19 | fill: #33b5e5; 20 | } 21 | 22 | .bar-failed { 23 | fill: #CC0000; 24 | } 25 | 26 | .bar-running { 27 | fill: #669900; 28 | } 29 | 30 | .bar-succeeded { 31 | fill: #33b5e5; 32 | } 33 | 34 | .bar-killed { 35 | fill: #ffbb33; 36 | } 37 | 38 | #forkme_banner { 39 | display: block; 40 | position: absolute; 41 | top: 0; 42 | right: 10px; 43 | z-index: 10; 44 | padding: 10px 50px 10px 10px; 45 | color: #fff; 46 | background: 47 | url('http://dk8996.github.io/Gantt-Chart/images/blacktocat.png') 48 | #0090ff no-repeat 95% 50%; 49 | font-weight: 700; 50 | box-shadow: 0 0 10px rgba(0, 0, 0, .5); 51 | border-bottom-left-radius: 2px; 52 | border-bottom-right-radius: 2px; 53 | text-decoration: none; 54 | } 55 | 56 | #twittme_banner { 57 | display: block; 58 | position: absolute; 59 | top: 0; 60 | right: 180px; 61 | z-index: 10; 62 | padding: 10px 50px 10px 10px; 63 | color: #fff; 64 | background: 65 | url('http://dk8996.github.io/Gantt-Chart/images/twitter.png') 66 | #0090ff no-repeat 95% 50%; 67 | font-weight: 700; 68 | box-shadow: 0 0 10px rgba(0, 0, 0, .5); 69 | border-bottom-left-radius: 2px; 70 | border-bottom-right-radius: 2px; 71 | text-decoration: none; 72 | } 73 | -------------------------------------------------------------------------------- /examples/example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Gantt Chart Example 1 5 | 6 | 7 | 8 | 9 | View on GitHub 10 | Share on Twitter 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /examples/example.js: -------------------------------------------------------------------------------- 1 | example(); 2 | 3 | function example() { 4 | 5 | var tasks = [ 6 | {"startDate":new Date("Sun Dec 09 01:36:45 EST 2012"),"endDate":new Date("Sun Dec 09 02:36:45 EST 2012"),"taskName":"E Job","status":"RUNNING"}, 7 | {"startDate":new Date("Sun Dec 09 04:56:32 EST 2012"),"endDate":new Date("Sun Dec 09 06:35:47 EST 2012"),"taskName":"A Job","status":"RUNNING"}, 8 | {"startDate":new Date("Sun Dec 09 06:29:53 EST 2012"),"endDate":new Date("Sun Dec 09 06:34:04 EST 2012"),"taskName":"D Job","status":"RUNNING"}, 9 | {"startDate":new Date("Sun Dec 09 05:35:21 EST 2012"),"endDate":new Date("Sun Dec 09 06:21:22 EST 2012"),"taskName":"P Job","status":"RUNNING"}, 10 | {"startDate":new Date("Sun Dec 09 05:00:06 EST 2012"),"endDate":new Date("Sun Dec 09 05:05:07 EST 2012"),"taskName":"D Job","status":"RUNNING"}, 11 | {"startDate":new Date("Sun Dec 09 03:46:59 EST 2012"),"endDate":new Date("Sun Dec 09 04:54:19 EST 2012"),"taskName":"P Job","status":"RUNNING"}, 12 | {"startDate":new Date("Sun Dec 09 04:02:45 EST 2012"),"endDate":new Date("Sun Dec 09 04:48:56 EST 2012"),"taskName":"N Job","status":"RUNNING"}, 13 | {"startDate":new Date("Sun Dec 09 03:27:35 EST 2012"),"endDate":new Date("Sun Dec 09 03:58:43 EST 2012"),"taskName":"E Job","status":"SUCCEEDED"}, 14 | {"startDate":new Date("Sun Dec 09 01:40:11 EST 2012"),"endDate":new Date("Sun Dec 09 03:26:35 EST 2012"),"taskName":"A Job","status":"SUCCEEDED"}, 15 | {"startDate":new Date("Sun Dec 09 03:00:03 EST 2012"),"endDate":new Date("Sun Dec 09 03:09:51 EST 2012"),"taskName":"D Job","status":"SUCCEEDED"}, 16 | {"startDate":new Date("Sun Dec 09 01:21:00 EST 2012"),"endDate":new Date("Sun Dec 09 02:51:42 EST 2012"),"taskName":"P Job","status":"SUCCEEDED"}, 17 | {"startDate":new Date("Sun Dec 09 01:08:42 EST 2012"),"endDate":new Date("Sun Dec 09 01:33:42 EST 2012"),"taskName":"N Job","status":"FAILED"}, 18 | {"startDate":new Date("Sun Dec 09 00:27:15 EST 2012"),"endDate":new Date("Sun Dec 09 00:54:56 EST 2012"),"taskName":"E Job","status":"SUCCEEDED"}, 19 | {"startDate":new Date("Sun Dec 09 00:29:48 EST 2012"),"endDate":new Date("Sun Dec 09 00:44:50 EST 2012"),"taskName":"D Job","status":"SUCCEEDED"}, 20 | {"startDate":new Date("Sun Dec 09 07:39:21 EST 2012"),"endDate":new Date("Sun Dec 09 07:43:22 EST 2012"),"taskName":"P Job","status":"RUNNING"}, 21 | {"startDate":new Date("Sun Dec 09 07:00:06 EST 2012"),"endDate":new Date("Sun Dec 09 07:05:07 EST 2012"),"taskName":"D Job","status":"RUNNING"}, 22 | {"startDate":new Date("Sun Dec 09 08:46:59 EST 2012"),"endDate":new Date("Sun Dec 09 09:54:19 EST 2012"),"taskName":"P Job","status":"RUNNING"}, 23 | {"startDate":new Date("Sun Dec 09 09:02:45 EST 2012"),"endDate":new Date("Sun Dec 09 09:48:56 EST 2012"),"taskName":"N Job","status":"RUNNING"}, 24 | {"startDate":new Date("Sun Dec 09 08:27:35 EST 2012"),"endDate":new Date("Sun Dec 09 08:58:43 EST 2012"),"taskName":"E Job","status":"SUCCEEDED"}, 25 | {"startDate":new Date("Sun Dec 09 08:40:11 EST 2012"),"endDate":new Date("Sun Dec 09 08:46:35 EST 2012"),"taskName":"A Job","status":"SUCCEEDED"}, 26 | {"startDate":new Date("Sun Dec 09 08:00:03 EST 2012"),"endDate":new Date("Sun Dec 09 08:09:51 EST 2012"),"taskName":"D Job","status":"SUCCEEDED"}, 27 | {"startDate":new Date("Sun Dec 09 10:21:00 EST 2012"),"endDate":new Date("Sun Dec 09 10:51:42 EST 2012"),"taskName":"P Job","status":"SUCCEEDED"}, 28 | {"startDate":new Date("Sun Dec 09 11:08:42 EST 2012"),"endDate":new Date("Sun Dec 09 11:33:42 EST 2012"),"taskName":"N Job","status":"FAILED"}, 29 | {"startDate":new Date("Sun Dec 09 12:27:15 EST 2012"),"endDate":new Date("Sun Dec 09 12:54:56 EST 2012"),"taskName":"E Job","status":"SUCCEEDED"}, 30 | {"startDate":new Date("Sat Dec 08 23:12:24 EST 2012"),"endDate":new Date("Sun Dec 09 00:26:13 EST 2012"),"taskName":"A Job","status":"KILLED"}]; 31 | 32 | var taskStatus = { 33 | "SUCCEEDED" : "bar", 34 | "FAILED" : "bar-failed", 35 | "RUNNING" : "bar-running", 36 | "KILLED" : "bar-killed" 37 | }; 38 | 39 | var taskNames = [ "D Job", "P Job", "E Job", "A Job", "N Job" ]; 40 | 41 | tasks.sort(function(a, b) { 42 | return a.endDate - b.endDate; 43 | }); 44 | var maxDate = tasks[tasks.length - 1].endDate; 45 | tasks.sort(function(a, b) { 46 | return a.startDate - b.startDate; 47 | }); 48 | var minDate = tasks[0].startDate; 49 | 50 | var format = "%H:%M"; 51 | 52 | var gantt = d3.gantt().taskTypes(taskNames).taskStatus(taskStatus).tickFormat(format); 53 | gantt(tasks); 54 | 55 | }; 56 | 57 | -------------------------------------------------------------------------------- /examples/example2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Gantt Chart Example 2 5 | 6 | 7 | 8 | 9 | View on GitHub 10 | Share on Twitter 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /examples/example2.js: -------------------------------------------------------------------------------- 1 | example(); 2 | function example() { 3 | 4 | var tasks = [ 5 | {"startDate":new Date("Sun Dec 09 01:36:45 EST 2012"),"endDate":new Date("Sun Dec 09 02:36:45 EST 2012"),"taskName":"E Job","status":"RUNNING"}]; 6 | 7 | var taskStatus = { 8 | "SUCCEEDED" : "bar", 9 | "FAILED" : "bar-failed", 10 | "RUNNING" : "bar-running", 11 | "KILLED" : "bar-killed" 12 | }; 13 | 14 | var taskNames = [ "D Job", "P Job", "E Job", "A Job", "N Job" ]; 15 | 16 | tasks.sort(function(a, b) { 17 | return a.endDate - b.endDate; 18 | }); 19 | var maxDate = tasks[tasks.length - 1].endDate; 20 | tasks.sort(function(a, b) { 21 | return a.startDate - b.startDate; 22 | }); 23 | var minDate = tasks[0].startDate; 24 | 25 | var format = "%H:%M"; 26 | 27 | var gantt = d3.gantt().taskTypes(taskNames).taskStatus(taskStatus).tickFormat(format); 28 | //gantt.timeDomain([new Date("Sun Dec 09 04:54:19 EST 2012"),new Date("Sun Jan 09 04:54:19 EST 2013")]); 29 | //gantt.timeDomainMode("fixed"); 30 | gantt(tasks); 31 | 32 | 33 | example.addTask = function() { 34 | 35 | var lastEndDate = Date.now(); 36 | if (tasks.length > 0) { 37 | lastEndDate = tasks[tasks.length - 1].endDate; 38 | } 39 | 40 | var taskStatusKeys = Object.keys(taskStatus); 41 | var taskStatusName = taskStatusKeys[Math.floor(Math.random()*taskStatusKeys.length)]; 42 | var taskName = taskNames[Math.floor(Math.random()*taskNames.length)]; 43 | 44 | tasks.push({"startDate":d3.time.hour.offset(lastEndDate,Math.ceil(1*Math.random())),"endDate":d3.time.hour.offset(lastEndDate,(Math.ceil(Math.random()*3))+1),"taskName":taskName,"status":taskStatusName}); 45 | gantt.redraw(tasks); 46 | }; 47 | 48 | example.removeTask = function() { 49 | tasks.pop(); 50 | gantt.redraw(tasks); 51 | }; 52 | 53 | }; 54 | -------------------------------------------------------------------------------- /examples/example3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Gantt Chart Example 3 5 | 6 | 7 | 8 | 9 | View on GitHub 10 | Share on Twitter 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /examples/example3.js: -------------------------------------------------------------------------------- 1 | var tasks = [ 2 | {"startDate":new Date("Sun Dec 09 01:36:45 EST 2012"),"endDate":new Date("Sun Dec 09 02:36:45 EST 2012"),"taskName":"E Job","status":"RUNNING"}]; 3 | 4 | var taskStatus = { 5 | "SUCCEEDED" : "bar", 6 | "FAILED" : "bar-failed", 7 | "RUNNING" : "bar-running", 8 | "KILLED" : "bar-killed" 9 | }; 10 | 11 | var taskNames = [ "D Job", "P Job", "E Job", "A Job", "N Job" ]; 12 | 13 | tasks.sort(function(a, b) { 14 | return a.endDate - b.endDate; 15 | }); 16 | var maxDate = tasks[tasks.length - 1].endDate; 17 | tasks.sort(function(a, b) { 18 | return a.startDate - b.startDate; 19 | }); 20 | var minDate = tasks[0].startDate; 21 | 22 | var format = "%H:%M"; 23 | var timeDomainString = "1day"; 24 | 25 | var gantt = d3.gantt().taskTypes(taskNames).taskStatus(taskStatus).tickFormat(format); 26 | 27 | var margin = { 28 | top : 20, 29 | right : 40, 30 | bottom : 20, 31 | left : 80 32 | }; 33 | gantt.margin(margin); 34 | 35 | gantt.timeDomainMode("fixed"); 36 | changeTimeDomain(timeDomainString); 37 | 38 | gantt(tasks); 39 | 40 | function changeTimeDomain(timeDomainString) { 41 | this.timeDomainString = timeDomainString; 42 | switch (timeDomainString) { 43 | case "1hr": 44 | format = "%H:%M:%S"; 45 | gantt.timeDomain([ d3.time.hour.offset(getEndDate(), -1), getEndDate() ]); 46 | break; 47 | case "3hr": 48 | format = "%H:%M"; 49 | gantt.timeDomain([ d3.time.hour.offset(getEndDate(), -3), getEndDate() ]); 50 | break; 51 | 52 | case "6hr": 53 | format = "%H:%M"; 54 | gantt.timeDomain([ d3.time.hour.offset(getEndDate(), -6), getEndDate() ]); 55 | break; 56 | 57 | case "1day": 58 | format = "%H:%M"; 59 | gantt.timeDomain([ d3.time.day.offset(getEndDate(), -1), getEndDate() ]); 60 | break; 61 | 62 | case "1week": 63 | format = "%a %H:%M"; 64 | gantt.timeDomain([ d3.time.day.offset(getEndDate(), -7), getEndDate() ]); 65 | break; 66 | default: 67 | format = "%H:%M" 68 | 69 | } 70 | gantt.tickFormat(format); 71 | gantt.redraw(tasks); 72 | } 73 | 74 | function getEndDate() { 75 | var lastEndDate = Date.now(); 76 | if (tasks.length > 0) { 77 | lastEndDate = tasks[tasks.length - 1].endDate; 78 | } 79 | 80 | return lastEndDate; 81 | } 82 | 83 | function addTask() { 84 | 85 | var lastEndDate = getEndDate(); 86 | var taskStatusKeys = Object.keys(taskStatus); 87 | var taskStatusName = taskStatusKeys[Math.floor(Math.random() * taskStatusKeys.length)]; 88 | var taskName = taskNames[Math.floor(Math.random() * taskNames.length)]; 89 | 90 | tasks.push({ 91 | "startDate" : d3.time.hour.offset(lastEndDate, Math.ceil(1 * Math.random())), 92 | "endDate" : d3.time.hour.offset(lastEndDate, (Math.ceil(Math.random() * 3)) + 1), 93 | "taskName" : taskName, 94 | "status" : taskStatusName 95 | }); 96 | 97 | changeTimeDomain(timeDomainString); 98 | gantt.redraw(tasks); 99 | }; 100 | 101 | function removeTask() { 102 | tasks.pop(); 103 | changeTimeDomain(timeDomainString); 104 | gantt.redraw(tasks); 105 | }; 106 | -------------------------------------------------------------------------------- /examples/external-data-examples/example.css: -------------------------------------------------------------------------------- 1 | html,body,#wrapper { 2 | width: 100%; 3 | height: 100%; 4 | margin: 0px; 5 | } 6 | 7 | .chart { 8 | font-family: Arial, sans-serif; 9 | font-size: 12px; 10 | } 11 | 12 | .axis path,.axis line { 13 | fill: none; 14 | stroke: #000; 15 | shape-rendering: crispEdges; 16 | } 17 | 18 | .bar { 19 | fill: #33b5e5; 20 | } 21 | 22 | .bar-red { 23 | fill: #CC0000; 24 | } 25 | 26 | .bar-green { 27 | fill: #669900; 28 | } 29 | 30 | .bar-blue { 31 | fill: #33b5e5; 32 | } 33 | 34 | .bar-yellow { 35 | fill: #ffbb33; 36 | } 37 | 38 | #forkme_banner { 39 | display: block; 40 | position: absolute; 41 | top: 0; 42 | right: 10px; 43 | z-index: 10; 44 | padding: 10px 50px 10px 10px; 45 | color: #fff; 46 | background: 47 | url('http://dk8996.github.io/Gantt-Chart/images/blacktocat.png') 48 | #0090ff no-repeat 95% 50%; 49 | font-weight: 700; 50 | box-shadow: 0 0 10px rgba(0, 0, 0, .5); 51 | border-bottom-left-radius: 2px; 52 | border-bottom-right-radius: 2px; 53 | text-decoration: none; 54 | } 55 | 56 | #twittme_banner { 57 | display: block; 58 | position: absolute; 59 | top: 0; 60 | right: 180px; 61 | z-index: 10; 62 | padding: 10px 50px 10px 10px; 63 | color: #fff; 64 | background: 65 | url('http://dk8996.github.io/Gantt-Chart/images/twitter.png') 66 | #0090ff no-repeat 95% 50%; 67 | font-weight: 700; 68 | box-shadow: 0 0 10px rgba(0, 0, 0, .5); 69 | border-bottom-left-radius: 2px; 70 | border-bottom-right-radius: 2px; 71 | text-decoration: none; 72 | } -------------------------------------------------------------------------------- /examples/external-data-examples/example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Gantt Chart External Data Example 5 | 6 | 7 | 8 | 9 | View on GitHub 10 | Share 12 | on Twitter 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /examples/external-data-examples/example.js: -------------------------------------------------------------------------------- 1 | example(); 2 | 3 | function example() { 4 | var tasks = []; 5 | 6 | var taskStatus = { 7 | "Bill Johnson" : "bar", 8 | "Joe Johnson" : "bar-red", 9 | }; 10 | 11 | d3.json("http://localhost:8000/example.json", function(error, json) { 12 | if (error) 13 | return console.warn(error); 14 | var taskNames = []; 15 | for ( var i = 0; i < json.length; i++) { 16 | for ( var j = 0; j < json[i].values.length; j++) { 17 | var role = json[i].values[j]["Role"]; 18 | var company = json[i].values[j]["Company"]; 19 | var roleAndCompany = role + "(" + company + ")"; 20 | var name = json[i]["name"]; 21 | taskNames.push(roleAndCompany); 22 | tasks.push({ 23 | "startDate" : new Date(json[i].values[j]["from date"]), 24 | "endDate" : new Date(json[i].values[j]["to date"]), 25 | "taskName" : roleAndCompany, 26 | "status" : name 27 | }); 28 | } 29 | } 30 | var format = "%b-%e-%y"; 31 | var gantt = d3.gantt().taskTypes(taskNames).taskStatus(taskStatus).tickFormat(format); 32 | gantt(tasks); 33 | }); 34 | 35 | }; 36 | 37 | -------------------------------------------------------------------------------- /examples/external-data-examples/example.json: -------------------------------------------------------------------------------- 1 | [ 2 | { "name" : "Joe Johnson" 3 | , "values": [ 4 | { 5 | "from date": "jan-2000" 6 | , "to date": "jun-2002" 7 | , "Role": "VP of Product" 8 | , "Company": "A Company" 9 | 10 | }, 11 | { 12 | "from date": "jun-2002" 13 | , "to date": "apr-2004" 14 | , "Role": "CEO" 15 | , "Company": "B Company" 16 | 17 | } 18 | , 19 | { 20 | "from date": "apr-2004" 21 | , "to date": "jun-2013" 22 | , "Role": "CEO" 23 | , "Company": "C Company" 24 | 25 | }] 26 | }, 27 | 28 | { "name" : "Bill Johnson" 29 | , "values": [ 30 | { 31 | "from date": "jan-2001" 32 | , "to date": "jun-2005" 33 | , "Role": "VP of Product" 34 | , "Company": "C Company" 35 | 36 | }, 37 | { 38 | "from date": "jun-2005" 39 | , "to date": "july-2006" 40 | , "Role": "CEO" 41 | , "Company": "D Company" 42 | 43 | } 44 | , 45 | { 46 | "from date": "july-2006" 47 | , "to date": "jun-2013" 48 | , "Role": "CEO" 49 | , "Company": "A Company" 50 | 51 | }] 52 | } 53 | 54 | ] -------------------------------------------------------------------------------- /examples/screenshot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dk8996/Gantt-Chart/7148ec1bf752d75deaa64239e4f23f3b9e6cfdc4/examples/screenshot1.png -------------------------------------------------------------------------------- /examples/screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dk8996/Gantt-Chart/7148ec1bf752d75deaa64239e4f23f3b9e6cfdc4/examples/screenshot2.png -------------------------------------------------------------------------------- /gantt-chart-d3.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Dimitry Kudrayvtsev 3 | * @version 2.1 4 | */ 5 | 6 | d3.gantt = function() { 7 | var FIT_TIME_DOMAIN_MODE = "fit"; 8 | var FIXED_TIME_DOMAIN_MODE = "fixed"; 9 | 10 | var margin = { 11 | top : 20, 12 | right : 40, 13 | bottom : 20, 14 | left : 150 15 | }; 16 | var selector = 'body'; 17 | var timeDomainStart = d3.time.day.offset(new Date(),-3); 18 | var timeDomainEnd = d3.time.hour.offset(new Date(),+3); 19 | var timeDomainMode = FIT_TIME_DOMAIN_MODE;// fixed or fit 20 | var taskTypes = []; 21 | var taskStatus = []; 22 | var height = document.body.clientHeight - margin.top - margin.bottom-5; 23 | var width = document.body.clientWidth - margin.right - margin.left-5; 24 | 25 | var tickFormat = "%H:%M"; 26 | 27 | var keyFunction = function(d) { 28 | return d.startDate + d.taskName + d.endDate; 29 | }; 30 | 31 | var rectTransform = function(d) { 32 | return "translate(" + x(d.startDate) + "," + y(d.taskName) + ")"; 33 | }; 34 | 35 | var x = d3.time.scale().domain([ timeDomainStart, timeDomainEnd ]).range([ 0, width ]).clamp(true); 36 | 37 | var y = d3.scale.ordinal().domain(taskTypes).rangeRoundBands([ 0, height - margin.top - margin.bottom ], .1); 38 | 39 | var xAxis = d3.svg.axis().scale(x).orient("bottom").tickFormat(d3.time.format(tickFormat)).tickSubdivide(true) 40 | .tickSize(8).tickPadding(8); 41 | 42 | var yAxis = d3.svg.axis().scale(y).orient("left").tickSize(0); 43 | 44 | var initTimeDomain = function(tasks) { 45 | if (timeDomainMode === FIT_TIME_DOMAIN_MODE) { 46 | if (tasks === undefined || tasks.length < 1) { 47 | timeDomainStart = d3.time.day.offset(new Date(), -3); 48 | timeDomainEnd = d3.time.hour.offset(new Date(), +3); 49 | return; 50 | } 51 | tasks.sort(function(a, b) { 52 | return a.endDate - b.endDate; 53 | }); 54 | timeDomainEnd = tasks[tasks.length - 1].endDate; 55 | tasks.sort(function(a, b) { 56 | return a.startDate - b.startDate; 57 | }); 58 | timeDomainStart = tasks[0].startDate; 59 | } 60 | }; 61 | 62 | var initAxis = function() { 63 | x = d3.time.scale().domain([ timeDomainStart, timeDomainEnd ]).range([ 0, width ]).clamp(true); 64 | y = d3.scale.ordinal().domain(taskTypes).rangeRoundBands([ 0, height - margin.top - margin.bottom ], .1); 65 | xAxis = d3.svg.axis().scale(x).orient("bottom").tickFormat(d3.time.format(tickFormat)).tickSubdivide(true) 66 | .tickSize(8).tickPadding(8); 67 | 68 | yAxis = d3.svg.axis().scale(y).orient("left").tickSize(0); 69 | }; 70 | 71 | function gantt(tasks) { 72 | 73 | initTimeDomain(tasks); 74 | initAxis(); 75 | 76 | var svg = d3.select(selector) 77 | .append("svg") 78 | .attr("class", "chart") 79 | .attr("width", width + margin.left + margin.right) 80 | .attr("height", height + margin.top + margin.bottom) 81 | .append("g") 82 | .attr("class", "gantt-chart") 83 | .attr("width", width + margin.left + margin.right) 84 | .attr("height", height + margin.top + margin.bottom) 85 | .attr("transform", "translate(" + margin.left + ", " + margin.top + ")"); 86 | 87 | svg.selectAll(".chart") 88 | .data(tasks, keyFunction).enter() 89 | .append("rect") 90 | .attr("rx", 5) 91 | .attr("ry", 5) 92 | .attr("class", function(d){ 93 | if(taskStatus[d.status] == null){ return "bar";} 94 | return taskStatus[d.status]; 95 | }) 96 | .attr("y", 0) 97 | .attr("transform", rectTransform) 98 | .attr("height", function(d) { return y.rangeBand(); }) 99 | .attr("width", function(d) { 100 | return Math.max(1,(x(d.endDate) - x(d.startDate))); 101 | }); 102 | 103 | 104 | svg.append("g") 105 | .attr("class", "x axis") 106 | .attr("transform", "translate(0, " + (height - margin.top - margin.bottom) + ")") 107 | .transition() 108 | .call(xAxis); 109 | 110 | svg.append("g").attr("class", "y axis").transition().call(yAxis); 111 | 112 | return gantt; 113 | 114 | }; 115 | 116 | gantt.redraw = function(tasks) { 117 | 118 | initTimeDomain(tasks); 119 | initAxis(); 120 | 121 | var svg = d3.select(".chart"); 122 | 123 | var ganttChartGroup = svg.select(".gantt-chart"); 124 | var rect = ganttChartGroup.selectAll("rect").data(tasks, keyFunction); 125 | 126 | rect.enter() 127 | .insert("rect",":first-child") 128 | .attr("rx", 5) 129 | .attr("ry", 5) 130 | .attr("class", function(d){ 131 | if(taskStatus[d.status] == null){ return "bar";} 132 | return taskStatus[d.status]; 133 | }) 134 | .transition() 135 | .attr("y", 0) 136 | .attr("transform", rectTransform) 137 | .attr("height", function(d) { return y.rangeBand(); }) 138 | .attr("width", function(d) { 139 | return Math.max(1,(x(d.endDate) - x(d.startDate))); 140 | }); 141 | 142 | rect.transition() 143 | .attr("transform", rectTransform) 144 | .attr("height", function(d) { return y.rangeBand(); }) 145 | .attr("width", function(d) { 146 | return Math.max(1,(x(d.endDate) - x(d.startDate))); 147 | }); 148 | 149 | rect.exit().remove(); 150 | 151 | svg.select(".x").transition().call(xAxis); 152 | svg.select(".y").transition().call(yAxis); 153 | 154 | return gantt; 155 | }; 156 | 157 | gantt.margin = function(value) { 158 | if (!arguments.length) 159 | return margin; 160 | margin = value; 161 | return gantt; 162 | }; 163 | 164 | gantt.timeDomain = function(value) { 165 | if (!arguments.length) 166 | return [ timeDomainStart, timeDomainEnd ]; 167 | timeDomainStart = +value[0], timeDomainEnd = +value[1]; 168 | return gantt; 169 | }; 170 | 171 | /** 172 | * @param {string} 173 | * vale The value can be "fit" - the domain fits the data or 174 | * "fixed" - fixed domain. 175 | */ 176 | gantt.timeDomainMode = function(value) { 177 | if (!arguments.length) 178 | return timeDomainMode; 179 | timeDomainMode = value; 180 | return gantt; 181 | 182 | }; 183 | 184 | gantt.taskTypes = function(value) { 185 | if (!arguments.length) 186 | return taskTypes; 187 | taskTypes = value; 188 | return gantt; 189 | }; 190 | 191 | gantt.taskStatus = function(value) { 192 | if (!arguments.length) 193 | return taskStatus; 194 | taskStatus = value; 195 | return gantt; 196 | }; 197 | 198 | gantt.width = function(value) { 199 | if (!arguments.length) 200 | return width; 201 | width = +value; 202 | return gantt; 203 | }; 204 | 205 | gantt.height = function(value) { 206 | if (!arguments.length) 207 | return height; 208 | height = +value; 209 | return gantt; 210 | }; 211 | 212 | gantt.tickFormat = function(value) { 213 | if (!arguments.length) 214 | return tickFormat; 215 | tickFormat = value; 216 | return gantt; 217 | }; 218 | 219 | gantt.selector = function(value) { 220 | if (!arguments.length) 221 | return selector; 222 | selector = value; 223 | return gantt; 224 | }; 225 | 226 | return gantt; 227 | }; 228 | -------------------------------------------------------------------------------- /job-tracker-parser.js: -------------------------------------------------------------------------------- 1 | var DataURL = {}; 2 | DataURL.jobTrackerURL = "http://localhost:50030/jobtracker.jsp"; 3 | DataURL.proxyURL = "http://localhost:8080/__ajaxproxy/"; 4 | DataURL.jobDetailsURL = "http://localhost:50030/jobdetails.jsp?jobid="; 5 | 6 | function JobTrackerParser() { 7 | 8 | this.retrieveDataFromJobTracker = function(callback) { 9 | if (!callback && typeof(callback) !== "function") { 10 | return; 11 | } 12 | d3.html(DataURL.proxyURL + DataURL.jobTrackerURL, function(document) { 13 | { 14 | if (!document) { 15 | return; 16 | } 17 | 18 | var allA = document.querySelectorAll("a"); 19 | for ( var i = 0; i < allA.length; i++) { 20 | var href = allA[i].href; 21 | if (href.indexOf("jobid") !== -1) { 22 | var newURL = swapURL(DataURL.jobTrackerURL, href); 23 | d3.html(DataURL.proxyURL + newURL, function(document) { 24 | if (!document) { 25 | return; 26 | } 27 | var task = jobTrackerParser.parseRunningAndCompleted(document); 28 | var tasks = new Array(); 29 | tasks.push(task); 30 | callback(tasks); 31 | }); 32 | } 33 | } 34 | var tasks = jobTrackerParser.parseRetired(document); 35 | callback(tasks); 36 | } 37 | }); 38 | }; 39 | 40 | this.parseRetired = function(document) { 41 | if (!document) { 42 | return; 43 | } 44 | var tasks = new Array(); 45 | var sortable = document.querySelectorAll(".sortable"); 46 | if (sortable.length > 1) { 47 | var trList = sortable[1].querySelectorAll("tr"); 48 | 49 | for ( var j = 0; j < trList.length; j++) { 50 | var allTD = trList[j].querySelectorAll("td"); 51 | if (allTD[0].id.indexOf("job") !== -1) { 52 | task = { 53 | "taskUID" : allTD[0].textContent.trim(), 54 | "taskLink" : DataURL.jobDetailsURL + allTD[0].textContent.trim(), 55 | "date" : allTD[5].textContent.trim(), 56 | "endDate" : allTD[6].textContent.trim(), 57 | "taskName" : allTD[3].textContent.trim(), 58 | "taskStatus" : allTD[4].textContent.trim() 59 | }; 60 | tasks.push(task); 61 | } 62 | } 63 | } 64 | return tasks; 65 | }; 66 | 67 | this.parseRunningAndCompleted = function(document) { 68 | if (!document) { 69 | return; 70 | } 71 | var lines = document.textContent.split('\n'); 72 | var filterLines = lines.filter(function(n, i) { 73 | if (n.split(':').length > 1) { 74 | return n; 75 | } 76 | }); 77 | 78 | var user = ""; 79 | var taskName = ""; 80 | var taskStatus = ""; 81 | var date = ""; 82 | var endDate = nowDate; 83 | var taskUID = ""; 84 | 85 | var taskUIDFilteredLines = lines.filter(function(n, i) { 86 | if (n.indexOf('job_') > -1 && n.split(' ').length > 1) { 87 | return n; 88 | } 89 | }); 90 | 91 | var taskUIDLine = taskUIDFilteredLines[0]; 92 | taskUID = taskUIDLine.slice(taskUIDLine.indexOf('job_'), taskUIDLine.length).split(' ')[0].trim(); 93 | 94 | for ( var i = 0; i < filterLines.length; i++) { 95 | var lineArray = filterLines[i].split(/:(.+)?/); 96 | var name = lineArray[0].trim(); 97 | var value = lineArray[1].trim(); 98 | 99 | switch (name) { 100 | case "User": 101 | user = value; 102 | break; 103 | case "JobName": 104 | taskName = value; 105 | case "Job Name": 106 | taskName = value; 107 | break; 108 | case "Status": 109 | taskStatus = value.toUpperCase(); 110 | break; 111 | case "Launched At": 112 | date = value.split('(')[0]; 113 | break; 114 | case "Started at": 115 | date = value; 116 | break; 117 | case "Finished At": 118 | endDate = value.split('(')[0]; 119 | break; 120 | case "Finished at": 121 | endDate = value.split('(')[0]; 122 | break; 123 | } 124 | } 125 | task = { 126 | "taskUID" : taskUID, 127 | "taskLink" : DataURL.jobDetailsURL + taskUID, 128 | "date" : date, 129 | "endDate" : endDate, 130 | "taskName" : taskName, 131 | "taskStatus" : taskStatus 132 | }; 133 | return task; 134 | }; 135 | 136 | function swapURL(src, dest) { 137 | return src.split(parseURL(src).path)[0] + parseURL(dest).relative; 138 | }; 139 | 140 | //This function creates a new anchor element and uses location 141 | //properties (inherent) to get the desired URL data. Some String 142 | //operations are used (to normalize results across browsers). 143 | 144 | function parseURL(url) { 145 | var a = document.createElement('a'); 146 | a.href = url; 147 | return { 148 | source : url, 149 | protocol : a.protocol.replace(':', ''), 150 | host : a.hostname, 151 | port : a.port, 152 | query : a.search, 153 | params : (function() { 154 | var ret = {}, seg = a.search.replace(/^\?/, '').split('&'), len = seg.length, i = 0, s; 155 | for (; i < len; i++) { 156 | if (!seg[i]) { 157 | continue; 158 | } 159 | s = seg[i].split('='); 160 | ret[s[0]] = s[1]; 161 | } 162 | return ret; 163 | })(), 164 | file : (a.pathname.match(/\/([^\/?#]+)$/i) || [ , '' ])[1], 165 | hash : a.hash.replace('#', ''), 166 | path : a.pathname.replace(/^([^\/])/, '/$1'), 167 | relative : (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [ , '' ])[1], 168 | segments : a.pathname.replace(/^\//, '').split('/') 169 | }; 170 | }; 171 | }; -------------------------------------------------------------------------------- /jobtracker.jsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Hadoop Map/Reduce Administration 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |

Hadoop Map/Reduce Administration

21 | 22 | 31 | 32 | State: RUNNING
33 | Started: Thu Nov 01 13:46:33 EDT 2012
34 | Version: 2.0.0-mr1-cdh4.0.0, 35 | Unknown
36 | Compiled: Mon Jun 4 17:31:58 PDT 2012 by 37 | jenkins from 38 | Unknown
39 | Identifier: 201211011346
40 | 41 |
42 |

Cluster Summary (Heap Size is 987.38 MB/7.11 GB)

43 | 44 | 45 |
Running Map TasksRunning Reduce TasksTotal SubmissionsNodesOccupied Map SlotsOccupied Reduce SlotsReserved Map SlotsReserved Reduce SlotsMap Task CapacityReduce Task CapacityAvg. Tasks/NodeBlacklisted NodesExcluded Nodes
172010762917200017434818.0000
46 |
47 |
48 |

Scheduling Information

49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 64 | 65 | 66 | 67 |
Queue Name State Scheduling Information
defaultrunningN/A 63 |
68 |
69 | Filter (Jobid, Priority, User, Name)
70 | Example: 'user:smith 3200' will filter by 'smith' only in the user field and '3200' in all fields 71 |
72 | 73 |

Running Jobs

74 | 75 | 76 | 77 |
JobidPriorityUserNameMap % CompleteMap TotalMaps CompletedReduce % CompleteReduce TotalReduces CompletedJob Scheduling InformationDiagnostic Info
job_201211011346_1081VERY_HIGHcompTaskN Job37.49%
276010350.00%
345 0NANA
78 | 79 |
80 | 81 |

Completed Jobs

82 | 83 | 84 | 85 | 86 | 87 | 88 |
JobidPriorityUserNameMap % CompleteMap TotalMaps CompletedReduce % CompleteReduce TotalReduces CompletedJob Scheduling InformationDiagnostic Info
job_201211011346_1076VERY_HIGHcompTaskN Job100.00%
24152415100.00%
345 345NANA
job_201211011346_1077VERY_HIGHcompDistributed SCP/FTP Job100.00%
5252100.00%
0 0NANA
job_201211011346_1078VERY_HIGHcompTaskA Job100.00%
24152415100.00%
345 345NANA
job_201211011346_1079VERY_HIGHcompETL Aggregation100.00%
80428042100.00%
100 100NANA
job_201211011346_1080VERY_HIGHcompParsing Job100.00%
22702270100.00%
345 345NANA
89 |
90 | 91 | 92 | 93 |

Retired Jobs

94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 |
JobidPriorityUserNameStateStart TimeFinish TimeMap % CompleteReduce % CompleteJob Scheduling InformationDiagnostic Info
job_201211011346_1075VERY_HIGHcompParsing JobSUCCEEDEDSun Nov 18 10:58:59 EST 2012Sun Nov 18 11:16:47 EST 2012100.00%
100.00%
NANA
job_201211011346_1072VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSun Nov 18 09:28:54 EST 2012Sun Nov 18 10:15:58 EST 2012100.00%
100.00%
NANA
job_201211011346_1074VERY_HIGHcompETL AggregationSUCCEEDEDSun Nov 18 09:52:06 EST 2012Sun Nov 18 10:01:23 EST 2012100.00%
100.00%
NANA
job_201211011346_1073VERY_HIGHcompTaskA JobSUCCEEDEDSun Nov 18 09:40:30 EST 2012Sun Nov 18 09:51:11 EST 2012100.00%
100.00%
NANA
job_201211011346_1071VERY_HIGHcompTaskN JobSUCCEEDEDSun Nov 18 09:22:15 EST 2012Sun Nov 18 09:26:40 EST 2012100.00%
100.00%
NANA
job_201211011346_1070VERY_HIGHcompParsing JobSUCCEEDEDSun Nov 18 08:55:21 EST 2012Sun Nov 18 09:07:25 EST 2012100.00%
100.00%
NANA
job_201211011346_1069VERY_HIGHcompETL AggregationSUCCEEDEDSun Nov 18 08:13:34 EST 2012Sun Nov 18 08:23:47 EST 2012100.00%
100.00%
NANA
job_201211011346_1067VERY_HIGHcompTaskA JobSUCCEEDEDSun Nov 18 07:58:03 EST 2012Sun Nov 18 08:12:45 EST 2012100.00%
100.00%
NANA
job_201211011346_1068VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSun Nov 18 08:03:27 EST 2012Sun Nov 18 08:11:13 EST 2012100.00%
100.00%
NANA
job_201211011346_1066VERY_HIGHcompTaskN JobSUCCEEDEDSun Nov 18 07:37:48 EST 2012Sun Nov 18 07:42:09 EST 2012100.00%
100.00%
NANA
job_201211011346_1065VERY_HIGHcompParsing JobSUCCEEDEDSun Nov 18 07:19:08 EST 2012Sun Nov 18 07:34:38 EST 2012100.00%
100.00%
NANA
job_201211011346_1064VERY_HIGHcompETL AggregationSUCCEEDEDSun Nov 18 06:50:42 EST 2012Sun Nov 18 07:00:51 EST 2012100.00%
100.00%
NANA
job_201211011346_1063VERY_HIGHcompTaskA JobSUCCEEDEDSun Nov 18 06:40:25 EST 2012Sun Nov 18 06:49:58 EST 2012100.00%
100.00%
NANA
job_201211011346_1062VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSun Nov 18 06:33:38 EST 2012Sun Nov 18 06:41:34 EST 2012100.00%
100.00%
NANA
job_201211011346_1061VERY_HIGHcompTaskN JobSUCCEEDEDSun Nov 18 06:22:09 EST 2012Sun Nov 18 06:27:03 EST 2012100.00%
100.00%
NANA
job_201211011346_1060VERY_HIGHcompParsing JobSUCCEEDEDSun Nov 18 05:53:30 EST 2012Sun Nov 18 06:08:35 EST 2012100.00%
100.00%
NANA
job_201211011346_1059VERY_HIGHcompETL AggregationSUCCEEDEDSun Nov 18 05:23:07 EST 2012Sun Nov 18 05:35:17 EST 2012100.00%
100.00%
NANA
job_201211011346_1057VERY_HIGHcompTaskA JobSUCCEEDEDSun Nov 18 04:55:39 EST 2012Sun Nov 18 05:22:20 EST 2012100.00%
100.00%
NANA
job_201211011346_1058VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSun Nov 18 05:01:35 EST 2012Sun Nov 18 05:09:30 EST 2012100.00%
100.00%
NANA
job_201211011346_1056VERY_HIGHcompTaskN JobSUCCEEDEDSun Nov 18 04:22:09 EST 2012Sun Nov 18 04:28:43 EST 2012100.00%
100.00%
NANA
job_201211011346_1055VERY_HIGHcompParsing JobSUCCEEDEDSun Nov 18 03:59:12 EST 2012Sun Nov 18 04:17:45 EST 2012100.00%
100.00%
NANA
job_201211011346_1054VERY_HIGHcompETL AggregationSUCCEEDEDSun Nov 18 03:38:38 EST 2012Sun Nov 18 03:53:00 EST 2012100.00%
100.00%
NANA
job_201211011346_1053VERY_HIGHcompTaskA JobSUCCEEDEDSun Nov 18 03:06:12 EST 2012Sun Nov 18 03:37:48 EST 2012100.00%
100.00%
NANA
job_201211011346_1052VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSun Nov 18 03:05:42 EST 2012Sun Nov 18 03:13:33 EST 2012100.00%
100.00%
NANA
job_201211011346_1051VERY_HIGHcompTaskN JobSUCCEEDEDSun Nov 18 02:37:51 EST 2012Sun Nov 18 02:47:43 EST 2012100.00%
100.00%
NANA
job_201211011346_1050VERY_HIGHcompParsing JobSUCCEEDEDSun Nov 18 02:05:08 EST 2012Sun Nov 18 02:24:05 EST 2012100.00%
100.00%
NANA
job_201211011346_1049VERY_HIGHcompETL AggregationSUCCEEDEDSun Nov 18 01:45:02 EST 2012Sun Nov 18 02:00:35 EST 2012100.00%
100.00%
NANA
job_201211011346_1048VERY_HIGHcompTaskA JobSUCCEEDEDSun Nov 18 01:18:12 EST 2012Sun Nov 18 01:44:12 EST 2012100.00%
100.00%
NANA
job_201211011346_1047VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSun Nov 18 01:14:09 EST 2012Sun Nov 18 01:21:36 EST 2012100.00%
100.00%
NANA
job_201211011346_1046VERY_HIGHcompTaskN JobSUCCEEDEDSun Nov 18 00:52:06 EST 2012Sun Nov 18 01:03:40 EST 2012100.00%
100.00%
NANA
job_201211011346_1045VERY_HIGHcompParsing JobSUCCEEDEDSun Nov 18 00:18:12 EST 2012Sun Nov 18 00:38:56 EST 2012100.00%
100.00%
NANA
job_201211011346_1044VERY_HIGHcompETL AggregationSUCCEEDEDSat Nov 17 23:59:47 EST 2012Sun Nov 18 00:15:29 EST 2012100.00%
100.00%
NANA
job_201211011346_1043VERY_HIGHcompTaskA JobSUCCEEDEDSat Nov 17 23:31:59 EST 2012Sat Nov 17 23:58:56 EST 2012100.00%
100.00%
NANA
job_201211011346_1042VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSat Nov 17 23:27:09 EST 2012Sat Nov 17 23:40:09 EST 2012100.00%
100.00%
NANA
job_201211011346_1041VERY_HIGHcompTaskN JobSUCCEEDEDSat Nov 17 23:07:56 EST 2012Sat Nov 17 23:19:56 EST 2012100.00%
100.00%
NANA
job_201211011346_1040VERY_HIGHcompParsing JobSUCCEEDEDSat Nov 17 22:33:01 EST 2012Sat Nov 17 22:53:38 EST 2012100.00%
100.00%
NANA
job_201211011346_1039VERY_HIGHcompETL AggregationSUCCEEDEDSat Nov 17 21:47:21 EST 2012Sat Nov 17 22:04:15 EST 2012100.00%
100.00%
NANA
job_201211011346_1038VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSat Nov 17 21:28:47 EST 2012Sat Nov 17 21:52:33 EST 2012100.00%
100.00%
NANA
job_201211011346_1037VERY_HIGHcompTaskA JobSUCCEEDEDSat Nov 17 21:18:40 EST 2012Sat Nov 17 21:46:34 EST 2012100.00%
100.00%
NANA
job_201211011346_1036VERY_HIGHcompTaskN JobSUCCEEDEDSat Nov 17 20:53:14 EST 2012Sat Nov 17 21:03:42 EST 2012100.00%
100.00%
NANA
job_201211011346_1035VERY_HIGHcompParsing JobSUCCEEDEDSat Nov 17 20:20:15 EST 2012Sat Nov 17 20:43:10 EST 2012100.00%
100.00%
NANA
job_201211011346_1034VERY_HIGHcompETL AggregationSUCCEEDEDSat Nov 17 19:50:56 EST 2012Sat Nov 17 20:07:40 EST 2012100.00%
100.00%
NANA
job_201211011346_1032VERY_HIGHcompTaskA JobSUCCEEDEDSat Nov 17 19:18:54 EST 2012Sat Nov 17 19:50:06 EST 2012100.00%
100.00%
NANA
job_201211011346_1033VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSat Nov 17 19:25:58 EST 2012Sat Nov 17 19:36:54 EST 2012100.00%
100.00%
NANA
job_201211011346_1031VERY_HIGHcompTaskN JobSUCCEEDEDSat Nov 17 18:38:46 EST 2012Sat Nov 17 19:01:47 EST 2012100.00%
100.00%
NANA
job_201211011346_1030VERY_HIGHcompParsing JobSUCCEEDEDSat Nov 17 17:58:18 EST 2012Sat Nov 17 18:25:05 EST 2012100.00%
100.00%
NANA
job_201211011346_1029VERY_HIGHcompETL AggregationSUCCEEDEDSat Nov 17 17:51:15 EST 2012Sat Nov 17 18:14:43 EST 2012100.00%
100.00%
NANA
job_201211011346_1028VERY_HIGHcompTaskA JobSUCCEEDEDSat Nov 17 17:14:44 EST 2012Sat Nov 17 17:50:23 EST 2012100.00%
100.00%
NANA
job_201211011346_1027VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSat Nov 17 16:50:32 EST 2012Sat Nov 17 17:13:28 EST 2012100.00%
100.00%
NANA
job_201211011346_1026VERY_HIGHcompTaskN JobSUCCEEDEDSat Nov 17 16:38:48 EST 2012Sat Nov 17 17:00:22 EST 2012100.00%
100.00%
NANA
job_201211011346_1025VERY_HIGHcompParsing JobSUCCEEDEDSat Nov 17 16:00:11 EST 2012Sat Nov 17 16:23:07 EST 2012100.00%
100.00%
NANA
job_201211011346_1024VERY_HIGHcompETL AggregationSUCCEEDEDSat Nov 17 15:46:19 EST 2012Sat Nov 17 16:03:29 EST 2012100.00%
100.00%
NANA
job_201211011346_1023VERY_HIGHcompTaskA JobSUCCEEDEDSat Nov 17 15:04:00 EST 2012Sat Nov 17 15:45:26 EST 2012100.00%
100.00%
NANA
job_201211011346_1022VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSat Nov 17 15:02:08 EST 2012Sat Nov 17 15:18:51 EST 2012100.00%
100.00%
NANA
job_201211011346_1021VERY_HIGHcompTaskN JobSUCCEEDEDSat Nov 17 14:22:29 EST 2012Sat Nov 17 14:48:13 EST 2012100.00%
100.00%
NANA
job_201211011346_1020VERY_HIGHcompParsing JobSUCCEEDEDSat Nov 17 13:58:17 EST 2012Sat Nov 17 14:19:24 EST 2012100.00%
100.00%
NANA
job_201211011346_1019VERY_HIGHcompETL AggregationSUCCEEDEDSat Nov 17 13:29:13 EST 2012Sat Nov 17 13:40:17 EST 2012100.00%
100.00%
NANA
job_201211011346_1018VERY_HIGHcompTaskA JobSUCCEEDEDSat Nov 17 13:11:49 EST 2012Sat Nov 17 13:28:30 EST 2012100.00%
100.00%
NANA
job_201211011346_1017VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSat Nov 17 13:07:08 EST 2012Sat Nov 17 13:16:07 EST 2012100.00%
100.00%
NANA
job_201211011346_1016VERY_HIGHcompTaskN JobSUCCEEDEDSat Nov 17 12:52:20 EST 2012Sat Nov 17 12:57:45 EST 2012100.00%
100.00%
NANA
job_201211011346_1015VERY_HIGHcompParsing JobSUCCEEDEDSat Nov 17 12:25:32 EST 2012Sat Nov 17 12:39:45 EST 2012100.00%
100.00%
NANA
job_201211011346_1014VERY_HIGHcompETL AggregationSUCCEEDEDSat Nov 17 11:49:00 EST 2012Sat Nov 17 12:02:09 EST 2012100.00%
100.00%
NANA
job_201211011346_1012VERY_HIGHcompTaskA JobSUCCEEDEDSat Nov 17 11:29:25 EST 2012Sat Nov 17 11:48:14 EST 2012100.00%
100.00%
NANA
job_201211011346_1013VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSat Nov 17 11:38:40 EST 2012Sat Nov 17 11:47:24 EST 2012100.00%
100.00%
NANA
job_201211011346_1011VERY_HIGHcompTaskN JobSUCCEEDEDSat Nov 17 11:08:40 EST 2012Sat Nov 17 11:16:12 EST 2012100.00%
100.00%
NANA
job_201211011346_1010VERY_HIGHcompParsing JobSUCCEEDEDSat Nov 17 10:34:03 EST 2012Sat Nov 17 10:51:21 EST 2012100.00%
100.00%
NANA
job_201211011346_1009VERY_HIGHcompETL AggregationSUCCEEDEDSat Nov 17 09:56:05 EST 2012Sat Nov 17 10:06:23 EST 2012100.00%
100.00%
NANA
job_201211011346_1008VERY_HIGHcompTaskA JobSUCCEEDEDSat Nov 17 09:44:27 EST 2012Sat Nov 17 09:54:57 EST 2012100.00%
100.00%
NANA
job_201211011346_1007VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSat Nov 17 09:37:08 EST 2012Sat Nov 17 09:45:38 EST 2012100.00%
100.00%
NANA
job_201211011346_1006VERY_HIGHcompTaskN JobSUCCEEDEDSat Nov 17 09:22:21 EST 2012Sat Nov 17 09:27:51 EST 2012100.00%
100.00%
NANA
job_201211011346_1005VERY_HIGHcompParsing JobSUCCEEDEDSat Nov 17 08:54:53 EST 2012Sat Nov 17 09:09:34 EST 2012100.00%
100.00%
NANA
job_201211011346_1004VERY_HIGHcompETL AggregationSUCCEEDEDSat Nov 17 08:27:21 EST 2012Sat Nov 17 08:37:28 EST 2012100.00%
100.00%
NANA
job_201211011346_1003VERY_HIGHcompTaskA JobSUCCEEDEDSat Nov 17 08:11:36 EST 2012Sat Nov 17 08:26:36 EST 2012100.00%
100.00%
NANA
job_201211011346_1002VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSat Nov 17 08:02:33 EST 2012Sat Nov 17 08:09:52 EST 2012100.00%
100.00%
NANA
job_201211011346_1001VERY_HIGHcompTaskN JobSUCCEEDEDSat Nov 17 07:52:18 EST 2012Sat Nov 17 07:57:18 EST 2012100.00%
100.00%
NANA
job_201211011346_1000VERY_HIGHcompParsing JobSUCCEEDEDSat Nov 17 07:21:19 EST 2012Sat Nov 17 07:36:08 EST 2012100.00%
100.00%
NANA
job_201211011346_0999VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSat Nov 17 06:34:20 EST 2012Sat Nov 17 06:41:27 EST 2012100.00%
100.00%
NANA
job_201211011346_0998VERY_HIGHcompETL AggregationSUCCEEDEDSat Nov 17 06:26:45 EST 2012Sat Nov 17 06:37:38 EST 2012100.00%
100.00%
NANA
job_201211011346_0997VERY_HIGHcompTaskA JobSUCCEEDEDSat Nov 17 06:13:59 EST 2012Sat Nov 17 06:25:58 EST 2012100.00%
100.00%
NANA
job_201211011346_0996VERY_HIGHcompTaskN JobSUCCEEDEDSat Nov 17 05:52:52 EST 2012Sat Nov 17 05:58:28 EST 2012100.00%
100.00%
NANA
job_201211011346_0995VERY_HIGHcompParsing JobSUCCEEDEDSat Nov 17 05:27:31 EST 2012Sat Nov 17 05:41:44 EST 2012100.00%
100.00%
NANA
job_201211011346_0994VERY_HIGHcompETL AggregationSUCCEEDEDSat Nov 17 04:55:17 EST 2012Sat Nov 17 05:09:48 EST 2012100.00%
100.00%
NANA
job_201211011346_0992VERY_HIGHcompTaskA JobSUCCEEDEDSat Nov 17 04:28:53 EST 2012Sat Nov 17 04:54:03 EST 2012100.00%
100.00%
NANA
job_201211011346_0993VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSat Nov 17 04:36:39 EST 2012Sat Nov 17 04:44:47 EST 2012100.00%
100.00%
NANA
job_201211011346_0991VERY_HIGHcompTaskN JobSUCCEEDEDSat Nov 17 04:07:27 EST 2012Sat Nov 17 04:16:08 EST 2012100.00%
100.00%
NANA
job_201211011346_0990VERY_HIGHcompParsing JobSUCCEEDEDSat Nov 17 03:33:47 EST 2012Sat Nov 17 03:54:40 EST 2012100.00%
100.00%
NANA
job_201211011346_0989VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSat Nov 17 02:47:32 EST 2012Sat Nov 17 02:57:23 EST 2012100.00%
100.00%
NANA
job_201211011346_0988VERY_HIGHcompETL AggregationSUCCEEDEDSat Nov 17 02:39:57 EST 2012Sat Nov 17 02:56:23 EST 2012100.00%
100.00%
NANA
job_201211011346_0987VERY_HIGHcompTaskA JobSUCCEEDEDSat Nov 17 02:20:20 EST 2012Sat Nov 17 02:39:02 EST 2012100.00%
100.00%
NANA
job_201211011346_0986VERY_HIGHcompTaskN JobSUCCEEDEDSat Nov 17 01:52:19 EST 2012Sat Nov 17 02:03:36 EST 2012100.00%
100.00%
NANA
job_201211011346_0985VERY_HIGHcompParsing JobSUCCEEDEDSat Nov 17 01:23:51 EST 2012Sat Nov 17 01:44:52 EST 2012100.00%
100.00%
NANA
job_201211011346_0984VERY_HIGHcompETL AggregationSUCCEEDEDSat Nov 17 00:42:25 EST 2012Sat Nov 17 01:00:32 EST 2012100.00%
100.00%
NANA
job_201211011346_0983VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDSat Nov 17 00:38:36 EST 2012Sat Nov 17 00:46:37 EST 2012100.00%
100.00%
NANA
job_201211011346_0982VERY_HIGHcompTaskA JobSUCCEEDEDSat Nov 17 00:19:28 EST 2012Sat Nov 17 00:41:39 EST 2012100.00%
100.00%
NANA
job_201211011346_0981VERY_HIGHcompTaskN JobSUCCEEDEDFri Nov 16 23:53:05 EST 2012Sat Nov 17 00:06:06 EST 2012100.00%
100.00%
NANA
job_201211011346_0980VERY_HIGHcompParsing JobSUCCEEDEDFri Nov 16 23:20:46 EST 2012Fri Nov 16 23:43:03 EST 2012100.00%
100.00%
NANA
job_201211011346_0979VERY_HIGHcompETL AggregationSUCCEEDEDFri Nov 16 22:28:32 EST 2012Fri Nov 16 22:45:13 EST 2012100.00%
100.00%
NANA
job_201211011346_0978VERY_HIGHcompDistributed SCP/FTP JobSUCCEEDEDFri Nov 16 22:16:37 EST 2012Fri Nov 16 22:40:22 EST 2012100.00%
100.00%
NANA
job_201211011346_0977VERY_HIGHcompTaskA JobSUCCEEDEDFri Nov 16 22:05:55 EST 2012Fri Nov 16 22:27:40 EST 2012100.00%
100.00%
NANA
196 | 197 |
198 | 199 |

Local Logs

200 | Log directory, 201 | Job Tracker History 202 | 203 |
204 | Hadoop, 2012. 205 | 206 | 207 | 208 | -------------------------------------------------------------------------------- /lib/d3/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013, Michael Bostock 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | * The name Michael Bostock may not be used to endorse or promote products 15 | derived from this software without specific prior written permission. 16 | 17 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 | DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, 21 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 22 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 24 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 25 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 26 | EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 | --------------------------------------------------------------------------------