/**
* 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.tools.rumen;
/**
* {@link MachineNode} represents the configuration of a cluster node.
* {@link MachineNode} should be constructed by {@link MachineNode.Builder}.
*/
public final class MachineNode extends Node {
long memory = -1; // in KB
int mapSlots = 1;
int reduceSlots = 1;
long memoryPerMapSlot = -1; // in KB
long memoryPerReduceSlot = -1; // in KB
int numCores = 1;
MachineNode(String name, int level) {
super(name, level);
}
@Override
public boolean equals(Object obj) {
// name/level sufficient
return super.equals(obj);
}
@Override
public int hashCode() {
// match equals
return super.hashCode();
}
/**
* Get the available physical RAM of the node.
* @return The available physical RAM of the node, in KB.
*/
public long getMemory() {
return memory;
}
/**
* Get the number of map slots of the node.
* @return The number of map slots of the node.
*/
public int getMapSlots() {
return mapSlots;
}
/**
* Get the number of reduce slots of the node.
* @return The number of reduce slots fo the node.
*/
public int getReduceSlots() {
return reduceSlots;
}
/**
* Get the amount of RAM reserved for each map slot.
* @return the amount of RAM reserved for each map slot, in KB.
*/
public long getMemoryPerMapSlot() {
return memoryPerMapSlot;
}
/**
* Get the amount of RAM reserved for each reduce slot.
* @return the amount of RAM reserved for each reduce slot, in KB.
*/
public long getMemoryPerReduceSlot() {
return memoryPerReduceSlot;
}
/**
* Get the number of cores of the node.
* @return the number of cores of the node.
*/
public int getNumCores() {
return numCores;
}
/**
* Get the rack node that the machine belongs to.
*
* @return The rack node that the machine belongs to. Returns null if the
* machine does not belong to any rack.
*/
public RackNode getRackNode() {
return (RackNode)getParent();
}
@Override
public synchronized boolean addChild(Node child) {
throw new IllegalStateException("Cannot add child to MachineNode");
}
/**
* Builder for a NodeInfo object
*/
public static final class Builder {
private MachineNode node;
/**
* Start building a new NodeInfo object.
* @param name
* Unique name of the node. Typically the fully qualified domain
* name.
*/
public Builder(String name, int level) {
node = new MachineNode(name, level);
}
/**
* Set the physical memory of the node.
* @param memory Available RAM in KB.
*/
public Builder setMemory(long memory) {
node.memory = memory;
return this;
}
/**
* Set the number of map slot for the node.
* @param mapSlots The number of map slots for the node.
*/
public Builder setMapSlots(int mapSlots) {
node.mapSlots = mapSlots;
return this;
}
/**
* Set the number of reduce slot for the node.
* @param reduceSlots The number of reduce slots for the node.
*/
public Builder setReduceSlots(int reduceSlots) {
node.reduceSlots = reduceSlots;
return this;
}
/**
* Set the amount of RAM reserved for each map slot.
* @param memoryPerMapSlot The amount of RAM reserved for each map slot, in KB.
*/
public Builder setMemoryPerMapSlot(long memoryPerMapSlot) {
node.memoryPerMapSlot = memoryPerMapSlot;
return this;
}
/**
* Set the amount of RAM reserved for each reduce slot.
* @param memoryPerReduceSlot The amount of RAM reserved for each reduce slot, in KB.
*/
public Builder setMemoryPerReduceSlot(long memoryPerReduceSlot) {
node.memoryPerReduceSlot = memoryPerReduceSlot;
return this;
}
/**
* Set the number of cores for the node.
* @param numCores Number of cores for the node.
*/
public Builder setNumCores(int numCores) {
node.numCores = numCores;
return this;
}
/**
* Clone the settings from a reference {@link MachineNode} object.
* @param ref The reference {@link MachineNode} object.
*/
public Builder cloneFrom(MachineNode ref) {
node.memory = ref.memory;
node.mapSlots = ref.mapSlots;
node.reduceSlots = ref.reduceSlots;
node.memoryPerMapSlot = ref.memoryPerMapSlot;
node.memoryPerReduceSlot = ref.memoryPerReduceSlot;
node.numCores = ref.numCores;
return this;
}
/**
* Build the {@link MachineNode} object.
* @return The {@link MachineNode} object being built.
*/
public MachineNode build() {
MachineNode retVal = node;
node = null;
return retVal;
}
}
}