/***********************************************************************************************************************
* Copyright (C) 2010-2013 by the Stratosphere project (http://stratosphere.eu)
*
* Licensed 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 eu.stratosphere.nephele.jobmanager;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import eu.stratosphere.nephele.instance.InstanceManager;
import eu.stratosphere.nephele.jobmanager.JobManager.ExecutionMode;
import eu.stratosphere.nephele.jobmanager.scheduler.AbstractScheduler;
import eu.stratosphere.util.StringUtils;
/**
* This class provides static utility methods for the {@link JobManager}.
*
*/
public class JobManagerUtils {
/**
* The logging object used by the utility methods.
*/
private static final Log LOG = LogFactory.getLog(JobManagerUtils.class);
/**
* Private constructor.
*/
private JobManagerUtils() {
}
/**
* Tries to locate a class with given name and to
* instantiate a {@link AbstractScheduler} object from it.
*
* @param schedulerClassName
* the name of the class to instantiate the scheduler object from
* @param deploymentManager
* the deployment manager which shall be passed on to the scheduler
* @param instanceManager
* the instance manager which shall be passed on to the scheduler
* @return the {@link AbstractScheduler} object instantiated from the class with the provided name
*/
@SuppressWarnings("unchecked")
static AbstractScheduler loadScheduler(final String schedulerClassName, final DeploymentManager deploymentManager,
final InstanceManager instanceManager) {
Class<? extends AbstractScheduler> schedulerClass;
try {
schedulerClass = (Class<? extends AbstractScheduler>) Class.forName(schedulerClassName);
} catch (ClassNotFoundException e) {
LOG.error("Cannot find class " + schedulerClassName + ": " + StringUtils.stringifyException(e));
return null;
}
Constructor<? extends AbstractScheduler> constructor;
try {
Class<?>[] constructorArgs = { DeploymentManager.class, InstanceManager.class };
constructor = schedulerClass.getConstructor(constructorArgs);
} catch (NoSuchMethodException e) {
LOG.error("Cannot create scheduler: " + StringUtils.stringifyException(e));
return null;
} catch (SecurityException e) {
LOG.error("Cannot create scheduler: " + StringUtils.stringifyException(e));
return null;
}
AbstractScheduler scheduler;
try {
scheduler = constructor.newInstance(deploymentManager, instanceManager);
} catch (InstantiationException e) {
LOG.error("Cannot create scheduler: " + StringUtils.stringifyException(e));
return null;
} catch (IllegalAccessException e) {
LOG.error("Cannot create scheduler: " + StringUtils.stringifyException(e));
return null;
} catch (IllegalArgumentException e) {
LOG.error("Cannot create scheduler: " + StringUtils.stringifyException(e));
return null;
} catch (InvocationTargetException e) {
LOG.error("Cannot create scheduler: " + StringUtils.stringifyException(e));
return null;
}
return scheduler;
}
/**
* Tries to locate a class with given name and to
* instantiate a instance manager from it.
*
* @param instanceManagerClassName
* the name of the class to instantiate the instance manager object from
* @return the {@link InstanceManager} object instantiated from the class with the provided name
*/
@SuppressWarnings("unchecked")
static InstanceManager loadInstanceManager(final String instanceManagerClassName) {
Class<? extends InstanceManager> instanceManagerClass;
try {
instanceManagerClass = (Class<? extends InstanceManager>) Class.forName(instanceManagerClassName);
} catch (ClassNotFoundException e) {
LOG.error("Cannot find class " + instanceManagerClassName + ": " + StringUtils.stringifyException(e));
return null;
}
InstanceManager instanceManager;
try {
instanceManager = instanceManagerClass.newInstance();
} catch (InstantiationException e) {
LOG.error("Cannot create instanceManager: " + StringUtils.stringifyException(e));
return null;
} catch (IllegalAccessException e) {
LOG.error("Cannot create instanceManager: " + StringUtils.stringifyException(e));
return null;
}
return instanceManager;
}
/**
* Tries to read the class name of the {@link AbstractScheduler} implementation from the global configuration which
* is set to be used for the provided execution mode.
*
* @param executionMode The Nephele execution mode.
* @return the class name of the {@link AbstractScheduler} implementation to be used or <code>null</code> if no
* implementation is configured for the given execution mode
*/
static String getSchedulerClassName(ExecutionMode executionMode) {
switch (executionMode) {
case LOCAL:
return "eu.stratosphere.nephele.jobmanager.scheduler.local.LocalScheduler";
case CLUSTER:
return "eu.stratosphere.nephele.jobmanager.scheduler.queue.QueueScheduler";
default:
throw new RuntimeException("Unrecognized Execution Mode.");
}
// String modeClass = getClassStringForMode(executionMode);
// String instanceManagerClassNameKey = "jobmanager.scheduler." + modeClass + ".classname";
// String schedulerClassName = GlobalConfiguration.getString(instanceManagerClassNameKey, null);
//
// if (executionMode == ExecutionMode.LOCAL && schedulerClassName == null) {
// schedulerClassName = ConfigConstants.DEFAULT_LOCAL_MODE_SCHEDULER;
// }
// return schedulerClassName;
}
/**
* Tries to read the class name of the {@link InstanceManager} implementation from the global configuration which is
* set to be used for the provided execution mode.
*
* @param executionMode The Nephele execution mode.
* @return the class name of the {@link InstanceManager} implementation to be used or <code>null</code> if no
* implementation is configured for the given execution mode
*/
static String getInstanceManagerClassName(ExecutionMode executionMode) {
switch (executionMode) {
case LOCAL:
return "eu.stratosphere.nephele.instance.local.LocalInstanceManager";
case CLUSTER:
return "eu.stratosphere.nephele.instance.cluster.ClusterManager";
default:
throw new RuntimeException("Unrecognized Execution Mode.");
}
//
// final String modeClass = getClassStringForMode(executionMode);
// final String instanceManagerClassNameKey = "jobmanager.instancemanager." + modeClass + ".classname";
// return GlobalConfiguration.getString(instanceManagerClassNameKey, null);
}
}