You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mapreduce-commits@hadoop.apache.org by ac...@apache.org on 2011/03/17 21:21:54 UTC
svn commit: r1082677 [33/38] - in /hadoop/mapreduce/branches/MR-279: ./
assembly/ ivy/ mr-client/ mr-client/hadoop-mapreduce-client-app/
mr-client/hadoop-mapreduce-client-app/src/
mr-client/hadoop-mapreduce-client-app/src/main/ mr-client/hadoop-mapredu...
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterInfo.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterInfo.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterInfo.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterInfo.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,351 @@
+/**
+* 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.yarn.server.resourcemanager.applicationsmanager;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.classification.InterfaceAudience.Private;
+import org.apache.hadoop.classification.InterfaceStability.Unstable;
+import org.apache.hadoop.yarn.ApplicationID;
+import org.apache.hadoop.yarn.ApplicationMaster;
+import org.apache.hadoop.yarn.ApplicationState;
+import org.apache.hadoop.yarn.ApplicationStatus;
+import org.apache.hadoop.yarn.ApplicationSubmissionContext;
+import org.apache.hadoop.yarn.Container;
+import org.apache.hadoop.yarn.Resource;
+import org.apache.hadoop.yarn.event.EventHandler;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationTrackerEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.SNEventType;
+import org.apache.hadoop.yarn.state.InvalidStateTransitonException;
+import org.apache.hadoop.yarn.state.SingleArcTransition;
+import org.apache.hadoop.yarn.state.StateMachine;
+import org.apache.hadoop.yarn.state.StateMachineFactory;
+
+/**
+ * This class manages the state of a application master. Also, it
+ * provide a read only interface for all the services to get information
+ * about this application.
+ *
+ */
+@Private
+@Unstable
+public class ApplicationMasterInfo implements AppContext, EventHandler<ASMEvent<ApplicationEventType>> {
+ private static final Log LOG = LogFactory.getLog(ApplicationMasterInfo.class);
+ private final ApplicationSubmissionContext submissionContext;
+ private ApplicationMaster master;
+ private final EventHandler handler;
+ private Container masterContainer;
+ final private String user;
+ /* this transition is too generalized, needs to be broken up as and when we
+ * keeping adding states. This will keep evolving and is not final yet.
+ */
+ private final KillTransition killTransition = new KillTransition();
+ private final StatusUpdateTransition statusUpdatetransition = new StatusUpdateTransition();
+
+ private final StateMachine<ApplicationState, ApplicationEventType,
+ ASMEvent<ApplicationEventType>> stateMachine;
+
+ private final StateMachineFactory<ApplicationMasterInfo,
+ ApplicationState, ApplicationEventType, ASMEvent<ApplicationEventType>> stateMachineFactory
+
+ = new StateMachineFactory
+ <ApplicationMasterInfo, ApplicationState, ApplicationEventType, ASMEvent<ApplicationEventType>>
+ (ApplicationState.PENDING)
+
+ .addTransition(ApplicationState.PENDING, ApplicationState.ALLOCATING,
+ ApplicationEventType.ALLOCATE, new AllocateTransition())
+
+ .addTransition(ApplicationState.PENDING, ApplicationState.CLEANUP,
+ ApplicationEventType.KILL, killTransition)
+
+ .addTransition(ApplicationState.ALLOCATING, ApplicationState.ALLOCATED,
+ ApplicationEventType.ALLOCATED, new AllocatedTransition())
+
+ .addTransition(ApplicationState.ALLOCATING, ApplicationState.CLEANUP,
+ ApplicationEventType.KILL, killTransition)
+
+ .addTransition(ApplicationState.ALLOCATED, ApplicationState.CLEANUP,
+ ApplicationEventType.KILL, killTransition)
+
+ .addTransition(ApplicationState.ALLOCATED, ApplicationState.LAUNCHING,
+ ApplicationEventType.LAUNCH, new LaunchTransition())
+
+ .addTransition(ApplicationState.LAUNCHING, ApplicationState.LAUNCHED,
+ ApplicationEventType.LAUNCHED, new LaunchedTransition())
+
+ .addTransition(ApplicationState.LAUNCHING, ApplicationState.KILLED,
+ ApplicationEventType.KILL, killTransition)
+
+ .addTransition(ApplicationState.LAUNCHED, ApplicationState.CLEANUP,
+ ApplicationEventType.KILL, killTransition)
+
+ .addTransition(ApplicationState.LAUNCHED, ApplicationState.FAILED,
+ ApplicationEventType.EXPIRE, new ExpireTransition())
+
+ .addTransition(ApplicationState.LAUNCHED, ApplicationState.RUNNING,
+ ApplicationEventType.REGISTERED, new RegisterTransition())
+
+ .addTransition(ApplicationState.RUNNING, ApplicationState.FAILED,
+ ApplicationEventType.EXPIRE, new ExpireTransition())
+
+ .addTransition(ApplicationState.RUNNING, ApplicationState.COMPLETED,
+ ApplicationEventType.FINISH, new DoneTransition())
+
+ .addTransition(ApplicationState.RUNNING, ApplicationState.RUNNING,
+ ApplicationEventType.STATUSUPDATE, statusUpdatetransition)
+
+ .addTransition(ApplicationState.COMPLETED, ApplicationState.COMPLETED,
+ ApplicationEventType.EXPIRE)
+
+ .installTopology();
+
+
+
+ public ApplicationMasterInfo(EventHandler handler, String user,
+ ApplicationSubmissionContext submissionContext, String clientToken) {
+ this.user = user;
+ this.handler = handler;
+ this.submissionContext = submissionContext;
+ master = new ApplicationMaster();
+ master.applicationId = submissionContext.applicationId;
+ master.status = new ApplicationStatus();
+ master.status.applicationId = submissionContext.applicationId;
+ master.status.progress = -1.0f;
+ stateMachine = stateMachineFactory.make(this);
+ master.state = ApplicationState.PENDING;
+ master.clientToken = clientToken;
+ }
+
+ @Override
+ public ApplicationSubmissionContext getSubmissionContext() {
+ return submissionContext;
+ }
+
+ @Override
+ public Resource getResource() {
+ return submissionContext.masterCapability;
+ }
+
+ @Override
+ public synchronized ApplicationID getApplicationID() {
+ return this.master.applicationId;
+ }
+
+ @Override
+ public synchronized ApplicationStatus getStatus() {
+ return master.status;
+ }
+
+ public synchronized void updateStatus(ApplicationStatus status) {
+ this.master.status = status;
+ }
+
+ @Override
+ public synchronized ApplicationMaster getMaster() {
+ return master;
+ }
+
+ /* make sure the master state is in sync with statemachine state */
+ public synchronized ApplicationState getState() {
+ return master.state;
+ }
+
+ @Override
+ public synchronized Container getMasterContainer() {
+ return masterContainer;
+ }
+
+
+ @Override
+ public String getUser() {
+ return this.user;
+ }
+
+ @Override
+ public synchronized long getLastSeen() {
+ return this.master.status.lastSeen;
+ }
+
+ @Override
+ public String getName() {
+ return submissionContext.applicationName.toString();
+ }
+
+ @Override
+ public String getQueue() {
+ return submissionContext.queue.toString();
+ }
+
+ /* the applicaiton master completed successfully */
+ private static class DoneTransition implements
+ SingleArcTransition<ApplicationMasterInfo, ASMEvent<ApplicationEventType>> {
+
+ @Override
+ public void transition(ApplicationMasterInfo masterInfo,
+ ASMEvent<ApplicationEventType> event) {
+ masterInfo.handler.handle(new ASMEvent<SNEventType>(
+ SNEventType.CLEANUP, masterInfo));
+ masterInfo.handler.handle(new ASMEvent<AMLauncherEventType>(
+ AMLauncherEventType.CLEANUP, masterInfo));
+ masterInfo.handler.handle(new ASMEvent<ApplicationTrackerEventType>(
+ ApplicationTrackerEventType.REMOVE, masterInfo));
+ }
+ }
+
+ private static class KillTransition implements
+ SingleArcTransition<ApplicationMasterInfo, ASMEvent<ApplicationEventType>> {
+ @Override
+ public void transition(ApplicationMasterInfo masterInfo,
+ ASMEvent<ApplicationEventType> event) {
+ masterInfo.handler.handle(new ASMEvent<SNEventType>(SNEventType.CLEANUP, masterInfo));
+ masterInfo.handler.handle(new ASMEvent<AMLauncherEventType>(AMLauncherEventType.CLEANUP, masterInfo));
+ }
+ }
+
+ private static class LaunchTransition implements
+ SingleArcTransition<ApplicationMasterInfo, ASMEvent<ApplicationEventType>> {
+ @Override
+ public void transition(ApplicationMasterInfo masterInfo,
+ ASMEvent<ApplicationEventType> event) {
+ masterInfo.handler.handle(new ASMEvent<AMLauncherEventType>(
+ AMLauncherEventType.LAUNCH, masterInfo));
+ }
+ }
+
+ private static class LaunchedTransition implements
+ SingleArcTransition<ApplicationMasterInfo, ASMEvent<ApplicationEventType>> {
+ @Override
+ public void transition(ApplicationMasterInfo masterInfo,
+ ASMEvent<ApplicationEventType> event) {
+ /* make sure the time stamp is update else expiry thread will expire this */
+ masterInfo.master.status.lastSeen = System.currentTimeMillis();
+ }
+ }
+
+ private static class ExpireTransition implements
+ SingleArcTransition<ApplicationMasterInfo, ASMEvent<ApplicationEventType>> {
+ @Override
+ public void transition(ApplicationMasterInfo masterInfo,
+ ASMEvent<ApplicationEventType> event) {
+ /* for now this is the same as killed transition but will change later */
+ masterInfo.handler.handle(new ASMEvent<SNEventType>(SNEventType.CLEANUP,
+ masterInfo));
+ masterInfo.handler.handle(new ASMEvent<AMLauncherEventType>(
+ AMLauncherEventType.CLEANUP, masterInfo));
+ masterInfo.handler.handle(new ASMEvent<ApplicationTrackerEventType>(
+ ApplicationTrackerEventType.REMOVE, masterInfo));
+ }
+ }
+
+
+ /* Transition to start the process of allocating for the AM container */
+ private static class AllocateTransition implements
+ SingleArcTransition<ApplicationMasterInfo, ASMEvent<ApplicationEventType>> {
+ @Override
+ public void transition(ApplicationMasterInfo masterInfo,
+ ASMEvent<ApplicationEventType> event) {
+ /* notify tracking applications that an applicaiton has been added */
+ masterInfo.handler.handle(new ASMEvent<ApplicationTrackerEventType>(
+ ApplicationTrackerEventType.ADD, masterInfo));
+
+ /* schedule for a slot */
+ masterInfo.handler.handle(new ASMEvent<SNEventType>(SNEventType.SCHEDULE,
+ masterInfo));
+ }
+ }
+
+ /* Transition on a container allocated for a container */
+ private static class AllocatedTransition implements SingleArcTransition<ApplicationMasterInfo,
+ ASMEvent<ApplicationEventType>> {
+
+ @Override
+ public void transition(ApplicationMasterInfo masterInfo,
+ ASMEvent<ApplicationEventType> event) {
+ /* set the container that was generated by the scheduler negotiator */
+ masterInfo.masterContainer = event.getAppContext().getMasterContainer();
+ }
+ }
+
+ private static class RegisterTransition implements SingleArcTransition<ApplicationMasterInfo,
+ ASMEvent<ApplicationEventType>> {
+ @Override
+ public void transition(ApplicationMasterInfo masterInfo,
+ ASMEvent<ApplicationEventType> event) {
+ ApplicationMaster registeredMaster = event.getAppContext().getMaster();
+ masterInfo.master.host = registeredMaster.host;
+ masterInfo.master.httpPort = registeredMaster.httpPort;
+ masterInfo.master.rpcPort = registeredMaster.rpcPort;
+ masterInfo.master.status = registeredMaster.status;
+ masterInfo.master.status.progress = 0.0f;
+ masterInfo.master.status.lastSeen = System.currentTimeMillis();
+ }
+ }
+
+ /* transition to finishing state on a cleanup, for now its not used, but will need it
+ * later */
+ private static class FinishTransition implements
+ SingleArcTransition<ApplicationMasterInfo, ASMEvent<ApplicationEventType>> {
+
+ @Override
+ public void transition(ApplicationMasterInfo masterInfo,
+ ASMEvent<ApplicationEventType> event) {
+ masterInfo.handler.handle(new ASMEvent<SNEventType>(
+ SNEventType.CLEANUP, masterInfo));
+ masterInfo.handler.handle(new ASMEvent<AMLauncherEventType>(
+ AMLauncherEventType.CLEANUP, masterInfo));
+ }
+ }
+
+
+ /* Just a status update transition */
+ private static class StatusUpdateTransition implements
+ SingleArcTransition<ApplicationMasterInfo, ASMEvent<ApplicationEventType>> {
+
+ @Override
+ public void transition(ApplicationMasterInfo masterInfo,
+ ASMEvent<ApplicationEventType> event) {
+ masterInfo.master.status = event.getAppContext().getStatus();
+ masterInfo.master.status.lastSeen = System.currentTimeMillis();
+ }
+ }
+
+ @Override
+ public synchronized void handle(ASMEvent<ApplicationEventType> event) {
+ ApplicationID appID = event.getAppContext().getApplicationID();
+ LOG.info("Processing event for " + appID + " of type " + event.getType());
+ final ApplicationState oldState = getState();
+ try {
+ /* keep the master in sync with the state machine */
+ stateMachine.doTransition(event.getType(), event);
+ master.state = stateMachine.getCurrentState();
+ LOG.info("State is " + stateMachine.getCurrentState());
+ } catch (InvalidStateTransitonException e) {
+ LOG.error("Can't handle this event at current state", e);
+ /* TODO fail the application on the failed transition */
+ }
+ if (oldState != getState()) {
+ LOG.info(appID + " State change from "
+ + oldState + " to "
+ + getState());
+ }
+ }
+}
\ No newline at end of file
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterLauncher.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterLauncher.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterLauncher.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterLauncher.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,124 @@
+/**
+* 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.yarn.server.resourcemanager.applicationsmanager;
+import java.util.Queue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.yarn.event.EventHandler;
+import org.apache.hadoop.yarn.security.ApplicationTokenSecretManager;
+import org.apache.hadoop.yarn.security.client.ClientToAMSecretManager;
+import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.ASMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
+import org.apache.hadoop.yarn.service.AbstractService;
+
+
+class ApplicationMasterLauncher extends AbstractService implements EventHandler<ASMEvent<AMLauncherEventType>> {
+ private static final Log LOG = LogFactory.getLog(
+ ApplicationMasterLauncher.class);
+ private final ThreadPoolExecutor launcherPool;
+ private final EventHandler handler;
+ private Thread launcherHandlingThread;
+
+ private final Queue<Runnable> masterEvents
+ = new LinkedBlockingQueue<Runnable>();
+
+ private ApplicationTokenSecretManager applicationTokenSecretManager;
+ private ClientToAMSecretManager clientToAMSecretManager;
+ private final ASMContext context;
+
+ public ApplicationMasterLauncher(ApplicationTokenSecretManager
+ applicationTokenSecretManager, ClientToAMSecretManager clientToAMSecretManager,
+ ASMContext context) {
+ super(ApplicationMasterLauncher.class.getName());
+ this.context = context;
+ this.handler = context.getDispatcher().getEventHandler();
+ /* register to dispatcher */
+ this.context.getDispatcher().register(AMLauncherEventType.class, this);
+ this.launcherPool = new ThreadPoolExecutor(1, 10, 1,
+ TimeUnit.HOURS, new LinkedBlockingQueue<Runnable>());
+ this.launcherHandlingThread = new LauncherThread();
+ this.applicationTokenSecretManager = applicationTokenSecretManager;
+ this.clientToAMSecretManager = clientToAMSecretManager;
+ }
+
+ public void start() {
+ launcherHandlingThread.start();
+ super.start();
+ }
+
+ protected Runnable createRunnableLauncher(AppContext masterInfo, AMLauncherEventType event) {
+ Runnable launcher = new AMLauncher(context, masterInfo, event,
+ applicationTokenSecretManager, clientToAMSecretManager, getConfig());
+ return launcher;
+ }
+
+ private void launch(AppContext appContext) {
+ Runnable launcher = createRunnableLauncher(appContext, AMLauncherEventType.LAUNCH);
+ masterEvents.add(launcher);
+ }
+
+
+ public void stop() {
+ launcherHandlingThread.interrupt();
+ try {
+ launcherHandlingThread.join(1000);
+ } catch (InterruptedException ie) {
+ LOG.info(launcherHandlingThread.getName() + " interrupted during join ",
+ ie); }
+ launcherPool.shutdown();
+ super.stop();
+ }
+
+ private class LauncherThread extends Thread {
+ @Override
+ public void run() {
+ while (!this.isInterrupted()) {
+ Runnable toLaunch = masterEvents.poll();
+ if (toLaunch != null) {
+ launcherPool.execute(toLaunch);
+ }
+ }
+ }
+ }
+
+ private void cleanup(AppContext appContext) {
+ Runnable launcher = createRunnableLauncher(appContext, AMLauncherEventType.CLEANUP);
+ masterEvents.add(launcher);
+ }
+
+ @Override
+ public synchronized void handle(ASMEvent<AMLauncherEventType> appEvent) {
+ AMLauncherEventType event = appEvent.getType();
+ AppContext appContext = appEvent.getAppContext();
+ switch (event) {
+ case LAUNCH:
+ launch(appContext);
+ break;
+ case CLEANUP:
+ cleanup(appContext);
+ default:
+ break;
+ }
+ }
+}
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationsManager.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationsManager.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationsManager.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationsManager.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,44 @@
+/**
+* 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.yarn.server.resourcemanager.applicationsmanager;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.hadoop.classification.InterfaceAudience.Private;
+import org.apache.hadoop.classification.InterfaceStability.Evolving;
+import org.apache.hadoop.yarn.Application;
+import org.apache.hadoop.yarn.ApplicationID;
+import org.apache.hadoop.yarn.ApplicationMaster;
+import org.apache.hadoop.yarn.ApplicationSubmissionContext;
+
+/**
+ * This interface defines the interface for ApplicationsManager.
+ */
+@Private
+@Evolving
+public interface ApplicationsManager {
+ ApplicationID getNewApplicationID();
+ ApplicationMaster getApplicationMaster(ApplicationID applicationId);
+ Application getApplication(ApplicationID applicationID);
+ void submitApplication(ApplicationSubmissionContext context) throws IOException;
+ void finishApplication(ApplicationID applicationId) throws IOException;
+ List<AppContext> getAllApplications();
+ List<Application> getApplications();
+}
\ No newline at end of file
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationsManagerImpl.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationsManagerImpl.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationsManagerImpl.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationsManagerImpl.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,274 @@
+/**
+* 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.yarn.server.resourcemanager.applicationsmanager;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.security.UserGroupInformation;
+import org.apache.hadoop.security.token.Token;
+import org.apache.hadoop.yarn.Application;
+import org.apache.hadoop.yarn.ApplicationID;
+import org.apache.hadoop.yarn.ApplicationMaster;
+import org.apache.hadoop.yarn.ApplicationState;
+import org.apache.hadoop.yarn.ApplicationStatus;
+import org.apache.hadoop.yarn.ApplicationSubmissionContext;
+import org.apache.hadoop.yarn.event.Event;
+import org.apache.hadoop.yarn.event.EventHandler;
+import org.apache.hadoop.yarn.security.ApplicationTokenIdentifier;
+import org.apache.hadoop.yarn.security.ApplicationTokenSecretManager;
+import org.apache.hadoop.yarn.security.client.ClientToAMSecretManager;
+import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
+import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.ASMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.SNEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.YarnScheduler;
+import org.apache.hadoop.yarn.service.CompositeService;
+import org.apache.hadoop.yarn.service.Service;
+
+
+/**
+ * This is the main class for the applications manager. This keeps track
+ * of the application masters running in the system and is responsible for
+ * getting a container for AM and launching it.
+ * {@link ApplicationsManager} is the interface that clients use to talk to
+ * ASM via the RPC servers. {@link ApplicationMasterHandler} is the interface that
+ * AM's use to talk to the ASM via the RPC.
+ */
+public class ApplicationsManagerImpl extends CompositeService
+ implements ApplicationsManager, ApplicationMasterHandler {
+ private static final Log LOG = LogFactory.getLog(ApplicationsManagerImpl.class);
+
+ final private AtomicInteger applicationCounter = new AtomicInteger(0);
+ final private YarnScheduler scheduler;
+ private AMTracker amTracker;
+ private ClientToAMSecretManager clientToAMSecretManager =
+ new ClientToAMSecretManager();
+ private final EventHandler eventHandler;
+ private final ApplicationTokenSecretManager applicationTokenSecretManager;
+ private final ASMContext asmContext;
+
+ public ApplicationsManagerImpl(ApplicationTokenSecretManager
+ applicationTokenSecretManager, YarnScheduler scheduler, ASMContext asmContext) {
+ super("ApplicationsManager");
+ this.scheduler = scheduler;
+ this.asmContext = asmContext;
+ this.eventHandler = this.asmContext.getDispatcher().getEventHandler();
+ this.applicationTokenSecretManager = applicationTokenSecretManager;
+ }
+
+
+ /**
+ * create a new am heart beat handler.
+ * @return create a new am heart beat handler.
+ */
+ protected AMTracker createNewAMTracker() {
+ return new AMTracker(this.asmContext);
+ }
+
+ /**
+ * Create a new scheduler negotiator.
+ * @param scheduler the scheduler
+ * @return scheduler negotiator that talks to the scheduler.
+ */
+ protected EventHandler<ASMEvent<SNEventType>> createNewSchedulerNegotiator(YarnScheduler scheduler) {
+ return new SchedulerNegotiator(this.asmContext, scheduler);
+ }
+
+ /**
+ * create a new application master launcher.
+ * @param tokenSecretManager the token manager for applications.
+ * @return {@link ApplicationMasterLauncher} responsible for launching
+ * application masters.
+ */
+ protected EventHandler<ASMEvent<AMLauncherEventType>> createNewApplicationMasterLauncher(
+ ApplicationTokenSecretManager tokenSecretManager) {
+ return new ApplicationMasterLauncher(tokenSecretManager,
+ this.clientToAMSecretManager, this.asmContext);
+ }
+
+ /**
+ * Add to service if a service object.
+ * @param object
+ */
+ protected void addIfService(Object object) {
+ if (object instanceof Service) {
+ addService((Service) object);
+ }
+ }
+
+ @Override
+ public synchronized void init(Configuration conf) {
+ addIfService(createNewApplicationMasterLauncher(applicationTokenSecretManager));
+ addIfService(createNewSchedulerNegotiator(scheduler));
+ this.amTracker = createNewAMTracker();
+ addIfService(amTracker);
+ super.init(conf);
+ }
+
+ @Override
+ public synchronized void start() {
+ super.start();
+ }
+
+ @Override
+ public synchronized ApplicationMaster getApplicationMaster(ApplicationID applicationId) {
+ ApplicationMaster appMaster =
+ amTracker.get(applicationId).getMaster();
+ return appMaster;
+ }
+
+ @Override
+ public ApplicationID getNewApplicationID() {
+ ApplicationID applicationId =
+ org.apache.hadoop.yarn.server.resourcemanager.resource.ApplicationID.create(
+ ResourceManager.clusterTimeStamp, applicationCounter.incrementAndGet());
+ LOG.info("Allocated new applicationId: " + applicationId.id);
+ return applicationId;
+ }
+
+ @Override
+ public synchronized void submitApplication(ApplicationSubmissionContext context)
+ throws IOException {
+ String user;
+ ApplicationID applicationId = context.applicationId;
+ String clientTokenStr = null;
+ try {
+ user = UserGroupInformation.getCurrentUser().getShortUserName();
+ if (UserGroupInformation.isSecurityEnabled()) {
+ Token<ApplicationTokenIdentifier> clientToken =
+ new Token<ApplicationTokenIdentifier>(
+ new ApplicationTokenIdentifier(applicationId),
+ this.clientToAMSecretManager);
+ clientTokenStr = clientToken.encodeToUrlString();
+ LOG.debug("Sending client token as " + clientTokenStr);
+ }
+ } catch (IOException e) {
+ LOG.info("Error in submitting application", e);
+ throw e;
+ }
+
+ context.queue =
+ (context.queue == null ? "default" : context.queue.toString());
+ context.applicationName =
+ (context.applicationName == null ? "N/A" : context.applicationName);
+
+ amTracker.addMaster(user, context, clientTokenStr);
+ // TODO this should happen via dispatcher. should move it out to scheudler
+ // negotiator.
+ scheduler.addApplication(applicationId, user,
+ (context.queue == null? "default" : context.queue.toString()),
+ context.priority);
+ /* schedule */
+ LOG.info("Application with id " + applicationId.id + " submitted by user " +
+ user + " with " + context);
+ }
+
+ @Override
+ public synchronized void finishApplicationMaster(ApplicationMaster applicationMaster)
+ throws IOException {
+ amTracker.finish(applicationMaster.applicationId);
+ }
+
+ @Override
+ public synchronized void finishApplication(ApplicationID applicationId)
+ throws IOException {
+ /* remove the applicaiton from the scheduler for now. Later scheduler should
+ * be a event handler of adding and cleaning up appications*/
+ scheduler.removeApplication(applicationId);
+ amTracker.kill(applicationId);
+ }
+
+ @Override
+ public synchronized void applicationHeartbeat(ApplicationStatus status)
+ throws IOException {
+ amTracker.heartBeat(status);
+ }
+
+ @Override
+ public synchronized void registerApplicationMaster(ApplicationMaster applicationMaster)
+ throws IOException {
+ amTracker.registerMaster(applicationMaster);
+ }
+
+ @Override
+ public synchronized List<AppContext> getAllApplications() {
+ return amTracker.getAllApplications();
+ }
+
+ public synchronized ApplicationMasterInfo getApplicationMasterInfo(ApplicationID
+ applicationId) {
+ return amTracker.get(applicationId);
+ }
+
+ static class AppImpl implements Application {
+ final ApplicationMaster am;
+ final String user;
+ final String queue;
+ final String name;
+
+ AppImpl(ApplicationMaster am, String user, String queue, String name) {
+ this.am = am;
+ this.user = user;
+ this.queue = queue;
+ this.name = name;
+ }
+
+ @Override public ApplicationID id() { return am.applicationId; }
+ @Override public CharSequence user() { return user; }
+ @Override public CharSequence name() { return name; }
+ @Override public CharSequence queue() { return queue; }
+ @Override public ApplicationStatus status() { return am.status; }
+ @Override public CharSequence master() { return am.host; }
+ @Override public int httpPort() { return am.httpPort; }
+ @Override public ApplicationState state() { return am.state; }
+ @Override public boolean isFinished() {
+ switch (am.state) {
+ case COMPLETED:
+ case FAILED:
+ case KILLED: return true;
+ }
+ return false;
+ }
+ }
+
+ @Override
+ public List<Application> getApplications() {
+ List<Application> apps = new ArrayList<Application>();
+ for (AppContext am: getAllApplications()) {
+ apps.add(new AppImpl(am.getMaster(),
+ am.getUser(), am.getQueue(), am.getName()));
+ }
+ return apps;
+ }
+
+ @Override
+ public Application getApplication(ApplicationID appID) {
+ ApplicationMasterInfo master = amTracker.get(appID);
+ return (master == null) ? null :
+ new AppImpl(master.getMaster(),
+ master.getUser(), master.getQueue(), master.getName());
+ }
+}
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/SchedulerNegotiator.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/SchedulerNegotiator.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/SchedulerNegotiator.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/SchedulerNegotiator.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,286 @@
+/**
+* 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.yarn.server.resourcemanager.applicationsmanager;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.yarn.ApplicationID;
+import org.apache.hadoop.yarn.ApplicationMaster;
+import org.apache.hadoop.yarn.ApplicationStatus;
+import org.apache.hadoop.yarn.ApplicationSubmissionContext;
+import org.apache.hadoop.yarn.Container;
+import org.apache.hadoop.yarn.Priority;
+import org.apache.hadoop.yarn.Resource;
+import org.apache.hadoop.yarn.ResourceRequest;
+import org.apache.hadoop.yarn.event.EventHandler;
+import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.ASMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.SNEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.YarnScheduler;
+import org.apache.hadoop.yarn.service.AbstractService;
+
+/**
+ * Negotiates with the scheduler for allocation of application master container.
+ *
+ */
+class SchedulerNegotiator extends AbstractService implements EventHandler<ASMEvent<SNEventType>> {
+
+ private static final Log LOG = LogFactory.getLog(SchedulerNegotiator.class);
+
+ final static Priority AM_CONTAINER_PRIORITY = new Priority();
+ static {
+ AM_CONTAINER_PRIORITY.priority = 0;
+ }
+ static final List<ResourceRequest> EMPTY_ASK =
+ new ArrayList<ResourceRequest>();
+ static final List<Container> EMPTY_RELEASE =
+ new ArrayList<Container>();
+
+ private final EventHandler handler;
+
+ private final SchedulerThread schedulerThread;
+ private final YarnScheduler scheduler;
+ private final List<AppContext> pendingApplications =
+ new ArrayList<AppContext>();
+
+ @SuppressWarnings("unchecked")
+ public SchedulerNegotiator(ASMContext context,
+ YarnScheduler scheduler) {
+ super("SchedulerNegotiator");
+ this.handler = context.getDispatcher().getEventHandler();
+ context.getDispatcher().register(SNEventType.class, this);
+ this.scheduler = scheduler;
+ this.schedulerThread = new SchedulerThread();
+ }
+
+ @Override
+ public synchronized void start() {
+ super.start();
+ schedulerThread.start();
+ }
+
+
+ @Override
+ public synchronized void stop() {
+ schedulerThread.shutdown();
+ try {
+ schedulerThread.join(1000);
+ } catch (InterruptedException ie) {
+ LOG.info(schedulerThread.getName() + " interrupted during join ", ie);
+ }
+
+ super.stop();
+ }
+
+ private class SchedulerThread extends Thread {
+ private volatile boolean shutdown = false;
+
+ public SchedulerThread() {
+ setName("ApplicationsManager:SchedulerThread");
+ setDaemon(true);
+ }
+
+ @Override
+ public void run() {
+ List<AppContext> toSubmit =
+ new ArrayList<AppContext>();
+ List<AppContext> submittedApplications =
+ new ArrayList<AppContext>();
+ while (!shutdown && !isInterrupted()) {
+ try {
+ toSubmit.addAll(getPendingApplications());
+ if (toSubmit.size() > 0) {
+ LOG.info("Got " + toSubmit.size() + " applications to submit");
+
+ submittedApplications.addAll(toSubmit);
+
+ for (AppContext masterInfo: toSubmit) {
+ // Register request for the ApplicationMaster container
+ ResourceRequest request =
+ org.apache.hadoop.yarn.server.resourcemanager.resource.ResourceRequest.create(
+ AM_CONTAINER_PRIORITY, "*", masterInfo.getResource(), 1);
+ // it ok to ignore the containers since we wont get any containers
+ // in the first call to allocate
+ LOG.debug("About to request resources for AM of " +
+ masterInfo.getMaster() + " required " + request);
+ scheduler.allocate(masterInfo.getMaster().applicationId,
+ Collections.singletonList(request),
+ EMPTY_RELEASE);
+ }
+ toSubmit.clear();
+ }
+
+ List<Container> containers = null;
+
+ for (Iterator<AppContext> it=submittedApplications.iterator();
+ it.hasNext();) {
+ AppContext masterInfo = it.next();
+ ApplicationID appId = masterInfo.getMaster().applicationId;
+ containers = scheduler.allocate(appId,
+ EMPTY_ASK, EMPTY_RELEASE);
+ if (!containers.isEmpty()) {
+ // there should be only one container for an application
+ assert(containers.size() == 1);
+ it.remove();
+ Container container = containers.get(0);
+
+ LOG.info("Found container " + container + " for AM of " +
+ masterInfo.getMaster());
+ SNAppContext snAppContext = new SNAppContext(masterInfo.getApplicationID(),
+ container);
+ handler.handle(new ASMEvent<ApplicationEventType>(
+ ApplicationEventType.ALLOCATED, snAppContext));
+ }
+ }
+
+ Thread.sleep(1000);
+ } catch(Exception e) {
+ LOG.info("Exception in submitting applications ", e);
+ }
+ }
+ }
+
+ /**
+ * shutdown the thread.
+ */
+ public void shutdown() {
+ shutdown = true;
+ interrupt();
+ }
+ }
+
+ private Collection<? extends AppContext> getPendingApplications() {
+ List<AppContext> pending = new ArrayList<AppContext>();
+ synchronized (pendingApplications) {
+ pending.addAll(pendingApplications);
+ pendingApplications.clear();
+ }
+ return pending;
+ }
+
+ private void addPending(AppContext masterInfo) {
+ LOG.info("Adding to pending " + masterInfo.getMaster());
+ synchronized(pendingApplications) {
+ pendingApplications.add(masterInfo);
+ }
+ }
+
+ @Override
+ public void handle(ASMEvent<SNEventType> appEvent) {
+ SNEventType event = appEvent.getType();
+ AppContext appContext = appEvent.getAppContext();
+ switch (event) {
+ case SCHEDULE:
+ addPending(appContext);
+ break;
+ case CLEANUP:
+ try {
+ finishApplication(appContext);
+ } catch (IOException ie) {
+ LOG.info("Error finishing application", ie);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ private void finishApplication(AppContext masterInfo)
+ throws IOException {
+ LOG.info("Finishing application: cleaning up container " +
+ masterInfo.getMasterContainer());
+ //TODO we should release the container but looks like we just
+ // wait for update from NodeManager
+ Container[] containers = new Container[] {masterInfo.getMasterContainer()};
+ scheduler.allocate(masterInfo.getMaster().applicationId,
+ EMPTY_ASK, Arrays.asList(containers));
+ }
+
+ private static class SNAppContext implements AppContext {
+ private final ApplicationID appID;
+ private final Container container;
+ private final UnsupportedOperationException notImplementedException;
+
+ public SNAppContext(ApplicationID appID, Container container) {
+ this.appID = appID;
+ this.container = container;
+ this.notImplementedException = new UnsupportedOperationException("Not Implemented");
+ }
+
+ @Override
+ public ApplicationSubmissionContext getSubmissionContext() {
+ throw notImplementedException;
+ }
+
+ @Override
+ public Resource getResource() {
+ throw notImplementedException;
+ }
+
+ @Override
+ public ApplicationID getApplicationID() {
+ return appID;
+ }
+
+ @Override
+ public ApplicationStatus getStatus() {
+ throw notImplementedException;
+ }
+
+ @Override
+ public ApplicationMaster getMaster() {
+ throw notImplementedException;
+ }
+
+ @Override
+ public Container getMasterContainer() {
+ return container;
+ }
+
+ @Override
+ public String getUser() {
+ throw notImplementedException;
+ }
+
+ @Override
+ public long getLastSeen() {
+ throw notImplementedException;
+ }
+
+ @Override
+ public String getName() {
+ throw notImplementedException;
+ }
+
+ @Override
+ public String getQueue() {
+ throw notImplementedException;
+ }
+ }
+}
\ No newline at end of file
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/SyncDispatcher.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/SyncDispatcher.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/SyncDispatcher.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/SyncDispatcher.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,132 @@
+/**
+* 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.yarn.server.resourcemanager.applicationsmanager;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.yarn.event.Dispatcher;
+import org.apache.hadoop.yarn.event.Event;
+import org.apache.hadoop.yarn.event.EventHandler;
+import org.apache.hadoop.yarn.service.AbstractService;
+
+
+public class SyncDispatcher extends AbstractService implements Dispatcher {
+ private Configuration conf;
+ private static final Log LOG = LogFactory.getLog(SyncDispatcher.class);
+ @SuppressWarnings("rawtypes")
+ private Map<Class<? extends Enum>, EventHandler> eventDispatchers =
+ new HashMap<Class<? extends Enum>, EventHandler>();
+
+
+ public SyncDispatcher() {
+ super("SyncDispatcher");
+ }
+
+ @Override
+ public void init(Configuration conf) {
+ this.conf = conf;
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public void register(Class<? extends Enum> eventType,
+ EventHandler handler) {
+ /* check to see if we have a listener registered */
+ @SuppressWarnings("unchecked")
+ EventHandler<Event> registeredHandler = (EventHandler<Event>)
+ eventDispatchers.get(eventType);
+ LOG.info("Registering " + eventType + " for " + handler.getClass());
+ if (registeredHandler == null) {
+ eventDispatchers.put(eventType, handler);
+ } else if (!(registeredHandler instanceof MultiListenerHandler)){
+ /* for multiple listeners of an event add the multiple listener handler */
+ MultiListenerHandler multiHandler = new MultiListenerHandler();
+ multiHandler.addHandler(registeredHandler);
+ multiHandler.addHandler(handler);
+ eventDispatchers.put(eventType, multiHandler);
+ } else {
+ /* already a multilistener, just add to it */
+ MultiListenerHandler multiHandler
+ = (MultiListenerHandler) registeredHandler;
+ multiHandler.addHandler(handler);
+ }
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public EventHandler<Event> getEventHandler() {
+ return new GenericEventHandler();
+ }
+
+ class GenericEventHandler implements EventHandler {
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void handle(Event event) {
+ if (!LOG.isDebugEnabled()) {
+ LOG.info("Dispatching event " + event);
+ }
+ Class<? extends Enum> type = event.getType().getDeclaringClass();
+
+ try{
+ EventHandler<Event> handler =
+ eventDispatchers.get(type);
+ if (handler == null)
+ throw new IllegalArgumentException("Invalid event " + event
+ + " no registered handler.");
+ handler.handle(event);
+ }
+ catch (Throwable t) {
+ LOG.fatal("Error in dispatcher", t);
+ //TODO fix the shutdown
+ }
+ }
+ }
+
+ /**
+ * Multiplexing an event. Sending it to different handlers that
+ * are interested in the event.
+ * @param <T> the type of event these multiple handlers are interested in.
+ */
+ @SuppressWarnings("rawtypes")
+ static class MultiListenerHandler implements EventHandler<Event> {
+ List<EventHandler<Event>> listofHandlers;
+
+ public MultiListenerHandler() {
+ listofHandlers = new ArrayList<EventHandler<Event>>();
+ }
+
+ @Override
+ public void handle(Event event) {
+ for (EventHandler<Event> handler: listofHandlers) {
+ handler.handle(event);
+ }
+ }
+
+ void addHandler(EventHandler<Event> handler) {
+ listofHandlers.add(handler);
+ }
+ }
+}
\ No newline at end of file
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ASMEvent.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ASMEvent.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ASMEvent.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ASMEvent.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,39 @@
+/**
+* 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.yarn.server.resourcemanager.applicationsmanager.events;
+
+import org.apache.hadoop.yarn.event.AbstractEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.AppContext;
+
+public class ASMEvent<T extends Enum<T>> extends AbstractEvent<T> {
+ private final AppContext context;
+
+ public ASMEvent(T type, AppContext context) {
+ super(type);
+ this.context = context;
+ }
+
+ /**
+ * return the application context.
+ * @return the application context for this event.
+ */
+ public AppContext getAppContext() {
+ return this.context;
+ }
+}
\ No newline at end of file
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationMasterEvents.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationMasterEvents.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationMasterEvents.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationMasterEvents.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,61 @@
+/**
+* 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.yarn.server.resourcemanager.applicationsmanager.events;
+
+import org.apache.hadoop.classification.InterfaceAudience.Private;
+import org.apache.hadoop.classification.InterfaceStability.Evolving;
+
+/**
+ * The events for application master that are generated within the applications
+ * manager.
+ */
+@Private
+@Evolving
+public class ApplicationMasterEvents {
+ public enum SNEventType {
+ SCHEDULE,
+ CLEANUP
+ };
+
+ public enum AMLauncherEventType {
+ LAUNCH,
+ CLEANUP
+ };
+
+ /* event generated for components tracking application adding/tracking/removal */
+ public enum ApplicationTrackerEventType {
+ ADD,
+ REMOVE
+ }
+
+ public enum ApplicationEventType {
+ ALLOCATE,
+ REGISTERED,
+ REMOVE,
+ STATUSUPDATE,
+ LAUNCH,
+ LAUNCHED,
+ FAILED,
+ ALLOCATED,
+ CLEANUP,
+ FINISH,
+ EXPIRE,
+ KILL
+ };
+}
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/ApplicationID.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/ApplicationID.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/ApplicationID.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/ApplicationID.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,51 @@
+/**
+* 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.yarn.server.resourcemanager.resource;
+
+public class ApplicationID {
+
+ public static org.apache.hadoop.yarn.ApplicationID create(long clusterTimeStamp,
+ int id) {
+ org.apache.hadoop.yarn.ApplicationID applicationId =
+ new org.apache.hadoop.yarn.ApplicationID();
+ applicationId.id = id;
+ applicationId.clusterTimeStamp = clusterTimeStamp;
+ return applicationId;
+ }
+
+ public static org.apache.hadoop.yarn.ApplicationID convert(long clustertimestamp,
+ CharSequence id) {
+ org.apache.hadoop.yarn.ApplicationID applicationId =
+ new org.apache.hadoop.yarn.ApplicationID();
+ applicationId.id = Integer.valueOf(id.toString());
+ applicationId.clusterTimeStamp = clustertimestamp;
+ return applicationId;
+ }
+
+ public static class Comparator
+ implements java.util.Comparator<org.apache.hadoop.yarn.ApplicationID> {
+
+ @Override
+ public int compare(org.apache.hadoop.yarn.ApplicationID a1,
+ org.apache.hadoop.yarn.ApplicationID a2) {
+ return a1.compareTo(a2);
+ }
+
+ }
+}
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/Container.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/Container.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/Container.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/Container.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,74 @@
+/**
+* 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.yarn.server.resourcemanager.resource;
+
+import org.apache.hadoop.yarn.ApplicationID;
+import org.apache.hadoop.yarn.ContainerID;
+import org.apache.hadoop.yarn.ContainerState;
+import org.apache.hadoop.yarn.Resource;
+
+public class Container {
+
+
+ private static ContainerID getNewContainerId(ApplicationID applicationId,
+ int containerId) {
+ ContainerID id = new ContainerID();
+ id.appID = applicationId;
+ id.id = containerId;
+ return id;
+ }
+
+ public static org.apache.hadoop.yarn.Container create(
+ org.apache.hadoop.yarn.Container c) {
+ org.apache.hadoop.yarn.Container container = new org.apache.hadoop.yarn.Container();
+ container.id = c.id;
+ container.hostName = c.hostName;
+ container.resource = c.resource;
+ container.state = c.state;
+ return container;
+ }
+
+ public static org.apache.hadoop.yarn.Container create(
+ ApplicationID applicationId, int containerId,
+ String hostName, Resource resource) {
+ ContainerID containerID = getNewContainerId(applicationId, containerId);
+ return create(containerID, hostName, resource);
+ }
+
+ public static org.apache.hadoop.yarn.Container create(
+ ContainerID containerId,
+ String hostName, Resource resource) {
+ org.apache.hadoop.yarn.Container container = new org.apache.hadoop.yarn.Container();
+ container.id = containerId;
+ container.hostName = hostName;
+ container.resource = resource;
+ container.state = ContainerState.INTIALIZING;
+ return container;
+ }
+
+ public static class Comparator
+ implements java.util.Comparator<org.apache.hadoop.yarn.Container> {
+
+ @Override
+ public int compare(org.apache.hadoop.yarn.Container c1,
+ org.apache.hadoop.yarn.Container c2) {
+ return c1.id.compareTo(c2.id);
+ }
+ }
+}
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/Priority.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/Priority.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/Priority.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/Priority.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,37 @@
+/**
+* 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.yarn.server.resourcemanager.resource;
+
+public class Priority {
+
+ public static org.apache.hadoop.yarn.Priority create(int prio) {
+ org.apache.hadoop.yarn.Priority priority = new org.apache.hadoop.yarn.Priority();
+ priority.priority = prio;
+ return priority;
+ }
+
+ public static class Comparator
+ implements java.util.Comparator<org.apache.hadoop.yarn.Priority> {
+ @Override
+ public int compare(org.apache.hadoop.yarn.Priority o1, org.apache.hadoop.yarn.Priority o2) {
+ return o1.priority - o2.priority;
+ }
+ }
+
+}
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/Resource.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/Resource.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/Resource.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/Resource.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,70 @@
+/**
+* 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.yarn.server.resourcemanager.resource;
+
+import org.apache.hadoop.classification.InterfaceAudience.Private;
+import org.apache.hadoop.classification.InterfaceStability.Evolving;
+
+@Private
+@Evolving
+public class Resource {
+
+ public static final org.apache.hadoop.yarn.Resource NONE = createResource(0);
+
+ public static org.apache.hadoop.yarn.Resource createResource(int memory) {
+ org.apache.hadoop.yarn.Resource resource = new org.apache.hadoop.yarn.Resource();
+ resource.memory = memory;
+ return resource;
+ }
+
+ public static void addResource(org.apache.hadoop.yarn.Resource lhs,
+ org.apache.hadoop.yarn.Resource rhs) {
+ lhs.memory += rhs.memory;
+ }
+
+ public static void subtractResource(org.apache.hadoop.yarn.Resource lhs,
+ org.apache.hadoop.yarn.Resource rhs) {
+ lhs.memory -= rhs.memory;
+ }
+
+ public static boolean equals(org.apache.hadoop.yarn.Resource lhs,
+ org.apache.hadoop.yarn.Resource rhs) {
+ return lhs.memory == rhs.memory;
+ }
+
+ public static boolean lessThan(org.apache.hadoop.yarn.Resource lhs,
+ org.apache.hadoop.yarn.Resource rhs) {
+ return lhs.memory < rhs.memory;
+ }
+
+ public static boolean lessThanOrEqual(org.apache.hadoop.yarn.Resource lhs,
+ org.apache.hadoop.yarn.Resource rhs) {
+ return lhs.memory <= rhs.memory;
+ }
+
+ public static boolean greaterThan(org.apache.hadoop.yarn.Resource lhs,
+ org.apache.hadoop.yarn.Resource rhs) {
+ return lhs.memory > rhs.memory;
+ }
+
+ public static boolean greaterThanOrEqual(org.apache.hadoop.yarn.Resource lhs,
+ org.apache.hadoop.yarn.Resource rhs) {
+ return lhs.memory >= rhs.memory;
+ }
+}
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/ResourceRequest.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/ResourceRequest.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/ResourceRequest.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/ResourceRequest.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,67 @@
+/**
+* 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.yarn.server.resourcemanager.resource;
+
+import org.apache.hadoop.yarn.Priority;
+
+public class ResourceRequest {
+
+ public static org.apache.hadoop.yarn.ResourceRequest create(
+ Priority priority, CharSequence hostName,
+ org.apache.hadoop.yarn.Resource capability, int numContainers) {
+ org.apache.hadoop.yarn.ResourceRequest request =
+ new org.apache.hadoop.yarn.ResourceRequest();
+ request.priority = priority;
+ request.hostName = hostName;
+ request.capability = capability;
+ request.numContainers = numContainers;
+ return request;
+ }
+
+ public static org.apache.hadoop.yarn.ResourceRequest create(
+ org.apache.hadoop.yarn.ResourceRequest r) {
+ org.apache.hadoop.yarn.ResourceRequest request =
+ new org.apache.hadoop.yarn.ResourceRequest();
+ request.priority = r.priority;
+ request.hostName = r.hostName;
+ request.capability = r.capability;
+ request.numContainers = r.numContainers;
+ return request;
+ }
+
+ public static class Comparator
+ implements java.util.Comparator<org.apache.hadoop.yarn.ResourceRequest> {
+ @Override
+ public int compare(org.apache.hadoop.yarn.ResourceRequest r1,
+ org.apache.hadoop.yarn.ResourceRequest r2) {
+
+ // Compare priority, host and capability
+ int ret = r1.priority.compareTo(r2.priority);
+ if (ret == 0) {
+ String h1 = r1.hostName.toString();
+ String h2 = r2.hostName.toString();
+ ret = h1.compareTo(h2);
+ }
+ if (ret == 0) {
+ ret = r1.capability.compareTo(r2.capability);
+ }
+ return ret;
+ }
+ }
+}
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/NodeInfo.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/NodeInfo.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/NodeInfo.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/NodeInfo.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,70 @@
+/**
+* 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.yarn.server.resourcemanager.resourcetracker;
+
+import org.apache.hadoop.net.Node;
+import org.apache.hadoop.yarn.NodeID;
+
+/**
+ * Node managers information on available resources
+ * and other static information.
+ *
+ */
+public interface NodeInfo {
+ /**
+ * the node id of of this node.
+ * @return the node id of this node.
+ */
+ public NodeID getNodeID();
+ /**
+ * the hostname for this node.
+ * @return the hostname for this node.
+ */
+ public String getHostName();
+ /**
+ * the total available resource.
+ * @return the total available resource.
+ */
+ public org.apache.hadoop.yarn.Resource getTotalCapability();
+ /**
+ * The rack name for this node manager.
+ * @return the rack name.
+ */
+ public String getRackName();
+ /**
+ * the {@link Node} information for this node.
+ * @return {@link Node} information for this node.
+ */
+ public Node getNode();
+ /**
+ * the available resource for this node.
+ * @return the available resource this node.
+ */
+ public org.apache.hadoop.yarn.Resource getAvailableResource();
+ /**
+ * used resource on this node.
+ * @return the used resource on this node.
+ */
+ public org.apache.hadoop.yarn.Resource getUsedResource();
+ /**
+ * The current number of containers for this node
+ * @return the number of containers
+ */
+ public int getNumContainers();
+ }
\ No newline at end of file
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/NodeInfoTracker.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/NodeInfoTracker.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/NodeInfoTracker.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/NodeInfoTracker.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,60 @@
+/**
+* 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.yarn.server.resourcemanager.resourcetracker;
+
+import org.apache.hadoop.yarn.HeartbeatResponse;
+import org.apache.hadoop.yarn.NodeStatus;
+
+/**
+ * Track the node info and heart beat responses for this node.
+ * This should be package private. It does not need to be public.
+ *
+ */
+class NodeInfoTracker {
+ private final NodeInfo node;
+ HeartbeatResponse lastHeartBeatResponse;
+ private NodeStatus nodeStatus = new NodeStatus();
+
+ public NodeInfoTracker(NodeInfo node, HeartbeatResponse lastHeartBeatResponse) {
+ this.node = node;
+ this.lastHeartBeatResponse = lastHeartBeatResponse;
+ this.nodeStatus.nodeId = node.getNodeID();
+ this.nodeStatus.lastSeen = System.currentTimeMillis();
+ }
+
+ public synchronized NodeInfo getNodeInfo() {
+ return this.node;
+ }
+
+ public synchronized HeartbeatResponse getLastHeartBeatResponse() {
+ return this.lastHeartBeatResponse;
+ }
+
+ public synchronized void refreshHeartBeatResponse(HeartbeatResponse heartBeatResponse) {
+ this.lastHeartBeatResponse = heartBeatResponse;
+ }
+
+ public synchronized void updateNodeStatus(NodeStatus nodeStatus) {
+ this.nodeStatus = nodeStatus;
+ }
+
+ public synchronized NodeStatus getNodeStatus() {
+ return this.nodeStatus;
+ }
+}
\ No newline at end of file
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/NodeStatus.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/NodeStatus.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/NodeStatus.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/NodeStatus.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,36 @@
+/**
+* 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.yarn.server.resourcemanager.resourcetracker;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.hadoop.yarn.Container;
+import org.apache.hadoop.yarn.NodeID;
+
+
+public class NodeStatus {
+ public static org.apache.hadoop.yarn.NodeStatus createNodeStatus(
+ NodeID nodeId, Map<CharSequence, List<Container>> containers) {
+ org.apache.hadoop.yarn.NodeStatus nodeStatus = new org.apache.hadoop.yarn.NodeStatus();
+ nodeStatus.nodeId = nodeId;
+ nodeStatus.containers = containers;
+ return nodeStatus;
+ }
+}
Added: hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/RMResourceTracker.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/RMResourceTracker.java?rev=1082677&view=auto
==============================================================================
--- hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/RMResourceTracker.java (added)
+++ hadoop/mapreduce/branches/MR-279/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resourcetracker/RMResourceTracker.java Thu Mar 17 20:21:13 2011
@@ -0,0 +1,32 @@
+/**
+* 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.yarn.server.resourcemanager.resourcetracker;
+
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceListener;
+import org.apache.hadoop.yarn.YarnClusterMetrics;
+
+/**
+ * The listener and read only interface to the
+ * rm resource tracker.
+ */
+public interface RMResourceTracker {
+ void register(ResourceListener listener);
+ void unregister(ResourceListener listener);
+ YarnClusterMetrics getClusterMetrics();
+}
\ No newline at end of file