diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/EventDest.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/EventDest.java new file mode 100644 index 0000000..e0abbcd --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/EventDest.java @@ -0,0 +1,24 @@ +package org.apache.hadoop.yarn.state; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +/** + * + * Annotation for Yarn Event Destination, used for generating + * event flow diagram. Refer {@link VisualizeEventFlow} + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface EventDest { + + /** + * + * @return The destination of event. Usually mean the class with state machine + * that handle this kind of event. + */ + Class value(); +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/EventSource.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/EventSource.java new file mode 100644 index 0000000..6590725 --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/EventSource.java @@ -0,0 +1,21 @@ +package org.apache.hadoop.yarn.state; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.lang.annotation.*; + + +/** + * + * Annotation for Yarn Event Source, used for generating + * event flow diagram. Refer {@link VisualizeEventFlow} + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface EventSource { + /** + * + * @return Source of events, source can be multiple. + */ + Class[] value(); +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/VisualizeEventFlow.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/VisualizeEventFlow.java new file mode 100644 index 0000000..b7886ce --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/VisualizeEventFlow.java @@ -0,0 +1,55 @@ +package org.apache.hadoop.yarn.state; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +public class VisualizeEventFlow { + + @SuppressWarnings("rawtypes") + public static Graph generateStateGraph(String name, List classNames) throws Exception { + Graph g = new Graph(name); + for (String className : classNames) { + Class clazz = Class.forName(className); + EventDest destAnnotation = + (EventDest) clazz.getAnnotation(EventDest.class); + Class dest = destAnnotation.value(); + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + EventSource source = field.getAnnotation(EventSource.class); + if (source != null) { + Class[] sourceClasses = source.value(); + for (Class sourceClass : sourceClasses) { + Graph.Node fromNode = g.getNode(sourceClass.getSimpleName()); + Graph.Node toNode = g.getNode(dest.getSimpleName()); + fromNode.addEdge(toNode, field.getName()); + } + } else { + if (!field.getName().equals("ENUM$VALUES")) { + System.out.println("warning, no source annotation for field:" + + field.getName()); + } + } + } + } + return g; + } + + public static void main(String [] args) throws Exception { + if (args.length < 3) { + System.err.printf("Usage: %s %n", + VisualizeEventFlow.class.getName()); + System.exit(1); + } + String [] classes = args[1].split(","); + ArrayList validClasses = new ArrayList(); + for (String c : classes) { + String vc = c.trim(); + if (vc.length()>0) { + validClasses.add(vc); + } + } + Graph g = generateStateGraph(args[0], validClasses); + g.save(args[2]); + } +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/application/ApplicationEventType.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/application/ApplicationEventType.java index b4ba76a..72b2f6b 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/application/ApplicationEventType.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/application/ApplicationEventType.java @@ -18,22 +18,39 @@ package org.apache.hadoop.yarn.server.nodemanager.containermanager.application; +import org.apache.hadoop.yarn.server.nodemanager.containermanager.ContainerManagerImpl; +import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerImpl; +import org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ResourceLocalizationService; +import org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation.LogAggregationService; +import org.apache.hadoop.yarn.state.EventDest; +import org.apache.hadoop.yarn.state.EventSource; + +@EventDest(ApplicationImpl.class) public enum ApplicationEventType { // Source: ContainerManager + @EventSource(ContainerManagerImpl.class) INIT_APPLICATION, + @EventSource(ContainerManagerImpl.class) INIT_CONTAINER, + @EventSource(ContainerManagerImpl.class) FINISH_APPLICATION, // Source: LogAggregationService if init fails // Source: ResourceLocalizationService + @EventSource(ResourceLocalizationService.class) APPLICATION_INITED, + @EventSource(ResourceLocalizationService.class) APPLICATION_RESOURCES_CLEANEDUP, // Source: Container + @EventSource(ContainerImpl.class) APPLICATION_CONTAINER_FINISHED, // Source: Log Handler + @EventSource(LogAggregationService.class) APPLICATION_LOG_HANDLING_INITED, + @EventSource(LogAggregationService.class) APPLICATION_LOG_HANDLING_FINISHED, + @EventSource(LogAggregationService.class) APPLICATION_LOG_HANDLING_FAILED }