001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 package org.apache.hadoop.mapreduce;
019
020 import java.io.DataInput;
021 import java.io.DataOutput;
022 import java.io.IOException;
023 import java.util.ArrayList;
024 import java.util.List;
025 import java.util.Properties;
026
027 import org.apache.hadoop.classification.InterfaceAudience;
028 import org.apache.hadoop.classification.InterfaceStability;
029 import org.apache.hadoop.io.Text;
030 import org.apache.hadoop.io.Writable;
031 import org.apache.hadoop.io.WritableUtils;
032 import org.apache.hadoop.util.StringInterner;
033
034 /**
035 * Class that contains the information regarding the Job Queues which are
036 * maintained by the Hadoop Map/Reduce framework.
037 *
038 */
039 @InterfaceAudience.Public
040 @InterfaceStability.Evolving
041 public class QueueInfo implements Writable {
042
043 private String queueName = "";
044
045 //The scheduling Information object is read back as String.
046 //Once the scheduling information is set there is no way to recover it.
047 private String schedulingInfo;
048
049 private QueueState queueState;
050
051 // Jobs submitted to the queue
052 private JobStatus[] stats;
053
054 private List<QueueInfo> children;
055
056 private Properties props;
057
058 /**
059 * Default constructor for QueueInfo.
060 *
061 */
062 public QueueInfo() {
063 // make it running by default.
064 this.queueState = QueueState.RUNNING;
065 children = new ArrayList<QueueInfo>();
066 props = new Properties();
067 }
068
069 /**
070 * Construct a new QueueInfo object using the queue name and the
071 * scheduling information passed.
072 *
073 * @param queueName Name of the job queue
074 * @param schedulingInfo Scheduling Information associated with the job
075 * queue
076 */
077 public QueueInfo(String queueName, String schedulingInfo) {
078 this();
079 this.queueName = queueName;
080 this.schedulingInfo = schedulingInfo;
081 }
082
083 /**
084 *
085 * @param queueName
086 * @param schedulingInfo
087 * @param state
088 * @param stats
089 */
090 public QueueInfo(String queueName, String schedulingInfo, QueueState state,
091 JobStatus[] stats) {
092 this(queueName, schedulingInfo);
093 this.queueState = state;
094 this.stats = stats;
095 }
096
097 /**
098 * Set the queue name of the JobQueueInfo
099 *
100 * @param queueName Name of the job queue.
101 */
102 protected void setQueueName(String queueName) {
103 this.queueName = queueName;
104 }
105
106 /**
107 * Get the queue name from JobQueueInfo
108 *
109 * @return queue name
110 */
111 public String getQueueName() {
112 return queueName;
113 }
114
115 /**
116 * Set the scheduling information associated to particular job queue
117 *
118 * @param schedulingInfo
119 */
120 protected void setSchedulingInfo(String schedulingInfo) {
121 this.schedulingInfo = schedulingInfo;
122 }
123
124 /**
125 * Gets the scheduling information associated to particular job queue.
126 * If nothing is set would return <b>"N/A"</b>
127 *
128 * @return Scheduling information associated to particular Job Queue
129 */
130 public String getSchedulingInfo() {
131 if(schedulingInfo != null) {
132 return schedulingInfo;
133 }else {
134 return "N/A";
135 }
136 }
137
138 /**
139 * Set the state of the queue
140 * @param state state of the queue.
141 */
142 protected void setState(QueueState state) {
143 queueState = state;
144 }
145
146 /**
147 * Return the queue state
148 * @return the queue state.
149 */
150 public QueueState getState() {
151 return queueState;
152 }
153
154 protected void setJobStatuses(JobStatus[] stats) {
155 this.stats = stats;
156 }
157
158 /**
159 * Get immediate children.
160 *
161 * @return list of QueueInfo
162 */
163 public List<QueueInfo> getQueueChildren() {
164 return children;
165 }
166
167 protected void setQueueChildren(List<QueueInfo> children) {
168 this.children = children;
169 }
170
171 /**
172 * Get properties.
173 *
174 * @return Properties
175 */
176 public Properties getProperties() {
177 return props;
178 }
179
180 protected void setProperties(Properties props) {
181 this.props = props;
182 }
183
184 /**
185 * Get the jobs submitted to queue
186 * @return list of JobStatus for the submitted jobs
187 */
188 public JobStatus[] getJobStatuses() {
189 return stats;
190 }
191
192 @Override
193 public void readFields(DataInput in) throws IOException {
194 queueName = StringInterner.weakIntern(Text.readString(in));
195 queueState = WritableUtils.readEnum(in, QueueState.class);
196 schedulingInfo = StringInterner.weakIntern(Text.readString(in));
197 int length = in.readInt();
198 stats = new JobStatus[length];
199 for (int i = 0; i < length; i++) {
200 stats[i] = new JobStatus();
201 stats[i].readFields(in);
202 }
203 int count = in.readInt();
204 children.clear();
205 for (int i = 0; i < count; i++) {
206 QueueInfo childQueueInfo = new QueueInfo();
207 childQueueInfo.readFields(in);
208 children.add(childQueueInfo);
209 }
210 }
211
212 @Override
213 public void write(DataOutput out) throws IOException {
214 Text.writeString(out, queueName);
215 WritableUtils.writeEnum(out, queueState);
216
217 if(schedulingInfo!= null) {
218 Text.writeString(out, schedulingInfo);
219 }else {
220 Text.writeString(out, "N/A");
221 }
222 out.writeInt(stats.length);
223 for (JobStatus stat : stats) {
224 stat.write(out);
225 }
226 out.writeInt(children.size());
227 for(QueueInfo childQueueInfo : children) {
228 childQueueInfo.write(out);
229 }
230 }
231 }