/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.hadoop.mapred; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import java.io.FileReader; import java.io.BufferedReader; import java.io.PrintWriter; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.Closeable; /** * Implements persistent storage for queue budget and spending * information in a file. */ public class FileAllocationStore extends AllocationStore { private static final Log LOG = LogFactory.getLog(FileAllocationStore.class); private String fileName = ""; private boolean loaded = false; /** {@inheritDoc} */ public void init(Configuration conf) { fileName = conf.get(PrioritySchedulerOptions.DYNAMIC_SCHEDULER_BUDGET_FILE, "/etc/hadoop.budget"); } /** {@inheritDoc} */ public void save() { PrintWriter out = null; try { out = new PrintWriter(new BufferedWriter(new FileWriter(fileName))); for (BudgetQueue queue: getQueues()) { out.printf("%s %.20f %.20f\n", queue.name, queue.budget, queue.spending); } } catch (Exception e) { LOG.error("Error writing to file: " + fileName, e); } finally { close(out); } } private void close(Closeable closeable) { if (closeable != null) { try { closeable.close(); } catch (Exception ce) { LOG.error("Error closing file: " + fileName, ce); } } } /** {@inheritDoc} */ public void load() { if (loaded) { return; } BufferedReader in = null; try { in = new BufferedReader(new FileReader(fileName)); String line = in.readLine(); while (line != null) { String[] nameValue = line.split(" "); if (nameValue.length != 3) { continue; } queueCache.put(nameValue[0], new BudgetQueue(nameValue[0], Float.parseFloat(nameValue[1]), Float.parseFloat(nameValue[2]))); line = in.readLine(); } loaded = true; } catch (Exception e) { LOG.error("Error reading file: " + fileName, e); } finally { close(in); } } }