You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by ch...@apache.org on 2014/05/19 17:20:42 UTC
svn commit: r1595930 - in /uima/sandbox/uima-ducc/trunk: src/main/admin/
uima-ducc-common/src/main/java/org/apache/uima/ducc/common/admin/event/
uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/
Author: challngr
Date: Mon May 19 15:20:41 2014
New Revision: 1595930
URL: http://svn.apache.org/r1595930
Log:
UIMA-3824 Initial query load.
Modified:
uima/sandbox/uima-ducc/trunk/src/main/admin/rm_qload
uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/admin/event/RmAdminQLoadReply.java
uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/IRmJob.java
uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java
uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/RmJob.java
uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Scheduler.java
uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/User.java
Modified: uima/sandbox/uima-ducc/trunk/src/main/admin/rm_qload
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/src/main/admin/rm_qload?rev=1595930&r1=1595929&r2=1595930&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/src/main/admin/rm_qload (original)
+++ uima/sandbox/uima-ducc/trunk/src/main/admin/rm_qload Mon May 19 15:20:41 2014
@@ -43,7 +43,7 @@ class DuccRmQLoad(DuccUtil):
DUCC_JVM_OPTS = DUCC_JVM_OPTS + ' -DDUCC_HOME=' + self.DUCC_HOME
DUCC_JVM_OPTS = DUCC_JVM_OPTS + ' -Dducc.head=' + self.ducc_properties.get('ducc.head')
- self.spawn(self.java(), DUCC_JVM_OPTS, 'org.apache.uima.ducc.common.main.DuccRmAdmin', '--qnodes')
+ self.spawn(self.java(), DUCC_JVM_OPTS, 'org.apache.uima.ducc.common.main.DuccRmAdmin', '--qload')
return
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/admin/event/RmAdminQLoadReply.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/admin/event/RmAdminQLoadReply.java?rev=1595930&r1=1595929&r2=1595930&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/admin/event/RmAdminQLoadReply.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/admin/event/RmAdminQLoadReply.java Mon May 19 15:20:41 2014
@@ -19,7 +19,7 @@
package org.apache.uima.ducc.common.admin.event;
public class RmAdminQLoadReply
- extends DuccAdminEvent
+ extends RmAdminReply
{
private static final long serialVersionUID = -8101741014979144426L;
@@ -30,13 +30,17 @@ public class RmAdminQLoadReply
int sharesAvailable; // total shares available for scheduling (busy plus empty)
int sharesFree; // total shares unused
- int sharesDemanded; // shares that would be used in an infinite-share system
-
+ int[] sharesDemanded; // shares that would be used in an infinite-share system
+ int[] sharesAwarded; // shares assigned, less pending preemptions, plus pending expansions
+ int[] machinesOnline; // machines available for scheduling
+ int[] machinesFree; // machines with no assignments
+ int[] machinesVirtual; // machines after carving out space
int pendingEvictions; // number of evictions started but not confirmed
int pendingExpansions; // number of expansions started but not confirmed
public RmAdminQLoadReply()
{
+ super(null);
}
public int getNodesOnline() {
@@ -104,26 +108,104 @@ public class RmAdminQLoadReply
this.pendingExpansions = pending_expansions;
}
- public int getSharesDemanded() {
+ public int[] getSharesDemanded() {
return sharesDemanded;
}
- public void setSharesDemanded(int shares_demanded) {
+ public void setSharesDemanded(int[] shares_demanded) {
this.sharesDemanded = shares_demanded;
}
+ public int[] getSharesAwarded() {
+ return sharesAwarded;
+ }
+
+ public void setSharesAwarded(int[] shares_awarded) {
+ this.sharesAwarded = shares_awarded;
+ }
+
+ public int[] getMachinesOnline() {
+ return machinesOnline;
+ }
+
+ public void setMachinesOnline(int[] machines_online) {
+ this.machinesOnline = machines_online;
+ }
+
+ public int[] getMachinesFree() {
+ return machinesFree;
+ }
+
+ public void setMachinesFree(int[] machines_free) {
+ this.machinesFree = machines_free;
+ }
+
+ public int[] getVirtualMachinesFree() {
+ int[] vm = machinesVirtual.clone();
+ int len = vm.length;
+ for ( int o = 1; o < len; o++ ) { // counting by share order
+ //nFreeSharesByOrder[o] = nMachinesByOrder[o] * o;
+ for ( int p = o+1; p < len; p++ ) {
+ if ( vm[p] != 0 ) {
+ vm[o] += (p / o) * vm[p];
+ }
+ }
+ }
+
+ return vm;
+ }
+
+ public int[] getMachinesVirtual() {
+ return this.machinesVirtual;
+ }
+
+ public void setMachinesVirtual(int[] machines_virtual) {
+ this.machinesVirtual = machines_virtual;
+ }
+
+ private String fmtArray(int[] array)
+ {
+ Object[] vals = new Object[array.length];
+ StringBuffer sb = new StringBuffer();
+
+ for ( int i = 0; i < array.length; i++ ) {
+ sb.append("%3s ");
+ vals[i] = Integer.toString(array[i]);
+ }
+ return String.format(sb.toString(), vals);
+ }
+
public String toString()
{
StringBuffer sb = new StringBuffer();
- String hdr = "%10s %9s %12s %9s %16s %10s %14s %16s %17s";
- String fmt = "%10d %9d %12d %9d %16d %10d %14d %16d %17d";
+ String hdr = "%10s %9s %12s %9s %16s %10s %16s %17s";
+ String fmt = "%10d %9d %12d %9d %16d %10d %16d %17d";
sb.append(String.format(hdr, "TotalNodes", "DeadNOdes", "OfflineNodes", "FreeNodes",
- "SharesAvailable", "SharesFree", "SharesDemanded",
+ "SharesAvailable", "SharesFree",
"PendingEvictions", "PendingExpansions"));
+ sb.append("\n");
sb.append(String.format(fmt, nodesOnline, nodesDead, nodesOffline, nodesFree,
- sharesAvailable, sharesFree, sharesDemanded,
+ sharesAvailable, sharesFree,
pendingEvictions, pendingExpansions));
+
+ sb.append("\nOnline Hosts By Order:\n");
+ sb.append(fmtArray(machinesOnline));
+
+ sb.append("\nFree Hosts By Order:\n");
+ sb.append(fmtArray(machinesFree));
+
+ sb.append("\nFree Shares By Order:\n");
+ sb.append(fmtArray(machinesVirtual));
+
+ sb.append("\nFree Virtual Shares By Order:\n");
+ sb.append(fmtArray(getVirtualMachinesFree()));
+
+ sb.append("\nWanted Shares By Order:\n");
+ sb.append(fmtArray(sharesDemanded));
+
+ sb.append("\nAwarded Shares By Order:\n");
+ sb.append(fmtArray(sharesAwarded));
return sb.toString();
}
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/IRmJob.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/IRmJob.java?rev=1595930&r1=1595929&r2=1595930&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/IRmJob.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/IRmJob.java Mon May 19 15:20:41 2014
@@ -79,6 +79,11 @@ public interface IRmJob
public int countNSharesLost();
/**
+ * For queries - how many processes do I want in a perfect world?
+ */
+ public int queryDemand();
+
+ /**
* Eviction policies, configurable.
*/
public int shrinkByOrderByMachine(int shares, int order, boolean force, NodePool np); // shrink by largest machine first, minimize fragmentation
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java?rev=1595930&r1=1595929&r2=1595930&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java Mon May 19 15:20:41 2014
@@ -86,7 +86,7 @@ class NodePool
//int neededByOrder[]; // for each order, how many N-shares do I want to add?
// int shareExpansion[];
- int machineExpansion[];
+ Map<Integer, Integer> onlineMachinesByOrder = new HashMap<Integer, Integer>(); // all online machines
HashMap<Integer, HashMap<Node, Machine>> virtualMachinesByOrder;
static int maxorder = 0;
@@ -113,6 +113,7 @@ class NodePool
this.evictionPolicy = ep;
this.depth = depth;
this.order = order;
+
}
NodePool getParent()
@@ -222,6 +223,8 @@ class NodePool
mlist = allMachines;
}
+ if ( mlist == null ) return 0;
+
for ( Machine m : mlist.values() ) {
if ( m.isFree() ) {
cnt++;
@@ -621,8 +624,6 @@ class NodePool
nPendingByOrder = new int[maxorder + 1];
machinesToPreempt = new int[maxorder + 1];
- // shareExpansion = new int[maxorder + 1];
- machineExpansion = new int[maxorder + 1];
virtualMachinesByOrder = new HashMap<Integer, HashMap<Node, Machine>>();
for ( Integer i : machinesByOrder.keySet() ) {
@@ -726,6 +727,30 @@ class NodePool
return np;
}
+ private synchronized void incrementOnlineByOrder(int order)
+ {
+ if ( ! onlineMachinesByOrder.containsKey(order) ) {
+ onlineMachinesByOrder.put(order, 1);
+ } else {
+ onlineMachinesByOrder.put(order, onlineMachinesByOrder.get(order) + 1);
+ }
+ }
+
+ private synchronized void decrementOnlineByOrder(int order)
+ {
+ onlineMachinesByOrder.put(order, onlineMachinesByOrder.get(order) - 1);
+ }
+
+ synchronized void getOnlineByOrder(int[] ret) // for queries
+ {
+ for ( int o: onlineMachinesByOrder.keySet() ) {
+ ret[o] += onlineMachinesByOrder.get(o);
+ }
+ for ( NodePool child : children.values() ) {
+ child.getOnlineByOrder(ret);
+ }
+ }
+
/**
* Handle a new node update.
*/
@@ -762,10 +787,12 @@ class NodePool
m.setShareOrder(order); // hardware changes.
}
+ // TODO soon ... can I just combine this with the code directly below:
allMachines.put(node, m);
machinesByName.put(m.getId(), m);
machinesByIp.put(m.getIp(), m);
HashMap<Node, Machine> mlist = machinesByOrder.get(order);
+ incrementOnlineByOrder(order);
if ( mlist == null ) {
mlist = new HashMap<Node, Machine>();
machinesByOrder.put(order, mlist);
@@ -781,6 +808,7 @@ class NodePool
allMachines.put(machine.key(), machine); // global list
machinesByName.put(machine.getId(), machine);
machinesByIp.put(machine.getIp(), machine);
+ incrementOnlineByOrder(order);
machine.setNodepool(this);
total_shares += order;
@@ -828,6 +856,7 @@ class NodePool
}
allMachines.remove(m.key());
+ decrementOnlineByOrder(order);
total_shares -= order;
disableMap.put(m.key(), m);
@@ -1437,17 +1466,6 @@ class NodePool
return expansions;
}
-// void setShareExpansion(int count, int order)
-// {
-// shareExpansion[order] += count;
-// }
-
-
- void setMachineExpansion(int count, int order)
- {
- machineExpansion[order] += count;
- }
-
/**
* This prints garbage unless you call reset() first.
*/
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/RmJob.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/RmJob.java?rev=1595930&r1=1595929&r2=1595930&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/RmJob.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/RmJob.java Mon May 19 15:20:41 2014
@@ -262,6 +262,12 @@ public class RmJob
return machineList;
}
+ public int queryDemand()
+ {
+ if ( getSchedulingPolicy() == Policy.FAIR_SHARE ) return getJobCap();
+ return countInstances();
+ }
+
/**
* There are a fair number of piddling little methods to manage shares. This high granularity is
* needed in order to manage bits and pieces of the bookkeeping from different threads and queues
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Scheduler.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Scheduler.java?rev=1595930&r1=1595929&r2=1595930&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Scheduler.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Scheduler.java Mon May 19 15:20:41 2014
@@ -137,7 +137,7 @@ public class Scheduler
// 1.0.3 - fix bad check in recursion in NodepoolScheduler.doEvictions
final static int rmversion_major = 1;
final static int rmversion_minor = 0;
- final static int rmversion_ptf = 3;
+ final static int rmversion_ptf = 4;
final static String rmversion_string = null;
boolean initialized = false; // we refuse nodeupdates until this is true
@@ -1089,18 +1089,16 @@ public class Scheduler
public synchronized RmAdminQLoadReply queryLoad()
{
RmAdminQLoadReply reply = new RmAdminQLoadReply();
- /**
- int nodesOnline; // number of schedulable nodes
- int nodesDead; // number of nodes marked dead
- int nodesOffline; // number of nodes varied off
- int nodesFree; // number of nodes with nothing on them
- */
+
int online = 0;
int dead = 0;
int offline = 0;
int free = 0;
int shares_available = 0;
int shares_free = 0;
+ int[] onlineMachines = NodePool.makeArray();
+ int[] freeMachines = NodePool.makeArray();
+ int[] virtualMachines = NodePool.makeArray();
for ( NodePool np : nodepools ) {
online += np.countMachines();
@@ -1110,7 +1108,26 @@ public class Scheduler
shares_available += np.countTotalShares();
shares_free += np.countQShares();
+ np.getOnlineByOrder(onlineMachines);
+
+ for ( int i = 1; i < freeMachines.length; i++ ) {
+ freeMachines[i] += np.countFreeMachines(i, true);
+ }
+
+ int[] t = np.cloneVMachinesByOrder();
+ for ( int i = 1; i < virtualMachines.length; i++ ) {
+ virtualMachines[i] += t[i];
+ }
+ }
+
+ int[] demanded = NodePool.makeArray();
+ int[] awarded = NodePool.makeArray();
+ for ( IRmJob j : allJobs.values() ) {
+ int o = j.getShareOrder();
+ demanded[o] += j.queryDemand();
+ awarded[o] += j.countNShares();
}
+
reply.setNodesOnline(online);
reply.setNodesDead(dead);
reply.setNodesOffline(offline);
@@ -1119,6 +1136,11 @@ public class Scheduler
reply.setSharesFree(shares_free);
reply.setPendingExpansions(pending_expansions);
reply.setPendingEvictions(pending_evictions);
+ reply.setSharesDemanded(demanded);
+ reply.setSharesAwarded(awarded);
+ reply.setMachinesOnline(onlineMachines);
+ reply.setMachinesFree(freeMachines);
+ reply.setMachinesVirtual(virtualMachines);
return reply;
}
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/User.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/User.java?rev=1595930&r1=1595929&r2=1595930&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/User.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/User.java Mon May 19 15:20:41 2014
@@ -33,7 +33,7 @@ public class User
private int pure_fair_share; // uncapped un-bonused counts
private int share_wealth; // defrag, how many relevent Q shares do i really have?
private int[] given_by_order = null;
- private int[] wanted_by_order = null;
+ private int[] wanted_by_order = null; // transient and not immutable, can't use for queries
private int totalWantedByOrder = 0; // transient, calculated for each schedule
private static Comparator<IEntity> apportionmentSorter = new ApportionmentSorterCl();